Oversikt og mål
Esken, MOSS’ Webdelen for innholdsspørring (CQWP) viser resultatene i listeformat, lik søkeresultater. Det er også mulig å vise resultatene i et rutenettformat (dvs.. HTML tabellformat). Rutenettet er bedre i enkelte tilfeller. Jeg beskrive hvordan å oppnå den effekten i denne artikkelen.
Virksomhet Scenario
Jeg har jobbet med en klient på en bedriftsomfattende MOSS distribusjon. Vi har utformet sine taksonomi slik at prosjekter er førsteklasses borgere i hierarkiet og har sin egen området på toppnivå. Prosjektledere vedlikeholde en singleton liste over sammendragsinformasjon for prosjektet, som tittelen, budsjett, forventet fullføringsdato, Gjenstående budsjett og andre oppsummeringstype felt. Av "singleton" Jeg mener en egendefinert SharePoint-liste som er garantert å inneholde bare ett element. Simplistically, Det ser ut som dette:
Tekniske tilnærmingen er mye det samme som beskrevet her (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP bruker en XSL-transformasjon for å avgi HTML for leseren for å gjengi.
Envision jeg alltid resultatet før dykking i XSL fordi XSL er et mareritt. Her er min ønsket resultat:
HTML som dette genererer resultatet:
|
<HTML>
<kroppen>
<Center>
<tabell kantlinje= 1>
<!-- Etiketter->
<tr BgColor= blå>
<TD><skrift farge= hvit><b>Prosjektnavnet</b></skrift></TD>
<TD justere= høyre><skrift farge= hvit><b>Fullført dato</b></skrift></TD>
<TD justere= høyre><skrift farge= hvit><b>Budsjett</b></skrift></TD>
<TD justere= høyre><skrift farge= hvit><b>Faktiske kostnader</b></skrift></TD>
<TD><skrift farge= hvit><b>Samlet Status</b></skrift></TD>
</tr>
<tr>
<TD>Re-wire datarom.</TD>
<TD justere= høyre>02/01/08</TD>
<TD justere= høyre>22,500.00</TD>
<TD justere= høyre>19,000.00</TD>
<TD>Pågår</TD>
</tr>
<tr>
<TD>Bestemmelsen servere for SQL Upgrade</TD>
<TD justere= høyre>04/01/08</TD>
<TD justere= høyre>7,500.00</TD>
<TD justere= høyre>0.00</TD>
<TD>Planlagt</TD>
</tr>
</tabell>
</Center>
</kroppen>
</HTML>
|
Tilnærming
Følg denne fremgangsmåten for å opprette rutenettet:
- Komponentene i rutenettet (rader/kolonner).
- Definerer og nødvendig områdekolonner.
- Opprette sub-områder for prosjekter og singleton lister.
- Legge til CQWP til en webside og konfigurere den til å søke for listene.
- Endre det CQWP XML til å samle tilleggskolonnene.
- Endre XSL for å generere en tabell.
Jeg skal konsentrere nummer seks. Tallene en gjennom fire er rett fram og noe som CQWP brukere har allerede gjort. Nummer fem er veldokumentert av andre inkludert denne uttømmende skjermbilde laden artikkelen fra MSDN her (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) og Heather Solomons blogg her (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Muttere og bolter
Begynner og implementere trinn en til fem i MSDN-dokumentasjonen og Heather Solomons artikkel.
På dette punktet, du har lagt til din CQWP til siden og du har din <CommonViewFields> konfigurert som nødvendig.
Vanlige fremgangsmåten, Jeg får disse mellomliggende resultater:
1. Opprette en innholdstype, en malbasert liste for innholdstypen og to områder. Her er innholdstypen:
Her er områdestrukturen:
2. Legge til CQWP når du har opprettet min prosjektet sekundære områder og singleton prosjektet Sammendrag lister:
3. Legge til den ekstra informasjonen jeg ønsker via den <CommonViewFields>:
<egenskapen navn="CommonViewFields" type="streng">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</egenskapen>
Merk at jeg måtte holde alle egenskapsfelt på én linje, eller det ville ikke fungere (CQWP ville fortelle meg at spørringen returnerte ingen elementer).
4. På dette punktet, Vi er klare til å MSDN-artikkelen og snu på Heather Solomons artikkel. Følg hennes fremgangsmåte begynner nær trinn #5 opprette en tilpasset / unghosted versjon av ItemStyle.xsl. Jeg følger Heather råd, opp gjennom trinn 11 og få disse midlertidige resultater:
4.1: Navnet mitt XSL-mal som følger:
<XSL:malnavnet = "rutenett" matche = "rad[@Style = 'Rutenett']" Mode = "itemstyle">
Jeg endre også litt henne foreslo <XSL:for each …> ved å legge til en <br /> kode for å gi en renere liste:
<XSL:for each Velg="@*">
P:<XSL:verdien av Velg="navn()" /><br/>
</XSL:for each>
4.2: Jeg endre webdelen, gå til utseende og velg min "rutenett" stil:
Før endringen og her er resultatet:
Vi kan se fra ovenfor at feltene vi ønsker (Prosjektnavnet, bekostning, status, osv.) er tilgjengelig for oss å bruke når vi sender ut HTML. Ikke bare det, men vi se navnene som vi må referere til disse kolonnene i XSL. For eksempel, Vi referanse prosjektstatus som "Project_x005F_x0020_Name".
På dette punktet, Vi går fra Heathers blogg og skuldrene til disse gigantene, Jeg legger min egen litt.
ContentQueryMain.xsl
NOTE: Når endringer både ContentQueryMain.xsl samt ItemStyle.xsl, du må sjekke filene tilbake i før du ser effekten av endringene.
Rutenett-making forbindelse, MOSS bruker to forskjellige XSL-filer for å produsere resultatene vi ser fra en CQWP. Generere den forrige bit av utdata, vi endret ItemStyle.xsl. MOSS faktisk bruker en XSL-fil, ContentQueryMain.xsl til i forbindelse med ItemStyle.xsl til å generere dens HTML. Som navnet tilsier, ContentQueryMain.xsl er den "viktigste" XSL som styrer den samlede flyten i oversettelse. Det går gjennom alle funnet elementene og sender dem én etter én til malene i ItemStyle.xsl. Vi vil endre ItemStyle.xsl for å generere åpne <tabell> før emitting den første raden med data og lukking <tabell> koden etter emitting siste. Å oppnå dette, ContentQueryMain.xsl er endret for å sende to parametere til våre "rutenett" malen i ItemStyle.xsl, "siste rad" og "gjeldende rad". ItemStyle.xsl bruker dette til betinget avgir de nødvendige kodene.
Bruke Heather Solomons teknikken, Vi finner ContentQueryMain.xsl. Det ligger på samme sted som ItemStyle.xsl. Dette skjermbildet skal hjelpe:
Vi må gjøre følgende endringer:
- Endre en xsl-mal, "CallItemTemplate" som påkaller faktisk våre rutenettet malen i ItemStyle.xsl. Vi passerer to parametere for rutenettet malen slik at den har dataene må betinget generering åpning og lukking <tabell> Tags.
- Endre en annen bit av ContentQueryMain.xsl som kaller "CallItemTemplate" skjedde det en "LastRow" parameteren slik at LastRow kan bli gitt videre til vår rutenettet mal.
Finn malen kalt "OuterTemplate.CallItemTemplate" identifisert av strengen:
<XSL:mal navn="OuterTemplate.CallItemTemplate">
Erstatte hele malen som følger:
|
<XSL:mal navn="OuterTemplate.CallItemTemplate">
<XSL:param navn="CurPosition" />
<!--
Legge til LastRow"" parameteren.
Vi bare bruker den når elementet stil trinnet er "Rutenett".
-->
<XSL:param navn="LastRow" />
<XSL:Velg>
<XSL:når test="@Style = 'NewsRollUpItem'">
<XSL:bruke-maler Velg="." modus="itemstyle">
<XSL:med param navn="EditMode" Velg="$cbq_iseditmode" />
</XSL:bruke-maler>
</XSL:når>
<XSL:når test="@Style = 'NewsBigItem'">
<XSL:bruke-maler Velg="." modus="itemstyle">
<XSL:med param navn="CurPos" Velg="$CurPosition" />
</XSL:bruke-maler>
</XSL:når>
<XSL:når test="@Style = 'NewsCategoryItem'">
<XSL:bruke-maler Velg="." modus="itemstyle">
<XSL:med param navn="CurPos" Velg="$CurPosition" />
</XSL:bruke-maler>
</XSL:når>
<!--
Pass nåværende posisjon og lastrow i malen rutenett itemstyle.xsl.
ItemStyle.xsl vil bruke det til å avgi åpne og lukke <tabell> Tags.
-->
<XSL:når test="@Style = 'Rutenett'">
<XSL:bruke-maler Velg="." modus="itemstyle">
<XSL:med param navn="CurPos" Velg="$CurPosition" />
<XSL:med param navn="Siste" Velg="$LastRow" />
</XSL:bruke-maler>
</XSL:når>
<XSL:ellers>
<XSL:bruke-maler Velg="." modus="itemstyle">
</XSL:bruke-maler>
</XSL:ellers>
</XSL:Velg>
</XSL:mal>
|
Kommentarer beskriver hensikten med endringene.
selvfølgelig, "-OuterTemplate.CallItemTemplate" kalles seg fra en annen mal. Finn malen ved å søke etter denne tekststrengen:
<XSL:mal navn="OuterTemplate.Body">
Bla gjennom instruksjonene i OuterTemplate.Body og setter parameteren LastRow som følger (vises som en kommentar i kursiv):
<XSL:samtale-mal navn="OuterTemplate.CallItemTemplate">
<XSL:med param navn="CurPosition" Velg="$CurPosition" />
<!-- Sette parameteren LastRow. -->
<XSL:med param navn="LastRow" Velg="$LastRow"/>
</XSL:samtale-mal>
Etter alt dette, Vi endelig har ting satt opp riktig slik at våre ItemStyle.xsl kan avgi <tabell> koder på rett sted.
ItemStyle.Xsl
NOTE: Igjen, innsjekking ItemStyle.xsl etter gjør endringer slik at du ser effekten av endringene.
Vi har to aktiviteter:
- Erstatte malen for hele rutenettet. Du kan kopiere/lime nedenfor.
- Legge noe mumbo jumbo utenfor maldefinisjonen som gjør "formatcurrency" mal å arbeide. (Du kan fortelle at jeg har en spinkel håndtak på XSL).
Første, øverst på ItemStyle.xsl, Legg til denne linjen:
<!-- Noe mumbo jumbo som lar oss vise USA. valuta. -->
<XSL:desimal-format navn="ansatte" siffer="D" />
<XSL:mal navn="Standard" kamp="*" modus="itemstyle">
Merk at jeg la det direkte før den <XSL:malnavnet = "retten" …> definisjon.
Neste, gå tilbake til vår rutenettet mal. Erstatte malen for hele rutenettet med koden nedenfor. Det er godt kommentert, men ikke nøl med å email meg eller forlate kommentarer på bloggen min hvis du har spørsmål.
|
<XSL:mal navn="Rutenett" kamp="Rad[@Style = 'Rutenett']" modus="itemstyle">
<!--
ContentMain.xsl går CurPos og siste.
Vi bruker disse til betinget avgir åpne og lukke <tabell> Tags.
-->
<XSL:param navn="CurPos" />
<XSL:param navn="Siste" />
<!-- Følgende variabler er uendret fra den standard ItemStyle.xsl -->
<XSL:variabel navn="SafeImageUrl">
<XSL:samtale-mal navn="OuterTemplate.GetSafeStaticUrl">
<XSL:med param navn="UrlColumnName" Velg="'ImageUrl'"/>
</XSL:samtale-mal>
</XSL:variabel>
<XSL:variabel navn="SafeLinkUrl">
<XSL:samtale-mal navn="OuterTemplate.GetSafeLink">
<XSL:med param navn="UrlColumnName" Velg="'LinkUrl'"/>
</XSL:samtale-mal>
</XSL:variabel>
<XSL:variabel navn="DisplayTitle">
<XSL:samtale-mal navn="OuterTemplate.GetTitle">
<XSL:med param navn="Tittel" Velg="@Title"/>
<XSL:med param navn="UrlColumnName" Velg="'LinkUrl'"/>
</XSL:samtale-mal>
</XSL:variabel>
<XSL:variabel navn="LinkTarget">
<XSL:Hvis test="@OpenInNewWindow = "True"" >_blank</XSL:Hvis>
</XSL:variabel>
<!--
Her definere vi en variabel, "tableStart". Denne inneholder HTML som vi bruker til å definere åpningen av tabellen samt kolonneetikettene. Merk at hvis CurPos = 1, Det inkluderer HTML i en CDATA-kode.
Ellers, det vil være tomt.
Verdien for tableStart er emited hver gang ItemStyle kalles via ContentQueryMain.xsl.
-->
<XSL:variabel navn="tableStart">
<XSL:Hvis test="$CurPos = 1">
<![CDATA[
<tabellkantlinjen = 1>
<St bgcolor = "blue">
<TD><skriftfarge = "hvit"><b>Prosjektnavnet</b></skrift></TD>
<TD Juster = "høyre"><skriftfarge = "hvit"><b>Fullført dato</b></skrift></TD>
<TD Juster = "høyre"><skriftfarge = "hvit"><b>Budsjett</b></skrift></TD>
<TD Juster = "høyre"><skriftfarge = "hvit"><b>Faktiske kostnader</b></skrift></TD>
<TD><skriftfarge = "hvit"><b>Samlet Status</b></skrift></TD>
</tr>
]]>
</XSL:Hvis>
</XSL:variabel>
<!--
En annen variabel, tableEnd bare definerer avslutningskoden tabellen kode.
Som med tableStart, Det er alltid emited. Derfor verdien tilordnes betinget basert på om har vi passert siste av ContentQueryMain.xsl.
-->
<XSL:variabel navn="tableEnd">
<XSL:Hvis test="$CurPos = $Last">
<![CDATA[ </tabell> ]]>
</XSL:Hvis>
</XSL:variabel>
<!--
Alltid avgi innholdet i tableStart. Hvis dette ikke er den første raden passerte oss ContentQueryMain.xsl, så vet vi verdien være tom.
Deaktiverer utgang rømmer fordi når tableStart det ikke tomme, den inneholder selve HTML som vi skal gjengis i leseren. Hvis vi ikke forteller utgang XSL parseren deaktiverer rømme, det vil generere ting som"<tabell>" i stedet for"<tabell>".
-->
<XSL:verdien av Velg="$tableStart" Deaktiver-utdata-unnslippe="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:verdien av Velg="@Project_x005F_x0020_Name"/>
</TD>
<TD justere="høyre">
<XSL:verdien av Velg="@Project_x005F_x0020_End_x005F_x0020_Date"/>
</TD>
<TD justere="høyre">
<XSL:samtale-mal navn="FormatCurrency">
<XSL:med param navn="verdi" Velg="@Project_x005F_x0020_Budget"></XSL:med param>
</XSL:samtale-mal>
</TD>
<TD justere="høyre">
<XSL:samtale-mal navn="FormatCurrency">
<XSL:med param navn="verdi" Velg="@Project_x005F_x0020_Expenses"> </XSL:med param>
</XSL:samtale-mal>
</TD>
<TD>
<XSL:verdien av Velg="@Project_x005F_x0020_Status"/>
</TD>
<!--
Følgende er kommentert ut for å avklare ting.
Men, bringe det tilbake og greier det i en <TD> å se sin effekt.
-->
<!--
<div id = "linkitem" class = "element">
<XSL:Hvis test = "strenglengde($SafeImageUrl) != 0">
<div class = "bilde-området-left">
<et href = "{$SafeLinkUrl}" Target = "{$LinkTarget}">
<img class = "bilde-fast bredde" src = "{$SafeImageUrl}" alt = "{@ImageUrlAltText}"/>
</en>
</div>
</XSL:Hvis>
<div class = "link-element">
<XSL:samtale-mal Name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<et href = "{$SafeLinkUrl}" Target = "{$LinkTarget}" Tittel = "{@LinkToolTip}">
<XSL:verdien av Velg = "$DisXSLyTitle" />
</en>
<div class = "beskrivelse">
<XSL:verdien av select="@Description" />
</div>
</div>
</div>
-->
</tr>
<!--
Avgi avslutningskoden tabellen kode. Hvis vi ikke er i den siste raden,
Dette vil være tom.
-->
<XSL:verdien av Velg="$tableEnd" Deaktiver-utdata-unnslippe="ja"/>
</XSL:mal>
<XSL:mal navn="FormatCurrency">
<XSL:param navn="verdi" Velg="0" />
<XSL:verdien av Velg='formater tall($verdi, "$DDD,DDD,DDD.DD", "personale")' />
</XSL:mal>
|