მიმოხილვა და მიზანი
იმ ყუთში, Moss’ ინფორმაციის შეკითხვის ვებ ნაწილი (CQWP) მონიტორები მისი შედეგები სიაში ფორმატში, similar to search results. It is also possible to display the results in a grid format (i.e. HTML მაგიდის ფორმატში). Grid formats are better in some circumstances. I describe how to achieve that effect in this article.
ბიზნეს სცენარი
I have worked with a client on an enterprise-wide MOSS rollout. We have designed their taxonomy such that projects are first class citizens in the hierarchy and have their own top level site. Project managers maintain a singleton list of project summary information, როგორიცაა სათაური, ბიუჯეტი, მოსალოდნელია დასრულების თარიღი, remaining budget and other summary type fields. By "singleton" I mean a custom SharePoint list guaranteed to contain only one item. Simplistically, როგორც ჩანს, ამ:
ტექნიკური მიდგომა ბევრად იგივე, როგორც ეს აღწერილია აქ (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). The CQWP uses an XSL transform to emit HTML for the browser to render.
I always envision the result before diving into the XSL because XSL is a nightmare. Here’s my desired result:
HTML მსგავსი ქმნის, რომ შედეგი:
|
<html>
<სხეულის>
<ცენტრი>
<მაგიდა სასაზღვრო= 1>
<!-- Labels ->
<tr bgcolor= Blue>
<td><font ფერი= თეთრი><ბ>პროექტის დასახელება</ბ></font></td>
<td უერთდებიან= უფლება><font ფერი= თეთრი><ბ>დასრულება თარიღი</ბ></font></td>
<td უერთდებიან= უფლება><font ფერი= თეთრი><ბ>ბიუჯეტი</ბ></font></td>
<td უერთდებიან= უფლება><font ფერი= თეთრი><ბ>ფაქტობრივი ხარჯი</ბ></font></td>
<td><font ფერი= თეთრი><ბ>სრული სტატუსი</ბ></font></td>
</tr>
<tr>
<td>ხელახალი მავთულები კომპიუტერული ოთახი.</td>
<td უერთდებიან= უფლება>02/01/08</td>
<td უერთდებიან= უფლება>22,500.00</td>
<td უერთდებიან= უფლება>19,000.00</td>
<td>გრძელდება</td>
</tr>
<tr>
<td>დებულება სერვერებზე SQL განახლება</td>
<td უერთდებიან= უფლება>04/01/08</td>
<td უერთდებიან= უფლება>7,500.00</td>
<td უერთდებიან= უფლება>0.00</td>
<td>იგეგმება</td>
</tr>
</მაგიდა>
</ცენტრი>
</სხეულის>
</html>
|
მიდგომა
დაიცავით ამ ნაბიჯებს, რათა შეიქმნას ქსელის:
- იდენტიფიცირება კომპონენტების ქსელის (რიგები / სვეტები).
- განსაზღვრავს და შექმნას აუცილებელი საიტი სვეტები.
- შექმენით ქვე საიტები პროექტები და სინგლეტონი სიები.
- დამატება CQWP რომ ვებ გვერდზე და კონფიგურირება მოძიება შენი სიები.
- შეცვლა CQWP-ს XML შეგროვება up დამატებითი სვეტები.
- შეცვლა XSL წარმოქმნის მაგიდა.
I’m going to concentrate on number six. Numbers one through four are straight-forward and something that any CQWP user has already done. Number five has been well-documented by others including this exhaustive screen-shot laden article from MSDN აქ (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) და Heather სოლომონის წაკითხვა აქ (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
კაკალი და ჭანჭიკები
დასაწყისი და გადადგას ნაბიჯები, ერთი მეშვეობით ხუთი მიხედვით MSDN დოკუმენტაცია და Heather სოლომონ სტატია.
ამ ეტაპზე, თქვენ დაემატა თქვენს CQWP გვერდზე და თქვენ თქვენი <CommonViewFields> კონფიგურაცია, როგორც საჭიროა.
შემდეგ ჩვეულ ნაბიჯები, მე ამ შუალედური შედეგები:
1. შექმნა ინფორმაციის ტიპი, a templatized custom list for that content type and two sites. Here is the content type:
აქ არის საიტი სტრუქტურა:
2. დამატება CQWP შექმნის შემდეგ ჩემი პროექტი subsites და სინგლეტონი პროექტის შემაჯამებელი სიები:
3. დამატება დამატებითი ინფორმაცია მინდა მეშვეობით <CommonViewFields>:
<ქონების სახელი="CommonViewFields" ტიპის="სიმებიანი">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</ქონების>
შენიშვნა, რომ უნდა შევინარჩუნოთ ყველა ქონების სფეროები ერთ ხაზს, ან საერთოდ არ იმუშავებს (CQWP რომ მითხრა, რომ შეკითხვის დაბრუნდა არ არის პროდუქცია).
4. ამ ეტაპზე, we’re ready to move beyond the MSDN article and flip on over to Heather Solomon’s article. Follow her steps starting near step #5 რათა შეიქმნას ადრინდელს / unghosted version of ItemStyle.xsl. I follow Heather’s advice, მდე მეშვეობით ნაბიჯი 11 და მიიღოს ამ შუალედური შედეგები:
4.1: დაარქვით ჩემს XSL template შემდეგი რედაქციით:
<XSL:template name="Grid" match="Row[@Style=’Grid’]" mode="itemstyle">
მე ასევე ოდნავ შეცვალოს მისი ვარაუდით <XSL:for-თითოეული …> დამატებით <br /> tag უზრუნველყოს სუფთა ჩამონათვალი:
<XSL:for-თითოეული შერჩევა="@ *">
P:<XSL:ღირებულების შესახებ შერჩევა="სახელი()" /><br/>
</XSL:for-თითოეული>
4.2: შევცვალო ვებ ნაწილი, go to appearance and select my "Grid" სტილი:
მიმართვა ცვლილება და აი, შედეგიც:
ჩვენ ვხედავთ, ზემოთ რომ სფეროებში ჩვენ გვინდა (პროექტის დასახელება, ხარჯზე, სტატუსი, და ა.შ.) are available for us to use when we emit the HTML. Not only that, but we see the names by which we must reference those columns in the XSL. მაგალითად, we reference Project Status as "Project_x005F_x0020_Name".
ამ ეტაპზე, ჩვენ დატოვება Heather ს ბლოგი და shoulders ამ გიგანტი, მე დამატება ჩემი საკუთარი ცოტა.
ContentQueryMain.xsl
შენიშვნა: როდესაც ცვლილებების ორივე ContentQueryMain.xsl აგრეთვე ItemStyle.xsl, თქვენ უნდა შეამოწმოს იმ ფაილებს უკან ადრე ხედავთ ეფექტი თქვენი ცვლილებები.
იყიდება ქსელის მიღების მიზნით, MOSS uses two different XSL files to produce the results we see from a CQWP. To generate the previous bit of output, we modified ItemStyle.xsl. MOSS actually uses another XSL file, ContentQueryMain.xsl to in conjunction with ItemStyle.xsl to generate its HTML. As its name implies, ContentQueryMain.xsl is the "main" XSL that controls the overall flow of translation. It iterates through all the found items and passes them one by one to templates in ItemStyle.xsl. We’ll modify ItemStyle.xsl to generate the open <მაგიდა> tag ადრე ასხივებენ პირველი რიგის მონაცემები და დახურვის <მაგიდა> tag after emitting the last row. To accomplish this, ContentQueryMain.xsl is modified to pass two parameters to our "grid" template in ItemStyle.xsl, "last row" and "current row". ItemStyle.xsl uses these to conditionally emit the necessary tags.
გამოყენება Heather სოლომონ ტექნიკურად, we locate ContentQueryMain.xsl. It is located in the same place as ItemStyle.xsl. This screen shot should help:
ჩვენ უნდა მოვახერხოთ, შემდეგი სახის ცვლილებები:
- შეცვლა XSL template, "CallItemTemplate" that actually invokes our Grid template in ItemStyle.xsl. We will pass two parameters to the Grid template so that it will have the data it needs to conditionally generate opening and closing <მაგიდა> tags.
- Modify another bit of ContentQueryMain.xsl that calls the "CallItemTemplate" to pass it a "LastRow" პარამეტრების ისე, რომ LastRow შეიძლება გადაეცემა ჩვენი ქსელის შაბლონი.
Locate the template named "OuterTemplate.CallItemTemplate" განსაზღვრული სიმებიანი:
<XSL:template სახელი="OuterTemplate.CallItemTemplate">
ჩანაცვლება მთელი template შემდეგი რედაქციით:
|
<XSL:template სახელი="OuterTemplate.CallItemTemplate">
<XSL:შეჩერება სახელი="CurPosition" />
<!--
Add the "LastRow" პარამეტრების.
We only use it when the item style pass in is "Grid".
-->
<XSL:შეჩერება სახელი="LastRow" />
<XSL:აირჩიოს>
<XSL:როდესაც ტესტი="@ სტილი = 'NewsRollUpItem "">
<XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
<XSL:with-param სახელი="EditMode" შერჩევა="$cbq_iseditmode" />
</XSL:ვრცელდება-თარგები>
</XSL:როდესაც>
<XSL:როდესაც ტესტი="@ სტილი = 'NewsBigItem "">
<XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
<XSL:with-param სახელი="CurPos" შერჩევა="$CurPosition" />
</XSL:ვრცელდება-თარგები>
</XSL:როდესაც>
<XSL:როდესაც ტესტი="@ სტილი = 'NewsCategoryItem "">
<XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
<XSL:with-param სახელი="CurPos" შერჩევა="$CurPosition" />
</XSL:ვრცელდება-თარგები>
</XSL:როდესაც>
<!--
უღელტეხილის მიმდინარე პოზიცია და lastrow to Grid itemstyle.xsl template.
ItemStyle.xsl გამოიყენებს, რომ გადასცემს ღია და დახურვის <მაგიდა> tags.
-->
<XSL:როდესაც ტესტი="@ სტილი = 'Grid "">
<XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
<XSL:with-param სახელი="CurPos" შერჩევა="$CurPosition" />
<XSL:with-param სახელი="ბოლო" შერჩევა="$LastRow" />
</XSL:ვრცელდება-თარგები>
</XSL:როდესაც>
<XSL:წინააღმდეგ შემთხვევაში>
<XSL:ვრცელდება-თარგები შერჩევა="." რეჟიმი="itemstyle">
</XSL:ვრცელდება-თარგები>
</XSL:წინააღმდეგ შემთხვევაში>
</XSL:აირჩიოს>
</XSL:template>
|
კომენტარები აღწერს მიზნით ცვლილებები.
რა თქმა უნდა, the "OuterTemplate.CallItemTemplate" is itself called from another template. Locate that template by searching for this text string:
<XSL:template სახელი="OuterTemplate.Body">
გადახვევა მეშვეობით ინსტრუქციები OuterTemplate.Body და ჩადეთ LastRow პარამეტრების შემდეგი რედაქციით (ნაჩვენებია კომენტარის კურსივით):
<XSL:ზარის template სახელი="OuterTemplate.CallItemTemplate">
<XSL:with-param სახელი="CurPosition" შერჩევა="$CurPosition" />
<!-- ჩადეთ LastRow პარამეტრების. -->
<XSL:with-param სახელი="LastRow" შერჩევა="$LastRow"/>
</XSL:ზარის template>
მას შემდეგ, რაც ეს ყველაფერი, ჩვენ საბოლოოდ არ რამ შეიქმნა სათანადოდ ისე, რომ ჩვენი ItemStyle.xsl შეიძლება გადასცემს <მაგიდა> tags at უფლება ადგილი.
ItemStyle.Xsl
შენიშვნა: ისევ, შემოწმება ItemStyle.xsl მიღების შემდეგ რაიმე ცვლილება ისე, რომ ხედავთ ეფექტი ის ცვლილებები.
ჩვენ გვყავს ორი ამოცანა აქ:
- Replace the entire Grid template. You can copy/paste from below.
- Add some mumbo jumbo outside the template definition that enables "formatcurrency" template to work. (თქვენ შეგიძლიათ თქვათ, რომ მე tenuous სახელური XSL).
პირველი, უახლოეს დაბრუნება of ItemStyle.xsl, დაამატოთ ეს ხაზი:
<!-- ზოგიერთი mumbo jumbo, რომელიც საშუალებას გვაძლევს ცარიელია U.S. ვალუტის. -->
<XSL:ათობითი ფორმატის სახელი="პერსონალის" ციფრი="D" />
<XSL:template სახელი="სტანდარტული" ემთხვევა="*" რეჟიმი="itemstyle">
შენიშვნა, რომ მე დასძინა, რომ უშუალოდ <XSL:template name="Default" …> definition.
შემდეგი, go back to our Grid template. Replace the entire Grid template with the code below. It is thoroughly commented, but don’t hesitate to email me or leave comments on my blog if you have questions.
|
<XSL:template სახელი="Grid" ემთხვევა="Row[@ სტილი = 'Grid "]" რეჟიმი="itemstyle">
<!--
ContentMain.xsl passes CurPos and Last.
We use these to conditionally emit the open and closing <მაგიდა> tags.
-->
<XSL:შეჩერება სახელი="CurPos" />
<XSL:შეჩერება სახელი="ბოლო" />
<!-- The following variables are unmodified from the standard ItemStyle.xsl -->
<XSL:ცვლადი სახელი="SafeImageUrl">
<XSL:ზარის template სახელი="OuterTemplate.GetSafeStaticUrl">
<XSL:with-param სახელი="UrlColumnName" შერჩევა="'ImageUrl'"/>
</XSL:ზარის template>
</XSL:ცვლადი>
<XSL:ცვლადი სახელი="SafeLinkUrl">
<XSL:ზარის template სახელი="OuterTemplate.GetSafeLink">
<XSL:with-param სახელი="UrlColumnName" შერჩევა="'LinkUrl'"/>
</XSL:ზარის template>
</XSL:ცვლადი>
<XSL:ცვლადი სახელი="DisplayTitle">
<XSL:ზარის template სახელი="OuterTemplate.GetTitle">
<XSL:with-param სახელი="სათაური" შერჩევა="@Title"/>
<XSL:with-param სახელი="UrlColumnName" შერჩევა="'LinkUrl'"/>
</XSL:ზარის template>
</XSL:ცვლადი>
<XSL:ცვლადი სახელი="LinkTarget">
<XSL:თუ ტესტი="@OpenInNewWindow = 'True'" >_blank</XSL:თუ>
</XSL:ცვლადი>
<!--
Here we define a variable, "tableStart". This contains the HTML
that we use to define the opening of the table as well as the column
labels. Note that if CurPos = 1, it includes the HTML in a CDATA tag.
Otherwise, it will be empty.
The value of tableStart is emited every time ItemStyle is called via
ContentQueryMain.xsl.
-->
<XSL:ცვლადი სახელი="tableStart">
<XSL:თუ ტესტი="$CurPos = 1">
<![CDATA[
<table border=1>
<tr bgcolor="blue">
<td><font color="white"><ბ>პროექტის დასახელება</ბ></font></td>
<td align="right"><font color="white"><ბ>დასრულება თარიღი</ბ></font></td>
<td align="right"><font color="white"><ბ>ბიუჯეტი</ბ></font></td>
<td align="right"><font color="white"><ბ>ფაქტობრივი ხარჯი</ბ></font></td>
<td><font color="white"><ბ>სრული სტატუსი</ბ></font></td>
</tr>
]]>
</XSL:თუ>
</XSL:ცვლადი>
<!--
Another variable, tableEnd simply defines the closing table tag.
As with tableStart, it's always emited. This is why its value is
assigned conditionally based upon whether we've been passed the last
row by ContentQueryMain.xsl.
-->
<XSL:ცვლადი სახელი="tableEnd">
<XSL:თუ ტესტი="$CurPos = $Last">
<![CDATA[ </მაგიდა> ]]>
</XSL:თუ>
</XSL:ცვლადი>
<!--
Always emit the contents of tableStart. If this is not the first
row passed to us by ContentQueryMain.xsl, then we know its value
will be blank.
Disable output escaping because when tableStart it not blank, ეს
. თუ
, it will generate
stuff like "&ლ;მაგიდა>" instead of "<მაგიდა>".
-->
<XSL:ღირებულების შესახებ შერჩევა="$tableStart" გაუქმდება და გამოშვების-აფარებს="დიახ"/>
<tr>
<!--
P:Project_x005F_x0020_Name
:Project_x005F_x0020_End_x005F_x0020_Date
:Project_x005F_x0020_Budget
:Project_x005F_x0020_Expenses
:Project_x005F_x0020_Status
-->
<td>
<XSL:ღირებულების შესახებ შერჩევა="@ Project_x005F_x0020_Name"/>
</td>
<td უერთდებიან="უფლება">
<XSL:ღირებულების შესახებ შერჩევა="@ Project_x005F_x0020_End_x005F_x0020_Date"/>
</td>
<td უერთდებიან="უფლება">
<XSL:ზარის template სახელი="formatcurrency">
<XSL:with-param სახელი="ღირებულება" შერჩევა="@ Project_x005F_x0020_Budget"></XSL:with-param>
</XSL:ზარის template>
</td>
<td უერთდებიან="უფლება">
<XSL:ზარის template სახელი="formatcurrency">
<XSL:with-param სახელი="ღირებულება" შერჩევა="@ Project_x005F_x0020_Expenses"> </XSL:with-param>
</XSL:ზარის template>
</td>
<td>
<XSL:ღირებულების შესახებ შერჩევა="@ Project_x005F_x0020_Status"/>
</td>
<!--
ყველა ქვემოთ კომენტარში აღნიშნავს, რომ ნათელი რამ.
თუმცა, მოუტანს მას უკან და პერსონალი მას <td> სანახავად მისი
.
-->
<!--
<div id="linkitem" class="item">
<XSL:if test="string-length($SafeImageUrl) != 0">
<div class="image-area-left">
<a href="{$SafeLinkUrl}" target="{$LinkTarget}">
<img class="image-fixed-width" src="{$SafeImageUrl}" alt="{@ ImageUrlAltText}"/>
</a>
</div>
</XSL:თუ>
<div class="link-item">
<XSL:ზარის template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<a href="{$SafeLinkUrl}" target="{$LinkTarget}" title="{@ LinkToolTip}">
<XSL:value-of select="$DisplayTitle"/>
</a>
<div class="description">
<XSL:value-of select="@Description" />
</div>
</div>
</div>
-->
</tr>
<!--
გადასცემს დახურვის მაგიდა tag. თუ ჩვენ არ ვართ ბოლო ზედიზედ,
ეს იქნება ცარიელი.
-->
<XSL:ღირებულების შესახებ შერჩევა="$tableEnd" გაუქმდება და გამოშვების-აფარებს="დიახ"/>
</XSL:template>
<XSL:template სახელი="formatcurrency">
<XSL:შეჩერება სახელი="ღირებულება" შერჩევა="0" />
<XSL:ღირებულების შესახებ შერჩევა='ფორმატი ნომერი($ღირებულება, "$DDD,DDD,DDD.DD", "staff")' />
</XSL:template>
|