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" |
Dit is ongelooflik nuttig. Dankie!
Aah… dit was omdat ek die naam van my lys styl anders en het nie besef dat in die ContentQueryMain.xsl dit kontroleer of die "styl":
<xsl:toe toets = "@ Style = 'NameOfMyStyle'">
Met wat herdoop dit het gewerk. 🙂
Dit het amper vir my gewerk het: Ek bestuur die uitvoer </tafel> eindig tag korrek, maar die begin tag ontbreek. Dit wil voorkom asof die toets = "$ CurPos = 1" nie terug waar. Maar hoekom?
Groot Post. Paul Ek het al die bogenoemde dinge gedoen. Ek het 'n navraag, hoe kan ek die som van die "totale werklike Expences achive" of som van die waarde van die twee kolomme.
Het jy 'n werk gedoen met die skep van die persoonlike ContentQueryMain en ItemStyle xsl lêers? Die rede waarom ek vra is dat ek wil nie te bekommer oor my persoonlike style oorskryf met enige kolle of opgraderings. Het jy nie voorbeelde? Ek het probeer om 'n identiese kopie van die ContentQueryMain.xsl en oplaai dat 'n nuwe persoonlike afskrif aan die styl Biblioteek. Wanneer om 'n verwysing na die xsl lêer in die Webpart. MainXslLink eiendom, Ek kry 401 nie toegelaat. Die persoonlike XSL-lêer is 'n gepubliseerde weergawe en almal gelees het toegang tot.
fantastiese pos dankie! Sukkel met dit nou vir die laaste paar dae.
Hi, dit was 'n baie nuttige plasing. Ek het dit alles werk, en ook Mike Brown se verandering geïmplementeer word, sodat dit groepe
die resultate in die tabel wat ek kies, aangesien die Groep deur die parameter in die CQWB se eiendomme.
Ek het die titel ook 'n skakel, so dit werk mooi. Ek het nog steeds 'n probleem, al. Ek groepering van die resultate deur die naam van die werf. Binne-in die tabel, dit groepe wat hulle mooi, en dit lyk 'n groot, maar dit is nog al die groep uit te druk
name(in my geval die site name) bo die tafel. Is daar iemand wat weet hoe om ontslae te raak van hierdie?
Dankie,
Greg
Nice artikel. Ek het daarin geslaag om my tafel te gee van die voorkoms van standaard Sharepoint Lyste deur die ontleding van die bron-kode van die lys. Hier is die hoof HTML blokke wat nodig is om aan te pas in ItemStyle:
<TABEL width = "100%" class = "ms-listviewtable" border = 0 Cellspacing = 0 Celvulling = 1 r = "Geen">
<!–HEADER–>
<TR class = "ms-viewheadertr" VALIGN = TOP>
<TH sukses van hul loopbaan omvang = "Kol" class = "MS-vh2-"><div style = "width:100%;posisie:relatiewe;verlaat:0;Top:0;">
<TABEL style = "width:100%;" CtxNum = "1" height = "100%" Cellspacing = 1 Celvulling = 0 klas = "ms-unselectedtitle">
<TR>
<TD width = "100%" Class = "ms-vb" sukses van hul loopbaan>
Titel teks hier
</TD>
<TD style = "posisie:absolute;">
</TD>
</TR>
</TABEL></Div>
</TH>
<!–Herhaal vir alle kop selle–>
</TR>
<!– Tabel data –>
<TR class = "">
<!–Datakolom, Paulus se kode vir die eerste een met die hyperlink –>
<Die TD Klas = "ms-vb2">Data hier</TD>
<!–Leë kolom–>
<Die TD Klas = "ms-vb2">
<span dir=None></span><
/TD>
<!–Datum kolom–>
<Die TD Klas = "ms-vb2">
<Nobr>11/12/2008</Nobr>
</TD>
</TR>
<!–***Alternatiewe ry – Gebruik 'n nuwe XSL-veranderlike wat die alternatiewe klas plaas op grond van die huidige ry modulo 2–>
<TR class = "ms-wisselstroom">
…
</TR>
</TABEL>
Thatz juis ek was op soek na .. jy rock man .. Lank lewe .. lief vir jou vir die pos..
<xsl:van toepassing nie-template kies = "." mode = "itemstyle">
<xsl:met param name = "CurPos" kies = "$ CurPosition" />
<xsl:met-param name = "Verlede" kies = "$ LastRow" />
<xsl:met param name = "StartNewGroup" kies = "@ __begingroup" />
</xsl:toe>
<xsl:when test="$StartNewGroup = ‘True’">
<tr>
<td >
<xsl:call-template name = "OuterTemplate.GetGroupName">
<xsl:met param name = "Group Name" Kies = "@ *[naam()= $ Groep]"/>
<xsl:met param name = "GroupType" kies = "$ GroupType" />
</xsl:call-template>
</td>
</tr>
</xsl:toe>
<xsl:anders>
</xsl:anders>
</xsl:kies>
Hi Paul,
By die werk met die XML / XSL en inhoud navraag web deel, het jy enige goeie maniere om jou xslt te formateer? Probeer om veranderinge aan te bring en die ontwerp te toets is 'n regte pyn in die 'n ** net met behulp van 'n teks editor…
Al die beste
(bijv. https://myweb.com/Marketing/images/icn-order.gif, )
Moet ek beeld of foto in die CommonViewFields veldtipe? (bijv. InternalColumnName, Image)
Your post is exactly what I was looking for. Egter, I can’t get it to work.
I have documents that are stored in various doc. libraries but classified using a custom class column (keuse: 1 of 2. I want to use CQWP to show these documents based on thier class.
I was able to add the CQWP, export it to SPD, configure the itemStyle.xls to show custom fileds in list view. egter, I could not successfully implement what you describe here.
These are the columns I want to show in my CQWP:
File Type (to show icon)
File Title
Date Last Modified
Modified By Who
Checked Out To
Checked In Comments
I currently have the result in a list format. How do I change it to a talble format.
Dankie.
Saji
Jammer vir die missspelling op my naam nie seker waar die ” uit.