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ść" |
To było bardzo przydatne. Dziękujemy!
AAA… było, bo inaczej o nazwie mój styl listy i nie zdawałem sobie sprawy, że w ContentQueryMain.xsl sprawdza "styl":
<XSL:Kiedy test="@Style='NameOfMyStyle'">
Z tym przemianowany ono pracował. 🙂
To prawie pracował dla mnie: Udaje mi się wyjście </Tabela> koniec tagu poprawnie, ale brakuje znacznika początkowego. Wydaje się test = "$CurPos = 1" nie zwraca true. Ale dlaczego?
Wielki Post. Paweł mam zrobić wszystkie te rzeczy. Mam zapytanie, Jak puszka metalowa ja osiągnąć sumą "całkowita Expences rzeczywiste" lub sumę wartości dwóch kolumn.
Możesz zrobić żadnej pracy przy tworzeniu niestandardowych plików xsl ContentQueryMain i ItemStyle? Powodem, dla którego pytam jest to, że nie chcą się martwić o moje niestandardowe style zastąpieniem wszelkie poprawki lub aktualizacji. Czy masz przykłady? Próbowałem Dokonywanie identycznych kopii ContentQueryMain.xsl i wgraniu nowych niestandardowych kopia do biblioteki stylów. Po umieszczeniu odwołanie do tego pliku xsl w jego Właściwość MainXslLink, Otrzymuję 401 nie dozwolone. Plik xsl niestandardowe jest opublikowana wersja i każdy ma dostęp do odczytu do niego.
fantastyczny post dzięki! Zostały walczy z tym teraz w ciągu ostatnich kilku dni.
Cześć, to było bardzo pomocne delegowania. Mam to wszystko działa, i zmiana również wdrożony Mike Brown tak to grupy
wyniki wewnątrz tabeli przez co wybrać jako parametru Group By w CQWB właściwości.
Zrobiłem tytuł łącza również, tak działa ładnie. Mam jeszcze jeden problem, choć. Jestem grupowanie wyników przez Nazwa witryny. Wewnątrz tabeli, grupuje je ładnie, i świetnie wygląda, ale nadal jest wydrukowanie wszystkie grupy
nazwy(w moim przypadku nazwy lokacji) powyżej tabeli. Czy ktoś wie jak pozbyć się z nich?
Podziękowania,
Greg
Fajny artykuł. Udało mi się dać moim stole wygląd domyślnej listy programu Sharepoint poprzez analizę kodu źródłowego listy. Oto główne bloki HTML musiała zmieścić się w ItemStyle:
<Szerokość stołu = "100%" Klasa = "ms-listviewtable" border = 0 cellspacing = 0 cellpadding = 1 dir = "None">
<!–NAGŁÓWEK–>
<Klasa TR = "ms-viewheadertr" PIONIE = TOP>
<TH nowrap zakres = "col" Klasa = "ms-vh2"><DIV styl = "szerokość:100%;stanowisko:względne;lewy:0;Do góry:0;">
<Styl tabeli = "szerokość:100%;" CtxNum = "1" wysokość = "100%" cellspacing = 1 cellpadding = klasy 0 = "ms-unselectedtitle">
<TR>
<Szerokosci TD = "100%" Klasa = "ms-vb" nowrap>
Texte du miano ici
</TD>
<Styl TD = "pozycji:bezwzględne;">
</TD>
</TR>
</TABELA></DIV>
</TH>
<!–Powtórzyć wszystkie komórki nagłówka–>
</TR>
<!– Tabela danych –>
<Klasa TR = "">
<!–Kolumny danych, Użyj kod Pawła za pierwszym razem z hiperłączem –>
<Klasa TD = "ms-vb2">Dane tutaj</TD>
<!–Pusta kolumna–>
<Klasa TD = "ms-vb2">
<obejmują dir = None></zakres><
/TD>
<!–Kolumna Data–>
<Klasa TD = "ms-vb2">
<WSZELKIE PRAWA>11/12/2008</WSZELKIE PRAWA>
</TD>
</TR>
<!–***Naprzemiennych wierszy – Użyj nowej zmiennej XSL, że wstawi alternatywne klasy oparte na bieżącym wierszu modulo 2–>
<Klasa TR = "ms-na przemian">
…
</TR>
</TABELA>
Thatz właśnie szukałem...Ty skała człowiek...Niech żyje...Kocham Cię za post..
<XSL:zastosowanie szablonów wybierz = "." tryb = "itemstyle">
<XSL:z parametr Nazwa = "CurPos" Wybierz = "$CurPosition" />
<XSL:Nazwa z param = ostatnia" Wybierz = "$LastRow" />
<XSL:z parametr Nazwa = "StartNewGroup" SELECT="@__begingroup" />
</XSL:Kiedy>
<XSL:Kiedy test = "$StartNewGroup ="True"">
<TR>
<TD >
<XSL:Wywołanie szablon name="OuterTemplate.GetGroupName">
<XSL:Nazwa z param = "nazwa_grupy" SELECT="@*[Nazwa()= $Group]"/>
<XSL:Nazwa z param = "GroupType" Wybierz = "$GroupType" />
</XSL:Wywołanie szablon>
</TD>
</TR>
</XSL:Kiedy>
<XSL:w przeciwnym razie>
</XSL:w przeciwnym razie>
</XSL:Wybierz>
Hi Paul,
Podczas pracy z składnika web part kwerendy xml/xsl i zawartości, znalazłeś jakieś dobre sposoby, aby sformatować swojego xslt? Stara się wprowadzać zmiany i przetestować projekt okazuje prawo ból ** tylko za pomocą edytora tekstu…
Wszystkiego najlepszego
(np.. https://myweb.com/Marketing/images/icn-order.gif, )
Należy użyć obrazu lub obraz w CommonViewFields pole typu? (np.. InternalColumnName, Obraz)
Twój post jest dokładnie co ja był patrząc pod kątem. Jednakże, Nie kumam do pracy.
Mam dokumenty, które są przechowywane w różnych doc. biblioteki ale klasyfikowane za pomocą kolumny niestandardowe klasy (wybór: 1 lub 2. Ja potrzeba wobec używać CQWP aby pokazać te dokumenty w oparciu o ich Klasa.
Udało mi się dodać CQWP, wyeksportować go do SPD, skonfigurować itemStyle.xls aby wyświetlić niestandardowe fileds w widoku listy. Jednakże, Nie można pomyślnie wdrożyć co tu opisujesz.
Są kolumny, które chcesz, aby pokazać w moim CQWP:
Typ pliku (Aby wyświetlić ikonę)
Nazwa pliku
Data ostatniej modyfikacji
Zmodyfikowane przez Who
Wyewidencjonowany
Sprawdzone w komentarzach
Obecnie mam wynik w formacie listy. Jak zmienić go na format talble.
Podziękowania.
Saji
Przepraszam za missspelling na moje nazwisko nie wiesz gdzie ” pochodzi z.