Übersicht und Zielsetzung
Out of the box, MOOS’ Webpart für Inhaltsabfragen (CQWP) zeigt die Ergebnisse in Form einer Liste, ähnlich zu den Suchergebnissen. Es ist auch möglich, die Ergebnisse in einem Raster-Format anzeigen (dh. HTML-Tabellenformat). Raster-Formate sind unter Umständen besser. Ich beschreibe wie man diesen Effekt in diesem Artikel zu erreichen.
Business-Szenario
Ich arbeite mit einem Client auf eine unternehmensweite MOSS-rollout. Wir haben ihre Taxonomie gestaltet, so dass Projekte Bürger der ersten Klasse in der Hierarchie sind und ihre eigene Top-Level-Website haben. Projektmanager erhalten eine Singleton-Liste von Projektzusammenfassungsinformationen, wie Titel, Budget, erwarteter Fertigstellungstermin, verbleibende Budget und anderen Übersicht Typ Felder. Von "singleton" Ich meine eine benutzerdefinierte SharePoint-Liste, die garantiert, dass nur ein Element enthalten. Vereinfachender, Es sieht wie folgt aus:
Der technische Ansatz ist ähnlich wie beschrieben Hier (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). Der CQWP wird eine XSL-Transformation ausgeben von HTML für den Browser zum Rendern verwendet..
Ich stelle mir vor immer das Ergebnis vor dem Tauchen in die XSL-Datei, da XSL ein Alptraum ist. Hier ist meine gewünschte Ergebnis:
HTML wie folgt generiert, die sich ergeben:
|
<HTML>
<Körper>
<Zentrum>
<Tabelle Grenze= 1>
<!-- Etiketten-->
<TR bgcolor= blau>
<TD><Schriftart Farbe= weiß><b>Projektname</b></Schriftart></TD>
<TD ausrichten= rechts><Schriftart Farbe= weiß><b>Vollständiges Datum</b></Schriftart></TD>
<TD ausrichten= rechts><Schriftart Farbe= weiß><b>Budget</b></Schriftart></TD>
<TD ausrichten= rechts><Schriftart Farbe= weiß><b>Tatsächliche Kosten</b></Schriftart></TD>
<TD><Schriftart Farbe= weiß><b>Gesamtstatus</b></Schriftart></TD>
</TR>
<TR>
<TD>Computerraum neu verkabeln.</TD>
<TD ausrichten= rechts>02/01/08</TD>
<TD ausrichten= rechts>22,500.00</TD>
<TD ausrichten= rechts>19,000.00</TD>
<TD>In Bearbeitung</TD>
</TR>
<TR>
<TD>Bereitstellung Server für SQL Upgrade</TD>
<TD ausrichten= rechts>04/01/08</TD>
<TD ausrichten= rechts>7,500.00</TD>
<TD ausrichten= rechts>0.00</TD>
<TD>Geplant</TD>
</TR>
</Tabelle>
</Zentrum>
</Körper>
</HTML>
|
Ansatz
Gehen Sie folgendermaßen vor um das Raster zu erstellen:
- Identifizieren Sie die Komponenten des Rasters (Zeilen/Spalten).
- Definieren und Erstellen der erforderlichen Websitespalten.
- Unterseiten für die Projekte und Singleton-Listen zu erstellen.
- Fügen Sie die CQWP zu einer Webseite hinzu und konfigurieren Sie es für Ihre Listen suchen.
- Ändern der CQWP XML um die zusätzlichen Spalten zu sammeln.
- Ändern Sie die XSL-Datei um eine Tabelle zu erzeugen.
Ich werde auf Nummer sechs konzentrieren. Zahlen eins bis vier sind geradlinig und etwas, das jeder Benutzer CQWP bereits getan hat. Nummer fünf wurde gut dokumentiert, andere einschließlich dieser erschöpfenden Screenshot beladenen Artikel aus MSDN Hier (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) und Heather Solomon's blog Hier (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Schrauben und Muttern
Beginnen Sie und implementieren Sie die Schritte eins bis fünf nach der MSDN-Dokumentation und Heather Solomon Artikel.
An diesem Punkt, Sie haben Ihre CQWP zur Seite hinzugefügt, und Sie haben Ihre <CommonViewFields> nach Bedarf konfiguriert.
Die üblichen Schritte, Ich bekomme diese Zwischenergebnisse:
1. Erstellen eines Inhaltstyps, templatized benutzerdefinierte Listen für dieses Inhaltstyps und zwei Standorte. Hier ist der Content-type:
Hier ist die Websitestruktur:
2. Fügen Sie die CQWP nach Listenerstellung mein Projekt Unterwebsites und Singleton Projekt Zusammenfassung:
3. Fügen Sie alle zusätzliche Informationen, die ich über will die <CommonViewFields>:
<Eigenschaft Name="CommonViewFields" Typ="Zeichenfolge">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</Eigenschaft>
Anmerkung, die ich hatte weiterhin die Eigenschaftenfelder auf einer Linie, oder es würde nicht funktionieren. (CQWP sagen mir, dass die Abfrage keine Elemente zurückgegeben).
4. An diesem Punkt, Wir sind bereit, über die MSDN-Artikel bewegen und Flip Sie Heather Solomon-Artikel. Ihre Schritte, beginnend in der Nähe von Schritt #5 um eine benutzerdefinierte erstellen / nicht duplizierte Version der ItemStyle.xsl. Ich befolgen Heathers Rat, bis hinauf Schritt 11 und erhalten diese Zwischenergebnisse:
4.1: Mein XSL-Vorlage wie folgt zu nennen:
<XSL:Vorlagenname = "Grid" Match = "Zeile[@Style = "Grid"]" Modus = "Itemstyle">
Ich passe auch leicht ihr vorgeschlagen <XSL:für jeden …> durch das Hinzufügen einer <BR /> Tag, um eine sauberere Liste bereitstellen:
<XSL:für jeden Wählen Sie="@*">
P:<XSL:Wert der Wählen Sie="Name()" /><BR/>
</XSL:für jeden>
4.2: Ändern Sie das Webpart, zur Darstellung und wählen Sie meine "Gitter" Stil:
Die Änderung übernommen und hier ist das Ergebnis:
Aus dem Gesagten sehen wir, dass wir wollen, dass die Felder (Projektname, Kosten, Status, usw.) stehen für uns zu nutzen, wenn wir den HTML-Code ausgeben. Nicht nur das, aber wir sehen die Namen, mit denen wir diejenigen Spalten die XSL-Datei verweisen muss. Zum Beispiel, Wir verweisen auf Projekt-Status als "Project_x005F_x0020_Name".
An diesem Punkt, Wir fahren von Heather's Blog und von den Schultern der Riesen, Ich hinzufügen mein eigenes kleines bisschen.
ContentQueryMain.xsl
HINWEIS: Wenn sowohl ContentQueryMain.xsl als auch ItemStyle.xsl ändern, Checken Sie diese Dateien wieder, bevor die Auswirkungen Ihrer Änderungen angezeigt werden sollen.
Raster zu Zwecken, MOSS verwendet zwei verschiedene XSL-Dateien, um die Ergebnisse zu produzieren, sehen wir von einer CQWP. Das vorherige Bit Ausgabe generieren, Wir modifiziert ItemStyle.xsl. MOSS nutzt eigentlich ein weiteres XSL-Datei, ContentQueryMain.xsl, in Verbindung mit ItemStyle.xsl seine HTML generieren. Wie der Name schon sagt, ContentQueryMain.xsl ist der "main" XSL, das steuert den gesamten Fluss der Übersetzung. Durchläuft alle gefundenen Elemente und übergibt sie eins nach dem anderen zu Vorlagen in ItemStyle.xsl. Wir werden ItemStyle.xsl zum Generieren von geöffnetem ändern. <Tabelle> Tag vor dem Ausgeben von der ersten Zeile der Daten und dem schließenden <Tabelle> Tag nach der letzten Zeile ausgeben. Um dies zu erreichen, ContentQueryMain.xsl wird geändert, um unsere "Gitter zwei Parameter übergeben" Vorlage in ItemStyle.xsl, "letzte Zeile" und die "aktuelle Zeile". ItemStyle.xsl verwendet diese bedingt die erforderlichen Tags ausgeben.
Heather Solomon Technik, Wir suchen ContentQueryMain.xsl. Es befindet sich an der gleichen Stelle wie ItemStyle.xsl. Dieser Screenshot sollte helfen:
Wir müssen die folgenden Änderungen vornehmen:
- Eine Xsl-Vorlage ändern, "CallItemTemplate" aufruft, die tatsächlich unser Grid-Vorlage in ItemStyle.xsl. Wir geben zwei Parameter der Grid-Vorlage weiter, sodass es die Daten haben wird, die es bedingt zu generieren, öffnen und schließen muss <Tabelle> Schlagwörter.
- Ändern Sie ein weiteres Stück der ContentQueryMain.xsl, die CallItemTemplate"aufruft" ein "LastRow weiterzugeben" Parameter, so dass LastRow unsere Grid-Vorlage weiterbelastet werden kann.
Suchen Sie die Vorlage mit dem Namen "OuterTemplate.CallItemTemplate" durch die Zeichenfolge identifiziert:
<XSL:Vorlage Name="OuterTemplate.CallItemTemplate">
Das gesamte Template wie folgt zu ersetzen:
|
<XSL:Vorlage Name="OuterTemplate.CallItemTemplate">
<XSL:param Name="CurPosition" />
<!--
Hinzufügen der "LastRow" Parameter.
Wir verwenden, nur wenn der Element-Stil-Pass in "Grid" ist.
-->
<XSL:param Name="LastRow" />
<XSL:Wählen Sie>
<XSL:Wenn Test="@Style = 'NewsRollUpItem'">
<XSL:anwenden-Vorlagen Wählen Sie="." Modus="ItemStyle">
<XSL:mit param Name="EditMode" Wählen Sie="$cbq_iseditmode" />
</XSL:anwenden-Vorlagen>
</XSL:Wenn>
<XSL:Wenn Test="@Style = 'NewsBigItem'">
<XSL:anwenden-Vorlagen Wählen Sie="." Modus="ItemStyle">
<XSL:mit param Name="CurPos" Wählen Sie="$CurPosition" />
</XSL:anwenden-Vorlagen>
</XSL:Wenn>
<XSL:Wenn Test="@Style = 'NewsCategoryItem'">
<XSL:anwenden-Vorlagen Wählen Sie="." Modus="ItemStyle">
<XSL:mit param Name="CurPos" Wählen Sie="$CurPosition" />
</XSL:anwenden-Vorlagen>
</XSL:Wenn>
<!--
Übergeben Sie aktuelle Position und Lastrow an die Gitter itemstyle.xsl Vorlage.
ItemStyle.xsl verwenden, die die offene ausgeben und schließen <Tabelle> Schlagwörter.
-->
<XSL:Wenn Test="@Style = "Grid"">
<XSL:anwenden-Vorlagen Wählen Sie="." Modus="ItemStyle">
<XSL:mit param Name="CurPos" Wählen Sie="$CurPosition" />
<XSL:mit param Name="Letzter" Wählen Sie="$LastRow" />
</XSL:anwenden-Vorlagen>
</XSL:Wenn>
<XSL:sonst>
<XSL:anwenden-Vorlagen Wählen Sie="." Modus="ItemStyle">
</XSL:anwenden-Vorlagen>
</XSL:sonst>
</XSL:Wählen Sie>
</XSL:Vorlage>
|
Die Kommentare werden der Zweck der Änderungen.
Natürlich, die "OuterTemplate.CallItemTemplate" nennt sich aus einer anderen Dokumentvorlage. Suchen Sie nach dieser Vorlage für diese Textzeichenfolge:
<XSL:Vorlage Name="OuterTemplate.Body">
Blättern Sie durch die Anweisungen im OuterTemplate.Body und fügen den LastRow-Parameter wie folgt ein (als Kommentar in kursiv dargestellt):
<XSL:Call-template Name="OuterTemplate.CallItemTemplate">
<XSL:mit param Name="CurPosition" Wählen Sie="$CurPosition" />
<!-- Den LastRow Parameter einfügen. -->
<XSL:mit param Name="LastRow" Wählen Sie="$LastRow"/>
</XSL:Call-template>
Nach all dem, Endlich haben wir die Dinge richtig einrichten, so dass unsere ItemStyle.xsl ausgeben kann <Tabelle> Markierungen an der richtigen Stelle.
ItemStyle.Xsl
HINWEIS: Wieder, ItemStyle.xsl nach Sie Änderungen vornehmen, so dass Sie die Auswirkungen dieser Änderungen sehen Einchecken.
Wir haben hier zwei Aufgaben:
- Ersetzen Sie die gesamte Grid-Vorlage. Sie können von unten kopieren.
- Fügen Sie einige Mumbo Jumbo außerhalb der Template-Definition, die "Formatcurrency ermöglicht" Vorlage arbeiten. (Sie können sagen, dass ich einen schwach Handle auf XSL).
Erste, im oberen Bereich der ItemStyle.xsl, Fügen Sie diese Zeile:
<!-- Einige Hokuspokus, die uns ermöglicht, U.S anzeigen. Währung. -->
<XSL:Dezimal-format Name="Personal" Ziffer="D" />
<XSL:Vorlage Name="Standard" Spiel="*" Modus="ItemStyle">
Beachten Sie, dass ich fügte hinzu, es direkt vor der <XSL:Vorlagenname = "Standard" …> Definition.
Nächste, gehen Sie zurück zu unserer Grid-Vorlage. Ersetzen Sie die gesamte Grid-Vorlage durch folgenden code. Es ist gründlich kommentierte, aber zögern Sie nicht, mich per e-Mail oder Kommentare auf meinem Blog zu hinterlassen, wenn Sie Fragen haben.
|
<XSL:Vorlage Name="Raster" Spiel="Zeile[@Style = "Grid"]" Modus="ItemStyle">
<!--
ContentMain.xsl übergibt, CurPos und zuletzt.
Wir verwenden diese bedingt die offene ausgeben und schließen <Tabelle> Schlagwörter.
-->
<XSL:param Name="CurPos" />
<XSL:param Name="Letzter" />
<!-- Die folgenden Variablen sind unverändert aus der Norm ItemStyle.xsl -->
<XSL:Variable Name="SafeImageUrl">
<XSL:Call-template Name="OuterTemplate.GetSafeStaticUrl">
<XSL:mit param Name="UrlColumnName" Wählen Sie=""ImageUrl""/>
</XSL:Call-template>
</XSL:Variable>
<XSL:Variable Name="SafeLinkUrl">
<XSL:Call-template Name="OuterTemplate.GetSafeLink">
<XSL:mit param Name="UrlColumnName" Wählen Sie=""LinkUrl""/>
</XSL:Call-template>
</XSL:Variable>
<XSL:Variable Name="DisplayTitle">
<XSL:Call-template Name="OuterTemplate.GetTitle">
<XSL:mit param Name="Titel" Wählen Sie="@Title"/>
<XSL:mit param Name="UrlColumnName" Wählen Sie=""LinkUrl""/>
</XSL:Call-template>
</XSL:Variable>
<XSL:Variable Name="LinkTarget">
<XSL:If Test="@OpenInNewWindow = 'True'" >_blank</XSL:If>
</XSL:Variable>
<!--
Hier definieren wir eine variable, "TableStart". Diese enthält den HTML-Code, mit dem wir die Eröffnung der Tabelle sowie die Spaltenbeschriftungen definieren. Beachten Sie, dass bei CurPos = 1, Es enthält den HTML-Code in einem CDATA-tag.
Ansonsten, Es wird leer sein.
Der Wert des TableStart ist ausgegeben, jedes Mal ItemStyle über ContentQueryMain.xsl aufgerufen wird.
-->
<XSL:Variable Name="tableStart">
<XSL:If Test="$CurPos = 1">
<![CDATA[
<Tabellenrahmen = 1>
<TR-Bgcolor = "blau">
<TD><Schriftfarbe = "White"><b>Projektname</b></Schriftart></TD>
<TD align = "Right"><Schriftfarbe = "White"><b>Vollständiges Datum</b></Schriftart></TD>
<TD align = "Right"><Schriftfarbe = "White"><b>Budget</b></Schriftart></TD>
<TD align = "Right"><Schriftfarbe = "White"><b>Tatsächliche Kosten</b></Schriftart></TD>
<TD><Schriftfarbe = "White"><b>Gesamtstatus</b></Schriftart></TD>
</TR>
]]>
</XSL:If>
</XSL:Variable>
<!--
Eine andere variable, Simple einfach definiert das schließende Tag Tabelle.
Wie bei tableStart, Es ist immer ausgegeben. Deshalb dessen Wert zugeordnet ist bedingt basierend auf, ob wir die letzte Zeile von ContentQueryMain.xsl übergeben wurde, haben.
-->
<XSL:Variable Name="Simple">
<XSL:If Test="$CurPos = $Last">
<![CDATA[ </Tabelle> ]]>
</XSL:If>
</XSL:Variable>
<!--
Strahlen Sie immer den Inhalt des tableStart. Ist dies nicht die erste Zeile von ContentQueryMain.xsl an uns übergeben, Wir wissen, dass ihr Wert leer sein wird.
Deaktivieren der Ausgabeschutz weil wenn TableStart es nicht blank, Es enthält aktuelle HTML, das wollen wir durch den Browser gerendert werden. Wenn wir sagen, nicht Ausgabe der XSL-Parser deaktivieren entkommen, Es werden Sachen wie generieren"<Tabelle>" anstelle von"<Tabelle>".
-->
<XSL:Wert der Wählen Sie="$tableStart" Das Disable-Output-escaping="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:Wert der Wählen Sie="@Project_x005F_x0020_Name"/>
</TD>
<TD ausrichten="rechts">
<XSL:Wert der Wählen Sie="@Project_x005F_x0020_End_x005F_x0020_Date"/>
</TD>
<TD ausrichten="rechts">
<XSL:Call-template Name="FormatCurrency">
<XSL:mit param Name="Wert" Wählen Sie="@Project_x005F_x0020_Budget"></XSL:mit param>
</XSL:Call-template>
</TD>
<TD ausrichten="rechts">
<XSL:Call-template Name="FormatCurrency">
<XSL:mit param Name="Wert" Wählen Sie="@Project_x005F_x0020_Expenses"> </XSL:mit param>
</XSL:Call-template>
</TD>
<TD>
<XSL:Wert der Wählen Sie="@Project_x005F_x0020_Status"/>
</TD>
<!--
Alle folgenden auskommentiert, Dinge zu klären.
Jedoch, bringen Sie es zurück und stopfen ihn in eine <TD> um seine Wirkung zu sehen.
-->
<!--
<Div Id = "Linkitem" Klasse = "Element">
<XSL:Wenn testen = "String-Length($SafeImageUrl) != 0">
<Div Class = "Bild-Raum-Links">
<a Href = "{$SafeLinkUrl}" Ziel = "{$LinkTarget}">
<IMG-Klasse = "Bild-fixed-Width" Src = "{$SafeImageUrl}" Alt = "{@ImageUrlAltText}"/>
</eine>
</div>
</XSL:If>
<Div Class = "Link-Element">
<XSL:Call-template Name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<a Href = "{$SafeLinkUrl}" Ziel = "{$LinkTarget}" Titel = "{@LinkToolTip}">
<XSL:Wert-wählen Sie "$DisXSLyTitle" = />
</eine>
<Div Class = "Beschreibung">
<XSL:Wert von select="@Description" />
</div>
</div>
</div>
-->
</TR>
<!--
Emit dem schließenden Tag Tabelle. Wenn wir nicht auf die letzte Zeile,
Dies wird leer sein..
-->
<XSL:Wert der Wählen Sie="$Simple" Das Disable-Output-escaping="Ja"/>
</XSL:Vorlage>
<XSL:Vorlage Name="FormatCurrency">
<XSL:param Name="Wert" Wählen Sie="0" />
<XSL:Wert der Wählen Sie='Format-Nummer($Wert, "$DDD,DDD,DDD.EDC, "Personal")' />
</XSL:Vorlage>
|