Oorsig en objektiewe
Uit die boks, MOSS’ Inhoud Query Web Deel (CQWP) toon die resultate in 'n lys formaat, similar to search results. It is also possible to display the results in a grid format (d.w.z. HTML tabel formaat). Grid formats are better in some circumstances. I describe how to achieve that effect in this article.
Besigheid scenario
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, soos 'n titel, begroting, verwagte datum van voltooiing, remaining budget and other summary type fields. By "singleton" I mean a custom SharePoint list guaranteed to contain only one item. Simplistically, Dit lyk soos volg:
Die tegniese benadering is baie dieselfde soos beskryf hier (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 soos hierdie genereer, wat die resultaat:
|
<html>
<liggaam>
<sentrum>
<tafel grens= 1>
<!-- Labels ->
<tr bgcolor= Blou>
<td><is kleur= Wit><b>Naam van die projek</b></is></td>
<td lyn= Reg><is kleur= Wit><b>Volledige datum</b></is></td>
<td lyn= Reg><is kleur= Wit><b>Begroting</b></is></td>
<td lyn= Reg><is kleur= Wit><b>Werklike uitgawes</b></is></td>
<td><is kleur= Wit><b>Algemene status</b></is></td>
</tr>
<tr>
<td>Re-draad rekenaar kamer.</td>
<td lyn= Reg>02/01/08</td>
<td lyn= Reg>22,500.00</td>
<td lyn= Reg>19,000.00</td>
<td>Aan die gang</td>
</tr>
<tr>
<td>Voorsiening bedieners vir SQL Upgrade</td>
<td lyn= Reg>04/01/08</td>
<td lyn= Reg>7,500.00</td>
<td lyn= Reg>0.00</td>
<td>Beplande</td>
</tr>
</tafel>
</sentrum>
</liggaam>
</html>
|
Benadering
Volg hierdie stappe om die rooster te skep:
- Identifiseer die komponente van die rooster (rye / kolomme).
- Definieer en die skep van die nodige site kolomme.
- Skep sub terreine vir die projekte en Singleton lyste.
- Voeg die CQWP by 'n webblad en instel om dit te soek vir jou lyste.
- Verander die CQWP se XML in te samel om die bykomende kolomme.
- Verander die XSL 'n tafel te genereer.
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 hier (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) Heather Salomo se blog hier (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Boute en moere
Stappe een deur vyf soos per die MSDN dokumentasie en Heather Salomo se artikel te begin en te implementeer.
Op hierdie punt, jy het bygevoeg van jou CQWP na die bladsy en jy het jou <CommonViewFields> ingestel soos nodig.
Na aanleiding van die gewone stappe, Ek kry hierdie intermediêre resultate:
1. Skep 'n tipe inhoud, a templatized custom list for that content type and two sites. Here is the content type:
Hier is die site struktuur:
2. Voeg die CQWP na die skep van my projek subsites en Singleton projek opsommingslyste:
3. Voeg al die bykomende inligting wat ek wil via die <CommonViewFields>:
<eiendom naam="CommonViewFields" tipe="string">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</eiendom>
Let daarop dat ek moes al die velde van die eiendom op een lyn te hou, of dit sal nie werk nie (CQWP sal vir my sê dat die navraag geen items teruggekeer).
4. Op hierdie punt, 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 'n maat te skep / unghosted version of ItemStyle.xsl. I follow Heather’s advice, tot deur stap 11 en kry hierdie intermediêre resultate:
4.1: Noem my XSL sjabloon soos volg::
<xsl:template name = "Grid" ooreenstem met = "Ry[@Style=’Grid’]" mode = "itemstyle">
Ek het ook effens verander haar voorgestel <xsl:vir-elke …> deur die byvoeging van 'n <br /> tag 'n skoner lys te voorsien:
<xsl:vir-elke kies="@ *">
P:<xsl:waarde van kies="naam()" /><br/>
</xsl:vir-elke>
4.2: Ek verander die web deel, gaan na die voorkoms en kies my "Grid" styl:
Pas die verandering en hier is die resultaat:
Ons kan sien uit bogenoemde dat die lande wat ons wil (Projek naam, koste, status, ens.) 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. Byvoorbeeld, ons verwysing projek status as "Project_x005F_x0020_Name".
Op hierdie punt, vertrek ons van Heather se blog en van die skouers van die reuse, Ek voeg my eie bietjie.
ContentQueryMain.xsl
NOTA: Wanneer 'veranderings aan beide ContentQueryMain.xsl sowel as ItemStyle.xsl-, jy moet die lêers om terug in te gaan voor jy sien die effek van jou wysigings.
Vir rooster-up, 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 die "hoof" 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 <tafel> tag voor die afgee van die eerste ry van data en die sluitingsdatum <tafel> tag after emitting the last row. To accomplish this, ContentQueryMain.xsl verander twee parameters deur te gee aan ons "rooster" sjabloon in ItemStyle.xsl, "Laaste ry" and "current row". ItemStyle.xsl uses these to conditionally emit the necessary tags.
Met behulp van Heather Salomo se tegniek, we locate ContentQueryMain.xsl. It is located in the same place as ItemStyle.xsl. This screen shot should help:
Ons moet die volgende veranderinge aan te bring:
- Verander 'n xsl sjabloon, "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 <tafel> tags.
- Verander nog 'n bietjie van ContentQueryMain.xsl wat noem die "CallItemTemplate" dit 'n "LastRow om te slaag" parameter sodat LastRow gegee kan word aan ons Grid sjabloon.
Vind die sjabloon met die naam "OuterTemplate.CallItemTemplate" geïdentifiseer deur die tou:
<xsl:sjabloon naam="OuterTemplate.CallItemTemplate">
Vervang die hele sjabloon soos volg:
|
<xsl:sjabloon naam="OuterTemplate.CallItemTemplate">
<xsl:stop naam="CurPosition" />
<!--
Voeg die "LastRow-" parameter.
Ons gebruik dit net wanneer die item styl pas in "Grid".
-->
<xsl:stop naam="LastRow" />
<xsl:kies>
<xsl:toe toets="@ Style = 'NewsRollUpItem "">
<xsl:pas-templates kies="." af="itemstyle">
<xsl:met-param naam="Edit mode" kies="$cbq_iseditmode" />
</xsl:pas-templates>
</xsl:toe>
<xsl:toe toets="@ Style = 'NewsBigItem "">
<xsl:pas-templates kies="." af="itemstyle">
<xsl:met-param naam="CurPos" kies="$CurPosition" />
</xsl:pas-templates>
</xsl:toe>
<xsl:toe toets="@ Style = 'NewsCategoryItem "">
<xsl:pas-templates kies="." af="itemstyle">
<xsl:met-param naam="CurPos" kies="$CurPosition" />
</xsl:pas-templates>
</xsl:toe>
<!--
Slaag huidige posisie en lastrow tot die netwerk itemstyle.xsl sjabloon.
ItemStyle.xsl sal gebruik om die oop en toemaak vry te stel <tafel> tags.
-->
<xsl:toe toets="@ Style = "Grid"">
<xsl:pas-templates kies="." af="itemstyle">
<xsl:met-param naam="CurPos" kies="$CurPosition" />
<xsl:met-param naam="Laaste" kies="$LastRow" />
</xsl:pas-templates>
</xsl:toe>
<xsl:anders>
<xsl:pas-templates kies="." af="itemstyle">
</xsl:pas-templates>
</xsl:anders>
</xsl:kies>
</xsl:sjabloon>
|
Die kommentaar beskryf die doel van die veranderinge.
Natuurlik, die "OuterTemplate.CallItemTemplate-" is itself called from another template. Locate that template by searching for this text string:
<xsl:sjabloon naam="OuterTemplate.Body">
Blaai deur die instruksies in OuterTemplate.Body word en voeg die LastRow parameter soos volg (wat as 'n kommentaar in kursief):
<xsl:call-template naam="OuterTemplate.CallItemTemplate">
<xsl:met-param naam="CurPosition" kies="$CurPosition" />
<!-- Plaas die LastRow parameter. -->
<xsl:met-param naam="LastRow" kies="$LastRow"/>
</xsl:call-template>
Na al hierdie, ons uiteindelik het dinge behoorlik opgestel sodat ons ItemStyle.xsl kan uitstraal <tafel> tags op die regte plek.
ItemStyle.Xsl
NOTA: Weer, kyk na die maak van enige veranderinge in ItemStyle.xsl sodat jy sien die effek van hierdie veranderinge.
Ons het twee take hier:
- Replace the entire Grid template. You can copy/paste from below.
- Voeg 'n bietjie Mumbo Jumbo buite die sjabloon definisie wat dit moontlik maak om "formatcurrency" template to work. (Jy kan jou vertel dat ek 'n vaag hanteer op XSL).
Eerste, naby die top van ItemStyle.xsl, voeg hierdie lyn:
<!-- Sommige Mumbo Jumbo wat ons in staat stel om U.S te vertoon. geldeenheid. -->
<xsl:desimale-formaat naam="personeel" syfer="D" />
<xsl:sjabloon naam="Default" ooreenstem met="*" af="itemstyle">
Let daarop dat ek dit direk voor die bygevoeg <xsl:template name = "Default" …> definisie.
Volgende, go back to our Grid template. Replace the entire Grid template with the code below. It is thoroughly commented, maar nie huiwer om my te e-pos of kommentaar op my blog verlaat as jy vrae het.
|
<xsl:sjabloon naam="Grid" ooreenstem met="Ry[@ Style = "Grid"]" af="itemstyle">
<!--
ContentMain.xsl gaan CurPos en die laaste.
Ons gebruik hierdie voorwaardelik stoot die oop en toemaak <tafel> tags.
-->
<xsl:stop naam="CurPos" />
<xsl:stop naam="Laaste" />
<!-- Die volgende veranderlikes is onveranderd van die standaard ItemStyle.xsl -->
<xsl:veranderlike naam="SafeImageUrl">
<xsl:call-template naam="OuterTemplate.GetSafeStaticUrl">
<xsl:met-param naam="UrlColumnName" kies="'ImageUrl ""/>
</xsl:call-template>
</xsl:veranderlike>
<xsl:veranderlike naam="SafeLinkUrl">
<xsl:call-template naam="OuterTemplate.GetSafeLink">
<xsl:met-param naam="UrlColumnName" kies="'LinkUrl ""/>
</xsl:call-template>
</xsl:veranderlike>
<xsl:veranderlike naam="Display">
<xsl:call-template naam="OuterTemplate.GetTitle">
<xsl:met-param naam="Titel" kies="@ Titel"/>
<xsl:met-param naam="UrlColumnName" kies="'LinkUrl ""/>
</xsl:call-template>
</xsl:veranderlike>
<xsl:veranderlike naam="LinkTarget">
<xsl:indien toets="@ OpenInNewWindow = 'waar'" >_blank</xsl:indien>
</xsl:veranderlike>
<!--
Hier het ons definieer 'n veranderlike, "TableStart". Dit bevat die HTML
. Let daarop dat as CurPos = 1, Dit sluit in die HTML in 'n CDATA tag.
Anders, dit sal leeg wees.
Die waarde van tableStart emited elke keer ItemStyle genoem word via
.
-->
<xsl:veranderlike naam="tableStart">
<xsl:indien toets="$CurPos = 1">
<![CDATA[
<tafel grens = 1>
<tr bgcolor = "blou">
<td><font color = "wit"><b>Naam van die projek</b></is></td>
<td align = "regte"><font color = "wit"><b>Volledige datum</b></is></td>
<td align = "regte"><font color = "wit"><b>Begroting</b></is></td>
<td align = "regte"><font color = "wit"><b>Werklike uitgawes</b></is></td>
<td><font color = "wit"><b>Algemene status</b></is></td>
</tr>
]]>
</xsl:indien>
</xsl:veranderlike>
<!--
'N ander veranderlike, tableEnd definieer eenvoudig die sluiting tafel tag.
Soos met tableStart, dit altyd emited nie. Dit is waarom die waarde daarvan
.
-->
<xsl:veranderlike naam="tableEnd">
<xsl:indien toets="$CurPos = $ Laaste">
<![CDATA[ </tafel> ]]>
</xsl:indien>
</xsl:veranderlike>
<!--
Uitstraal altyd die inhoud van tableStart. As dit is nie die eerste
, dan weet ons die waarde daarvan
.
Uitset ontsnap afskakel omdat wanneer tableStart dit nie leeg is, dit
. As
, dit sal genereer&Dit;tafel>" in plaas van "<tafel>".
-->
<xsl:waarde van kies="$tableStart" skakel-uitset-ontsnap="ja"/>
<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:waarde van kies="@ Project_x005F_x0020_Name"/>
</td>
<td lyn="reg">
<xsl:waarde van kies="@ Project_x005F_x0020_End_x005F_x0020_Date"/>
</td>
<td lyn="reg">
<xsl:call-template naam="formatCurrency">
<xsl:met-param naam="waarde" kies="@ Project_x005F_x0020_Budget"></xsl:met-param>
</xsl:call-template>
</td>
<td lyn="reg">
<xsl:call-template naam="formatCurrency">
<xsl:met-param naam="waarde" kies="@ Project_x005F_x0020_Expenses"> </xsl:met-param>
</xsl:call-template>
</td>
<td>
<xsl:waarde van kies="@ Project_x005F_x0020_Status"/>
</td>
<!--
Al van die volgende word gedraai om dinge te verduidelik.
Egter, bring dit terug en stop dit in 'n <td> sy om te sien
.
-->
<!--
<div id = "linkitem" class = "item">
<xsl:indien toets = "string-lengte($SafeImageUrl) != 0 ">
<div class = "SafeImageUrleft">
<a href = "{$SafeLinkUrl}" target = "{$LinkTarget}">
<img klas = "image-vaste-wydte" src = "{$SafeImageUrl}" alt = "{@ ImageUrlAltText}"/>
</1>
</Div>
</xsl:indien>
<div class="link-item">
<xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<a href = "{$SafeLinkUrl}" target = "{$LinkTarget}" title = "{@ LinkToolTip}">
<xsl:waarde van kies = "$ Display" />
</1>
<div class = "Beskrywing">
<xsl:waarde van uitgesoekte = "@ Description" />
</Div>
</Div>
</Div>
-->
</tr>
<!--
Stoot die sluiting tafel tag. As ons nie op die laaste ry,
dit sal leeg.
-->
<xsl:waarde van kies="$tableEnd" skakel-uitset-ontsnap="ja"/>
</xsl:sjabloon>
<xsl:sjabloon naam="formatCurrency">
<xsl:stop naam="waarde" kies="0" />
<xsl:waarde van kies="formaat-nommer($waarde, "$ DDD,DDD,DDD.DD ", "Personeel")" />
</xsl:sjabloon>
|