Przegląd i cel
Po wyjęciu z pudełka, MOSS’ Web Part Kwerenda zawartości (CQWP) jego wyniki są wyświetlane w formie listy, podobne do wyników wyszukiwania. Jest również możliwe, aby wyświetlić wyniki w formacie siatki (tj.. Format tabeli HTML). Siatki formaty są lepsze w pewnych okolicznościach. Opisano, jak osiągnąć taki efekt w tym artykule.
Scenariusza biznesowego
Ja pracowałem z klientem na wypuszczenie MOSS enterprise-wide. Zaprojektowaliśmy ich taksonomia, takie, że projekty są pierwszej klasy obywateli w hierarchii i mają własne witryny najwyższego poziomu. Menedżerowie projektów prowadzi listę pojedynczych informacje podsumowujące projekt, przykład tytułem, budżet, przewidywane zakończenie dnia, pozostałe budżetu i innych pól typu podsumowania. Przez "pojedyncza" Chodzi mi o niestandardowej listy programu SharePoint gwarantowana zawierają tylko jeden element. Upraszczając, wygląda to:
Podejścia technicznego jest tak samo jak opisane tutaj (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!447.entry). CQWP używa transformatę XSL do emitują HTML do przeglądarki do renderowania.
Zawsze wyobrazić wynik przed nurkowania w XSL, ponieważ XSL jest koszmar. Oto mój rezultat:
HTML jak to generuje wynik:
|
<HTML>
<organ>
<centrum>
<Tabela granica= 1>
<!-- Etykiety-->
<TR kolor tła= niebieski>
<TD><czcionki Kolor= biały><b>Nazwa projektu</b></czcionki></TD>
<TD wyrównać= prawo><czcionki Kolor= biały><b>Pełna Data</b></czcionki></TD>
<TD wyrównać= prawo><czcionki Kolor= biały><b>Budżet</b></czcionki></TD>
<TD wyrównać= prawo><czcionki Kolor= biały><b>Rzeczywisty koszt</b></czcionki></TD>
<TD><czcionki Kolor= biały><b>Ogólny stan</b></czcionki></TD>
</TR>
<TR>
<TD>Ponownie drutu sali komputerowej.</TD>
<TD wyrównać= prawo>02/01/08</TD>
<TD wyrównać= prawo>22,500.00</TD>
<TD wyrównać= prawo>19,000.00</TD>
<TD>W toku</TD>
</TR>
<TR>
<TD>Przepis serwerów SQL Upgrade</TD>
<TD wyrównać= prawo>04/01/08</TD>
<TD wyrównać= prawo>7,500.00</TD>
<TD wyrównać= prawo>0.00</TD>
<TD>Planowane</TD>
</TR>
</Tabela>
</centrum>
</organ>
</HTML>
|
Podejście
Wykonaj następujące kroki, aby utworzyć siatkę:
- Identyfikacja składników sieci (wierszy/kolumn).
- Definiowanie i tworzenie kolumn niezbędne witryny.
- Tworzenie podstrony dla projektów i pojedynczych list.
- Dodawanie CQWP do strony sieci web i skonfigurować go do wyszukiwania list.
- Zmodyfikować XML CQWP zebrać dodatkowe kolumny.
- Modyfikowanie XSL do tworzenia tabela.
Mam zamiar koncentrować się na numer sześć. Numery jeden przez cztery są prosto do przodu i coś, co każdy użytkownik CQWP już zrobione. Numer pięć zostało dobrze udokumentowane przez innych tym ten wyczerpujący artykuł ładunkiem zrzut ekranu z MSDN tutaj (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) i Heather Solomon's blog tutaj (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Nakrętki i śruby
Rozpocząć i wykonania czynności z jednego do pięciu jak w dokumentacji MSDN i Heather Solomona art.
W tym momencie, Twój CQWP dodane do strony i masz swoje <CommonViewFields> skonfigurowane jako niezbędne.
Po zwykłe czynności, Mogę dostać tych wyników pośrednich:
1. Utworzyć typ zawartości, przechowywaną listy niestandardowej zawartości typu i dwóch stron. Tutaj jest typ zawartości:
Oto struktura witryny:
2. Dodać CQWP po utworzeniu mój podwitryn projektu i pojedynczych list podsumowanie projektu:
3. Dodaj wszystkie dodatkowe informacje chcesz, za pośrednictwem <CommonViewFields>:
<Właściwość Nazwa="CommonViewFields" Typ="ciąg">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</Właściwość>
Uwaga, że aby zachować wszystkie pola właściwość na jednej linii, albo nie będzie działać (CQWP powie mi, że kwerenda zwróciła żadnych elementów).
4. W tym momencie, Jesteśmy gotowi przejść poza w artykule MSDN i klapki na ponad do artykułu Heather Solomona. Jej kroki w pobliżu krok #5 Aby utworzyć niestandardowe / Unghosted wersja ItemStyle.xsl. Heather rad, się przez kroku 11 i dostać tych wyników pośrednich:
4.1: Następująca nazwa mój szablon XSL:
<XSL:Nazwa szablonu = "siatki" mecz = "wiersz[@Style = "Siatka"]" tryb = "itemstyle">
Również nieco zmodyfikować jej zaproponował <XSL:dla każdego …> dodając <BR /> Tag, aby dostarczyć listę czystsze:
<XSL:dla każdego Wybierz="@*">
P:<XSL:wartość z Wybierz="Nazwa()" /><BR/>
</XSL:dla każdego>
4.2: Zmodyfikować składnik web part, Przejdź do wygląd i wybierz moje siatki"" styl:
Zastosować zmiany i oto wynik:
Widać z powyższego, że pola chcemy (Nazwa projektu, koszt, stan, itp) są dostępne dla nas do wykorzystania podczas emitujemy HTML. Nie tylko, że, ale możemy zobaczyć nazwy, przez które możemy odwołać tych kolumn w XSL. Na przykład, możemy odwołać stan projektu jako "Project_x005F_x0020_Name".
W tym momencie, Odjazd z Heather blog i ramionach tych gigantów, Dodać własną trochę.
ContentQueryMain.xsl
UWAGA: Podczas dokonywania zmian zarówno ContentQueryMain.xsl, jak również ItemStyle.xsl, trzeba sprawdzić, że te pliki z powrotem przed można zobaczyć efekt wprowadzonych zmian.
Dla celów tworzenia siatki, MOSS używa dwóch różnych plików XSL do wyników, które widzimy z CQWP. Do wygenerowania poprzedniego trochę wyjście, zmodyfikowaliśmy ItemStyle.xsl. MOSS faktycznie korzysta z innego pliku XSL, ContentQueryMain.xsl się w połączeniu z ItemStyle.xsl do generowania jej HTML. Jak sama nazwa wskazuje, ContentQueryMain.xsl jest głównym"" XSL, który kontroluje ogólny przepływ tłumaczenie. Iterację wszystkich znalezionych przedmiotów i przekazuje je jeden po drugim do szablonów w ItemStyle.xsl. Modyfikujemy będziesz ItemStyle.xsl do generowania otwarte <Tabela> znacznik przed wyemitowaniem pierwszy wiersz danych i zamknięcia <Tabela> znacznik po emitujących ostatni wiersz. Aby to osiągnąć, ContentQueryMain.xsl jest zmodyfikowany przejść dwa parametry do naszej sieci"" szablon w ItemStyle.xsl, "Ostatni wiersz" i "bieżący wiersz". ItemStyle.xsl używa tych warunkowo emitować niezbędne znaczniki.
Przy użyciu techniki Heather Solomona, Znajdź ContentQueryMain.xsl. Znajduje się on w tym samym miejscu jako ItemStyle.xsl. Ten zrzut ekranu powinna pomóc:
Musimy wprowadzić następujące zmiany:
- Modyfikowanie szablonu xsl, "CallItemTemplate" że rzeczywiście wywołuje nasz szablon siatki w ItemStyle.xsl. Przekażemy dwa parametry do szablonu siatki, tak, że będzie on danych potrzebnych do wygenerowania warunkowo otwieranie i zamykanie <Tabela> znaczniki.
- Zmodyfikować nieco innego ContentQueryMain.xsl, który wywołuje "CallItemTemplate" Aby przekazać ją "LastRow" parametr tak że LastRow mogą być przekazane do naszego szablonu siatki.
Zlokalizuj szablon o nazwie "OuterTemplate.CallItemTemplate" zidentyfikowane przez ciąg:
<XSL:szablon Nazwa="OuterTemplate.CallItemTemplate">
Zastąpić cały szablon następujący:
|
<XSL:szablon Nazwa="OuterTemplate.CallItemTemplate">
<XSL:parametr Nazwa="CurPosition" />
<!--
Dodać "LastRow" parametr.
Tylko używamy go, gdy element stylu przejść w "Siatki".
-->
<XSL:parametr Nazwa="LastRow" />
<XSL:Wybierz>
<XSL:Kiedy badania="@Style = "NewsRollUpItem"">
<XSL:zastosowanie szablonów Wybierz="." tryb="itemstyle">
<XSL:z param Nazwa="EditMode" Wybierz="$cbq_iseditmode" />
</XSL:zastosowanie szablonów>
</XSL:Kiedy>
<XSL:Kiedy badania="@Style = "NewsBigItem"">
<XSL:zastosowanie szablonów Wybierz="." tryb="itemstyle">
<XSL:z param Nazwa="CurPos" Wybierz="$CurPosition" />
</XSL:zastosowanie szablonów>
</XSL:Kiedy>
<XSL:Kiedy badania="@Style = "NewsCategoryItem"">
<XSL:zastosowanie szablonów Wybierz="." tryb="itemstyle">
<XSL:z param Nazwa="CurPos" Wybierz="$CurPosition" />
</XSL:zastosowanie szablonów>
</XSL:Kiedy>
<!--
Przekazać aktualną pozycję i lastrow siatki itemstyle.xsl szablon.
ItemStyle.xsl będzie używać, aby emitować Otwórz i zamknij <Tabela> znaczniki.
-->
<XSL:Kiedy badania="@Style = "Siatka"">
<XSL:zastosowanie szablonów Wybierz="." tryb="itemstyle">
<XSL:z param Nazwa="CurPos" Wybierz="$CurPosition" />
<XSL:z param Nazwa="Ostatnia" Wybierz="$LastRow" />
</XSL:zastosowanie szablonów>
</XSL:Kiedy>
<XSL:w przeciwnym razie>
<XSL:zastosowanie szablonów Wybierz="." tryb="itemstyle">
</XSL:zastosowanie szablonów>
</XSL:w przeciwnym razie>
</XSL:Wybierz>
</XSL:szablon>
|
Komentarze opisać w celu zmiany.
Oczywiście, "OuterTemplate.CallItemTemplate" nazywa się z innego szablonu. Zlokalizować ten szablon szukając ten ciąg tekstowy:
<XSL:szablon Nazwa="OuterTemplate.Body">
Przejrzyj instrukcje w OuterTemplate.Body i wstawić następujący parametr LastRow (się jako komentarz kursywą):
<XSL:Wywołanie szablon Nazwa="OuterTemplate.CallItemTemplate">
<XSL:z param Nazwa="CurPosition" Wybierz="$CurPosition" />
<!-- Wstaw parametr LastRow. -->
<XSL:z param Nazwa="LastRow" Wybierz="$LastRow"/>
</XSL:Wywołanie szablon>
Po tym wszystkim, Wreszcie mamy ustawione prawidłowo, tak aby nasi ItemStyle.xsl może emitować rzeczy <Tabela> Tagi na właściwym miejscu.
ItemStyle.Xsl
UWAGA: Ponownie, Sprawdź w ItemStyle.xsl po dokonaniu zmian, tak że można zobaczyć efekt tych zmian.
Mamy tutaj dwa zadania:
- Zastąpić cały szablon siatki. Można można skopiować i wkleić poniżej.
- Dodać niektóre mumbo jumbo poza definicją szablonu, który umożliwia "formatcurrency" szablon do pracy. (Można powiedzieć, że mam wątpliwy uchwyt na XSL).
Pierwszy, w górnej części ItemStyle.xsl, Dodaj tę linię:
<!-- Niektóre mumbo jumbo, że pozwala na wyświetlanie Stanów Zjednoczonych. waluty. -->
<XSL:zapisie dziesiętnym Nazwa="personel" cyfra="D" />
<XSL:szablon Nazwa="Domyślnie" mecz="*" tryb="itemstyle">
Uwaga, że dodałem go bezpośrednio przed <XSL:Nazwa szablonu = "domyślny" …> Definicja.
Następny, Wróć do naszego szablonu siatki. Zastąpić cały szablon siatki poniższy kod. To jest dokładnie skomentował, ale nie wahaj się napisz do mnie lub zostawić komentarz na moim blogu, jeśli masz pytania.
|
<XSL:szablon Nazwa="Siatka" mecz="Wiersz[@Style = "Siatka"]" tryb="itemstyle">
<!--
ContentMain.xsl przechodzi CurPos i ostatnio.
Możemy z nich korzystać do warunkowo emitują Otwórz i zamknij <Tabela> znaczniki.
-->
<XSL:parametr Nazwa="CurPos" />
<XSL:parametr Nazwa="Ostatnia" />
<!-- Następujące zmienne są niezmodyfikowany od standardowego ItemStyle.xsl -->
<XSL:Zmienna Nazwa="SafeImageUrl">
<XSL:Wywołanie szablon Nazwa="OuterTemplate.GetSafeStaticUrl">
<XSL:z param Nazwa="UrlColumnName" Wybierz="'ImageUrl'"/>
</XSL:Wywołanie szablon>
</XSL:Zmienna>
<XSL:Zmienna Nazwa="SafeLinkUrl">
<XSL:Wywołanie szablon Nazwa="OuterTemplate.GetSafeLink">
<XSL:z param Nazwa="UrlColumnName" Wybierz=""LinkUrl""/>
</XSL:Wywołanie szablon>
</XSL:Zmienna>
<XSL:Zmienna Nazwa="DisplayTitle">
<XSL:Wywołanie szablon Nazwa="OuterTemplate.GetTitle">
<XSL:z param Nazwa="Tytuł" Wybierz="@Title"/>
<XSL:z param Nazwa="UrlColumnName" Wybierz=""LinkUrl""/>
</XSL:Wywołanie szablon>
</XSL:Zmienna>
<XSL:Zmienna Nazwa="LinkTarget">
<XSL:Jeśli badania="@OpenInNewWindow = "True"" >_blank</XSL:Jeśli>
</XSL:Zmienna>
<!--
Tutaj możemy zdefiniować zmienną, "tableStart". Zawiera kod HTML, którego używamy do określenia otwarcia tabeli, a także etykiety kolumn. Należy zauważyć, że jeśli CurPos = 1, zawiera kod HTML w znacznik CDATA.
W przeciwnym razie, to będzie pusty.
Wartość tableStart jest emited każdym razem, gdy ItemStyle jest wywoływana przez ContentQueryMain.xsl.
-->
<XSL:Zmienna Nazwa="tableStart">
<XSL:Jeśli badania="$CurPos = 1">
<![CDATA[
<obramowanie tabeli = 1>
<TR bgcolor = "blue">
<TD><kolor czcionki = "biały"><b>Nazwa projektu</b></czcionki></TD>
<TD align = "right"><kolor czcionki = "biały"><b>Pełna Data</b></czcionki></TD>
<TD align = "right"><kolor czcionki = "biały"><b>Budżet</b></czcionki></TD>
<TD align = "right"><kolor czcionki = "biały"><b>Rzeczywisty koszt</b></czcionki></TD>
<TD><kolor czcionki = "biały"><b>Ogólny stan</b></czcionki></TD>
</TR>
]]>
</XSL:Jeśli>
</XSL:Zmienna>
<!--
Innej zmiennej, tableEnd po prostu Określa zamknięcie tabela tagu.
Podobnie jak w przypadku tableStart, to jest zawsze emited. Dlatego, jego wartość jest przypisany warunkowo na podstawie czy już zostały mijamy ostatni wiersz ContentQueryMain.xsl.
-->
<XSL:Zmienna Nazwa="tableEnd">
<XSL:Jeśli badania="$CurPos = $Last">
<![CDATA[ </Tabela> ]]>
</XSL:Jeśli>
</XSL:Zmienna>
<!--
Zawsze emitują zawartość tableStart. Jeśli to nie jest pierwszy wiersz przekazane nam przez ContentQueryMain.xsl, wtedy wiemy, że jego wartość będzie pusty.
Wyłącz wyjście ucieczki, bo kiedy tableStart to nie puste, obejmuje ona rzeczywisty kod HTML, który chcemy być renderowane przez przeglądarkę. Jeśli nie powiemy parser XSL do wyłączenia wyjścia ucieczki, będzie ona wytwarzać rzeczy, jak"<Tabela>" zamiast o"<Tabela>".
-->
<XSL:wartość z Wybierz="$tableStart" Wyłącz output escaping="tak"/>
<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:wartość z Wybierz="@Project_x005F_x0020_Name"/>
</TD>
<TD wyrównać="prawo">
<XSL:wartość z Wybierz="@Project_x005F_x0020_End_x005F_x0020_Date"/>
</TD>
<TD wyrównać="prawo">
<XSL:Wywołanie szablon Nazwa="FormatCurrency">
<XSL:z param Nazwa="wartość" Wybierz="@Project_x005F_x0020_Budget"></XSL:z param>
</XSL:Wywołanie szablon>
</TD>
<TD wyrównać="prawo">
<XSL:Wywołanie szablon Nazwa="FormatCurrency">
<XSL:z param Nazwa="wartość" Wybierz="@Project_x005F_x0020_Expenses"> </XSL:z param>
</XSL:Wywołanie szablon>
</TD>
<TD>
<XSL:wartość z Wybierz="@Project_x005F_x0020_Status"/>
</TD>
<!--
Wszystkie z poniższych jest zakomentowana wyjaśnienie rzeczy.
Jednakże, ją z powrotem i rzeczy go do <TD> Aby zobaczyć jego efekt.
-->
<!--
<DIV id = "linkitem" Class = "pozycja">
<XSL:Jeśli test = "długość ciąg($SafeImageUrl) != 0">
<DIV class = "obrazu obszar-po lewej">
<href = "{$SafeLinkUrl}" docelowy = "{$LinkTarget}">
<Klasa img = "obraz fixed-width" src = "{$SafeImageUrl}" Alt = "{@ImageUrlAltText}"/>
</a>
</DIV>
</XSL:Jeśli>
<DIV class = "link pozycja">
<XSL:Wywołanie szablon Name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<href = "{$SafeLinkUrl}" docelowy = "{$LinkTarget}" tytuł = "{@LinkToolTip}">
<XSL:wartość z wybierz = "$DisXSLyTitle" />
</a>
<DIV class = "opis">
<XSL:wartość z select="@Description" />
</DIV>
</DIV>
</DIV>
-->
</TR>
<!--
Emitują zamknięcia tabeli tagu. Jeśli nie jesteśmy na ostatni wiersz,
to będzie pusty.
-->
<XSL:wartość z Wybierz="$tableEnd" Wyłącz output escaping="tak"/>
</XSL:szablon>
<XSL:szablon Nazwa="FormatCurrency">
<XSL:parametr Nazwa="wartość" Wybierz="0" />
<XSL:wartość z Wybierz='numer formatu($wartość, "$DDD,DDD,DDD.DD", "personel")' />
</XSL:szablon>
|