Overzicht en doelstelling
Out of the box, MOSS’ Webonderdeel Inhoudsquery (CQWP) de resultaten worden in een lijstindeling weergegeven, vergelijkbaar met zoekresultaten. Het is ook mogelijk om de resultaten in een grid-formaat weergeven (dwz. HTML-tabelindeling). Raster formaten zijn beter in bepaalde omstandigheden. Beschrijf ik hoe om te bereiken dat effect in dit artikel.
Bedrijfsscenario
Ik heb gewerkt met een cliënt op de uitrol van een ondernemingsbreed MOSS. Wij hebben hun taxonomie ontworpen zodanig dat projecten eerste klassenburgers in de hiërarchie zijn en hun eigen site van het hoogste niveau hebben. Projectmanagers handhaven een singleton lijst van projectsamenvattingsgegevens, zoals de titel van, begroting, verwachte Voltooiingsdatum, resterende begroting en andere velden resumétype. Door "singleton" Ik bedoel een aangepaste SharePoint-lijst gegarandeerd bevatten slechts één item. Simplistisch, het ziet er als volgt:
De technische aanpak is veel hetzelfde als beschreven Hier (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). De CQWP maakt gebruik van een XSL-transformatie voor het uitzenden van HTML voor de browser weer te geven.
Ik altijd het resultaat voordat duiken in de XSL omdat XSL een nachtmerrie is voor ogen. Hier is mijn gewenste resultaat:
HTML als dit genereert dat resultaat:
|
<HTML>
<lichaam>
<Center>
<tabel grens= 1>
<!-- Etiketten-->
<tr bgcolor= blauw>
<TD><lettertype Kleur= wit><b>Naam van het project</b></lettertype></TD>
<TD uitlijnen= rechts><lettertype Kleur= wit><b>Datum voltooid</b></lettertype></TD>
<TD uitlijnen= rechts><lettertype Kleur= wit><b>Begroting</b></lettertype></TD>
<TD uitlijnen= rechts><lettertype Kleur= wit><b>Werkelijke kosten</b></lettertype></TD>
<TD><lettertype Kleur= wit><b>Algemene Status</b></lettertype></TD>
</tr>
<tr>
<TD>Boren computerlokaal.</TD>
<TD uitlijnen= rechts>02/01/08</TD>
<TD uitlijnen= rechts>22,500.00</TD>
<TD uitlijnen= rechts>19,000.00</TD>
<TD>In uitvoering</TD>
</tr>
<tr>
<TD>Bepaling servers voor SQL Upgrade</TD>
<TD uitlijnen= rechts>04/01/08</TD>
<TD uitlijnen= rechts>7,500.00</TD>
<TD uitlijnen= rechts>0.00</TD>
<TD>Gepland</TD>
</tr>
</tabel>
</Center>
</lichaam>
</HTML>
|
Aanpak
Als volgt te werk als u wilt maken het raster:
- Identificatie van de bestanddelen van het raster (rijen en kolommen).
- Definiëren en maken noodzakelijk sitekolommen.
- Maak sub sites voor de projecten en het singleton lijsten.
- De CQWP aan een webpagina toevoegen en configureren om te zoeken naar uw lijsten.
- De CQWP van XML naar het verzamelen van de aanvullende kolommen wijzigen.
- De XSL voor het genereren van een tabel wijzigen.
I 'm gonna concentreren op nummer zes. Getallen tot en met 4 zijn rechttoe-rechtaan en iets dat elke gebruiker CQWP heeft al gedaan. Nummer vijf is goed gedocumenteerd door anderen met inbegrip van dit volledig scherm-schot beladen artikel van MSDN Hier (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) en Heather Solomon's blog Hier (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Moeren en bouten
Beginnen en uit te voeren stappen 1 tot en met 5 vanaf de MSDN-documentatie en Heather Solomon artikel.
Op dit punt, u kunt uw CQWP aan de pagina hebt toegevoegd en u hebt uw <CommonViewFields> zo nodig geconfigureerd.
De gebruikelijke stappen uit te voeren, Ik krijg deze tussentijdse resultaten:
1. Een inhoudstype maken, een templatized aangepaste lijst voor dat inhoudstype en twee sites. Hier wordt het type inhoud:
Hier is de structuur van de site:
2. De CQWP na het maken van mijn project subsites en het singleton project samenvatting lijsten toevoegen:
3. Voeg de aanvullende informatie die ik wil via de <CommonViewFields>:
<eigenschap naam="CommonViewFields" type="tekenreeks">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</eigenschap>
Merk op dat ik moest houden de eigenschapsvelden op één lijn of het zou niet werken (CQWP zou vertellen me dat de query heeft geen resultaten opgeleverd).
4. Op dit punt, we klaar om te gaan dan het MSDN-artikel en tik op over Heather Solomon's artikel. Haar stappen beginnen in de buurt van stap #5 een aangepaste maken / unghosted versie van ItemStyle.xsl. Ik volg Heather's advies, door stap omhoog 11 en krijg deze tussentijdse resultaten:
4.1: Mijn XSL-sjabloon als volgt de naam:
<XSL:Sjabloonnaam = "Grid" overeenkomen met = "rij[@Style = 'Raster']" modus = "itemstyle">
Ik wijzigen ook iets haar voorgesteld <XSL:for-each …> door het toevoegen van een <BR /> label voor een schonere:
<XSL:for-each Selecteer="@*">
P:<XSL:waarde-van Selecteer="naam()" /><BR/>
</XSL:for-each>
4.2: Ik wijzigen het webonderdeel, Ga naar uiterlijk en selecteer mijn "Grid" stijl:
De wijziging door te voeren en hier is het resultaat:
Uit het bovenstaande kunnen we zien dat de velden die we willen (Naam van het project, kosten, status, etc) beschikbaar zijn voor ons om te gebruiken wanneer we de HTML-code uitstoten. Niet alleen dat, maar we zien de namen waaraan we moeten verwijzen naar die kolommen in de XSL. Bijvoorbeeld, We verwijzen naar de statusdatum van het Project als "Project_x005F_x0020_Name".
Op dit punt, We vertrekken van Heather's blog en van de schouders van deze reuzen, Ik voeg mijn eigen beetje.
ContentQueryMain.xsl
OPMERKING: Wanneer u wijzigingen aanbrengt aan zowel ContentQueryMain.xsl als ItemStyle.xsl, u moet controleren dat deze bestanden terug in voordat u het effect van uw wijzigingen zien.
Voor doeleinden van het raster maken, MOSS maakt gebruik van twee verschillende XSL-bestanden voor de productie van de resultaten die we van een CQWP zien. Voor het genereren van de vorige bit van output, We bewerkt ItemStyle.xsl. MOSS daadwerkelijk gebruik maakt van een andere XSL-bestand, ContentQueryMain.xsl om in combinatie met ItemStyle.xsl voor het genereren van de HTML-code. Zoals de naam al impliceert, ContentQueryMain.xsl is de belangrijkste"" XSL waarmee de totale stroom van vertaling. Het doorlopen van alle gevonden items en geeft ze één voor één aan sjablonen in ItemStyle.xsl. We zullen wijzigen ItemStyle.xsl voor het genereren van de open <tabel> Label vóór dat de eerste rij van de gegevens en de afronding <tabel> Label na de laatste rij uitstoten. Om dit te bereiken, ContentQueryMain.xsl is aangepast om twee parameters doorgeven aan onze "grid" sjabloon in ItemStyle.xsl, "laatste rij" en "huidige rij". ItemStyle.xsl maakt gebruik van deze voorwaardelijk uitstoten de nodige codes.
Met behulp van Heather Solomon techniek, Wij zoeken ContentQueryMain.xsl. Het is gelegen in de dezelfde plaats als ItemStyle.xsl. Dit schermschot moet helpen:
We moeten de volgende wijzigingen aanbrengen:
- Een XSL-sjabloon wijzigen, "CallItemTemplate" dat roept eigenlijk onze raster sjabloon in ItemStyle.xsl. We zullen twee parameters doorgeven aan de Grid-sjabloon, zodat het de vereiste gegevens hebben zal voor het genereren van voorwaardelijk openen en sluiten <tabel> Tags.
- Een ander stukje van ContentQueryMain.xsl waarin de "CallItemTemplate wijzigen" geschiedde het een "LastRow" met de parameter dus dat LastRow kan worden doorgegeven aan onze raster sjabloon.
Zoek de sjabloon met de naam "OuterTemplate.CallItemTemplate" geïdentificeerd door de tekenreeks:
<XSL:sjabloon naam="OuterTemplate.CallItemTemplate">
De hele sjabloon als volgt vervangen:
|
<XSL:sjabloon naam="OuterTemplate.CallItemTemplate">
<XSL:param naam="CurPosition" />
<!--
De "LastRow toevoegen" met de parameter.
We alleen gebruiken wanneer het item stijl pass in zich "Grid".
-->
<XSL:param naam="LastRow" />
<XSL:Kies>
<XSL:Wanneer test="@Style = 'NewsRollUpItem'">
<XSL:apply-templates Selecteer="." modus="itemstyle">
<XSL:met-param naam="EditMode" Selecteer="$cbq_iseditmode" />
</XSL:apply-templates>
</XSL:Wanneer>
<XSL:Wanneer test="@Style = 'NewsBigItem'">
<XSL:apply-templates Selecteer="." modus="itemstyle">
<XSL:met-param naam="CurPos" Selecteer="$CurPosition" />
</XSL:apply-templates>
</XSL:Wanneer>
<XSL:Wanneer test="@Style = 'NewsCategoryItem'">
<XSL:apply-templates Selecteer="." modus="itemstyle">
<XSL:met-param naam="CurPos" Selecteer="$CurPosition" />
</XSL:apply-templates>
</XSL:Wanneer>
<!--
Huidige positie en lastrow doorgeven aan de Grid itemstyle.xsl sjabloon.
ItemStyle.xsl gebruik dat het uitzenden van de open en sluiten <tabel> Tags.
-->
<XSL:Wanneer test="@Style = 'Raster'">
<XSL:apply-templates Selecteer="." modus="itemstyle">
<XSL:met-param naam="CurPos" Selecteer="$CurPosition" />
<XSL:met-param naam="Laatste" Selecteer="$LastRow" />
</XSL:apply-templates>
</XSL:Wanneer>
<XSL:anders>
<XSL:apply-templates Selecteer="." modus="itemstyle">
</XSL:apply-templates>
</XSL:anders>
</XSL:Kies>
</XSL:sjabloon>
|
De opmerkingen beschrijving van het doel van de wijzigingen.
Natuurlijk, de OuterTemplate.CallItemTemplate"" zelf wordt aangeroepen vanuit een andere sjabloon. Die sjabloon vinden door te zoeken naar deze tekenreeks:
<XSL:sjabloon naam="OuterTemplate.Body">
Blader door de instructies in OuterTemplate.Body en de parameter LastRow bijvoegen (weergegeven als een commentaar in cursief):
<XSL:oproep-sjabloon naam="OuterTemplate.CallItemTemplate">
<XSL:met-param naam="CurPosition" Selecteer="$CurPosition" />
<!-- De LastRow parameter invoegen. -->
<XSL:met-param naam="LastRow" Selecteer="$LastRow"/>
</XSL:oproep-sjabloon>
Na dit alles, We hebben eindelijk dingen correct ingesteld zodat onze ItemStyle.xsl kunnen uitstoten <tabel> Tags op de juiste plaats.
ItemStyle.Xsl
OPMERKING: Weer, check in ItemStyle.xsl na wijzigingen zodat u het effect van die wijzigingen zien.
We hebben hier twee taken:
- Vervang de gehele Grid-sjabloon. U kunt kopiëren/plakken uit de onderstaande lijst.
- Sommige mumbo jumbo buiten de definitie van de sjabloon waarmee "formatcurrency toevoegen" sjabloon om te werken. (U kunt vertellen dat ik heb een ijle greep op XSL).
Eerste, in de buurt van de top van ItemStyle.xsl, Voeg deze regel toe:
<!-- Sommige mumbo jumbo waarmee we kunnen U.S weergeven. valuta. -->
<XSL:decimaal-formaat naam="personeel" cijfers="D" />
<XSL:sjabloon naam="Standaard" wedstrijd="*" modus="itemstyle">
Opmerking dat ik toegevoegd het direct vóór de <XSL:Sjabloonnaam = "standaard" …> definitie.
Volgende, Ga terug naar onze raster sjabloon. De gehele Grid sjabloon vervangen door de onderstaande code. Het is grondig toegelicht, maar aarzel dan niet om me e-mail of reacties op mijn blog als u vragen hebt.
|
<XSL:sjabloon naam="Raster" wedstrijd="Rij[@Style = 'Raster']" modus="itemstyle">
<!--
ContentMain.xsl gaat CurPos en laatste.
We deze gebruiken om voorwaardelijk uitstoten het openen en sluiten <tabel> Tags.
-->
<XSL:param naam="CurPos" />
<XSL:param naam="Laatste" />
<!-- De volgende variabelen zijn tussentijds niet zijn gewijzigd van de standaard ItemStyle.xsl -->
<XSL:variabele naam="SafeImageUrl">
<XSL:oproep-sjabloon naam="OuterTemplate.GetSafeStaticUrl">
<XSL:met-param naam="UrlColumnName" Selecteer="'ImageUrl'"/>
</XSL:oproep-sjabloon>
</XSL:variabele>
<XSL:variabele naam="SafeLinkUrl">
<XSL:oproep-sjabloon naam="OuterTemplate.GetSafeLink">
<XSL:met-param naam="UrlColumnName" Selecteer="'LinkUrl'"/>
</XSL:oproep-sjabloon>
</XSL:variabele>
<XSL:variabele naam="DisplayTitle">
<XSL:oproep-sjabloon naam="OuterTemplate.GetTitle">
<XSL:met-param naam="Titel" Selecteer="@Title"/>
<XSL:met-param naam="UrlColumnName" Selecteer="'LinkUrl'"/>
</XSL:oproep-sjabloon>
</XSL:variabele>
<XSL:variabele naam="LinkTarget">
<XSL:Als test="@OpenInNewWindow = 'True'" >_blank</XSL:Als>
</XSL:variabele>
<!--
Hier definiëren we een variabele, "tableStart". Dit bevat de HTML-code die we gebruiken om te definiëren van de opening van de tabel, alsmede de kolomlabels. Merk op dat als CurPos = 1, het bevat de HTML-code in een CDATA-tag.
Anders, het is leeg.
De waarde van tableStart is emited telkens wanneer ItemStyle wordt aangeroepen via ContentQueryMain.xsl.
-->
<XSL:variabele naam="tableStart">
<XSL:Als test="$CurPos = 1">
<![CDATA[
<tabelrand = 1>
<TR bgcolor = "blauw">
<TD><tekstkleur = "wit"><b>Naam van het project</b></lettertype></TD>
<TD align = "rechts"><tekstkleur = "wit"><b>Datum voltooid</b></lettertype></TD>
<TD align = "rechts"><tekstkleur = "wit"><b>Begroting</b></lettertype></TD>
<TD align = "rechts"><tekstkleur = "wit"><b>Werkelijke kosten</b></lettertype></TD>
<TD><tekstkleur = "wit"><b>Algemene Status</b></lettertype></TD>
</tr>
]]>
</XSL:Als>
</XSL:variabele>
<!--
Een andere variabele, tableEnd gewoon definieert de afsluitende tag tabel.
Zoals met tableStart, het is altijd emited. Dit is de reden waarom de waarde is toegewezen voorwaardelijk op basis van de vraag of we de laatste rij met ContentQueryMain.xsl heb zijn aangenomen.
-->
<XSL:variabele naam="tableEnd">
<XSL:Als test="$CurPos = $Last">
<![CDATA[ </tabel> ]]>
</XSL:Als>
</XSL:variabele>
<!--
Altijd het uitzenden van de inhoud van tableStart. Als dit niet de eerste rij doorgegeven aan ons door ContentQueryMain.xsl, dan weten we de waarde leeg zal worden.
Uitschakelen uitvoer ontsnappen omdat wanneer tableStart het niet leeg, Het omvat werkelijke HTML die we willen worden weergegeven door de browser. Als we niet vertellen uitvoer de XSL-parser uitschakelen ontsnappen, zal het genereren van dingen zoals"<tabel>" in plaats van"<tabel>".
-->
<XSL:waarde-van Selecteer="$tableStart" uitschakelen-uitvoer-ontsnappen="Ja"/>
<tr>
<!--
P:Project_x005F_x0020_Name P:Project_x005F_x0020_End_x005F_x0020_Date P:Project_x005F_x0020_Budget P:Project_x005F_x0020_Expenses P:Project_x005F_x0020_Status
-->
<TD>
<XSL:waarde-van Selecteer="@Project_x005F_x0020_Name"/>
</TD>
<TD uitlijnen="recht">
<XSL:waarde-van Selecteer="@Project_x005F_x0020_End_x005F_x0020_Date"/>
</TD>
<TD uitlijnen="recht">
<XSL:oproep-sjabloon naam="FormatCurrency">
<XSL:met-param naam="waarde" Selecteer="@Project_x005F_x0020_Budget"></XSL:met-param>
</XSL:oproep-sjabloon>
</TD>
<TD uitlijnen="recht">
<XSL:oproep-sjabloon naam="FormatCurrency">
<XSL:met-param naam="waarde" Selecteer="@Project_x005F_x0020_Expenses"> </XSL:met-param>
</XSL:oproep-sjabloon>
</TD>
<TD>
<XSL:waarde-van Selecteer="@Project_x005F_x0020_Status"/>
</TD>
<!--
Alle van de volgende handelingen is uitgecommentarieerd te verduidelijken dingen.
Echter, het terug te brengen en dat soort dingen in een <TD> om het effect te zien.
-->
<!--
<div id = "linkitem" klasse = "post">
<XSL:Als test = "tekenreeks-lengte($SafeImageUrl) != 0 ">
<div class = & quoSafeImageUrl-links ">
<een href = "{$SafeLinkUrl}" target = "{$LinkTarget}">
<img klasse = "afbeelding-fixed-width" src = "{$SafeImageUrl}" ALT = "{@ImageUrlAltText}"/>
</een>
</div>
</XSL:Als>
<div class = "link-item">
<XSL:oproep-sjabloon name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<een href = "{$SafeLinkUrl}" target = "{$LinkTarget}" titel = "{@LinkToolTip}">
<XSL:Selecteer waarde-van "$DispXSLTitle" = />
</een>
<div class = "omschrijving">
<XSL:waarde-van select="@Description" />
</div>
</div>
</div>
-->
</tr>
<!--
Uitstoten de afsluitende tag tabel. Als we niet op de laatste rij,
Dit is leeg.
-->
<XSL:waarde-van Selecteer="$tableEnd" uitschakelen-uitvoer-ontsnappen="Ja"/>
</XSL:sjabloon>
<XSL:sjabloon naam="FormatCurrency">
<XSL:param naam="waarde" Selecteer="0" />
<XSL:waarde-van Selecteer='getalnotatie($waarde, "$DDD,DDD,DDD.DD", "personeel")' />
</XSL:sjabloon>
|