Преглед и цел
Надвор од кутијата, Мос’ Содржината Пребарување Веб Дел (CQWP) покажува своите резултати во листата формат, similar to search results. It is also possible to display the results in a grid format (i.e. HTML табела формат). Grid formats are better in some circumstances. I describe how to achieve that effect in this article.
Бизнис сценарио
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, како што е насловот, буџет, очекува завршување, remaining budget and other summary type fields. By "singleton" I mean a custom SharePoint list guaranteed to contain only one item. Simplistically, тоа би изгледало вака:
На технички пристап е речиси иста како што е опишано тука (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 вака генерира, кои се резултат:
|
<html>
<тело>
<центар>
<маса границата= 1>
<!-- Етикети ->
<tr bgcolor= Сина>
<td><фонт боја= Бело><б>Име на проектот</б></фонт></td>
<td усогласување на= Право><фонт боја= Бело><б>Заврши Датум</б></фонт></td>
<td усогласување на= Право><фонт боја= Бело><б>Буџет</б></фонт></td>
<td усогласување на= Право><фонт боја= Бело><б>Крај на трошоците</б></фонт></td>
<td><фонт боја= Бело><б>Целокупната состојба</б></фонт></td>
</tr>
<tr>
<td>Ре-жица компјутерска сала.</td>
<td усогласување на= Право>02/01/08</td>
<td усогласување на= Право>22,500.00</td>
<td усогласување на= Право>19,000.00</td>
<td>Во прогрес</td>
</tr>
<tr>
<td>Обезбедување сервери за SQL Надградба</td>
<td усогласување на= Право>04/01/08</td>
<td усогласување на= Право>7,500.00</td>
<td усогласување на= Право>0.00</td>
<td>Планирани</td>
</tr>
</маса>
</центар>
</тело>
</html>
|
Пристап
Следете ги овие чекори за да се создаде мрежа:
- Идентификација на компонентите на решетка (редови / колони).
- Дефинираат и да се создаде потребната сајт колони.
- Креирате под-сајтови за проекти и Singleton листи.
- Додадете CQWP на веб страница и конфигурирајте го да пребарувате за вашиот листи.
- Менувате XML на CQWP да собере дополнителни колони.
- Менувате XSL да генерира табела.
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 тука (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) и блог Хедер Соломон тука (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Ореви и завртки
Започнете и спроведување чекори едно преку пет, како за на MSDN документација и член Хедер Соломон.
Во овој момент, сте ги додале на вашиот CQWP на страница и имате <CommonViewFields> конфигуриран како што е потребно.
По вообичаените чекори, Јас се добијат овие средно резултати:
1. Креирај типот на содржина, a templatized custom list for that content type and two sites. Here is the content type:
Тука е сајт структура:
2. Додадете CQWP по создавањето на мојот проект под-сајтови и Singleton проект резиме листи:
3. Додадете сите дополнителни информации сакам преку <CommonViewFields>:
<сопственост име="CommonViewFields" тип="низа">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</сопственост>
Имајте на ум дека морав да ги задржи сите на имотот полиња на една линија или тоа не би работа (CQWP ќе ми каже дека барањето врати нема предмети).
4. Во овој момент, 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 да креираш кориснички / unghosted version of ItemStyle.xsl. I follow Heather’s advice, нагоре низ чекор 11 и да се овие средно резултати:
4.1: Името на мојата XSL дефиниција како што следува:
<XSL:template name="Grid" match="Row[@Style=’Grid’]" mode="itemstyle">
Јас исто така, малку менувате нејзиниот предложи <XSL:за секој- …> со додавање на <Br /> ознака за да се обезбеди почиста оглас:
<XSL:за секој- изберете="@ *">
P:<XSL:вредност на изберете="име()" /><BR/>
</XSL:за секој->
4.2: Јас менувате веб дел, go to appearance and select my "Grid" стил:
Применуваат промени и тука е резултат:
Можеме да видиме од погоре дека на полиња сакаме (Име на проектот, сметка, статус, итн) 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. На пример, we reference Project Status as "Project_x005F_x0020_Name".
Во овој момент, ќе заминеме од блог Хедер и од рамениците на овие гиганти, Додадам моето малку.
ContentQueryMain.xsl
ЗАБЕЛЕШКА: Кога правење на промени во двете ContentQueryMain.xsl како и ItemStyle.xsl, што треба да се провери оние датотеки назад, и пред да го видите ефектот на вашите промени.
За мрежа одлуки цели, 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 the "main" 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 <маса> ознака пред емитуваат првиот ред на податоци и затворање <маса> tag after emitting the last row. To accomplish this, ContentQueryMain.xsl is modified to pass two parameters to our "grid" дефиниција во ItemStyle.xsl, "last row" and "current row". ItemStyle.xsl uses these to conditionally emit the necessary tags.
Користење на техника Хедер Соломон, we locate ContentQueryMain.xsl. It is located in the same place as ItemStyle.xsl. This screen shot should help:
Ние треба да направите следниве промени:
- Менување на дефиниција XSL, "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 <маса> тагови.
- Modify another bit of ContentQueryMain.xsl that calls the "CallItemTemplate" to pass it a "LastRow" параметар, така што LastRow може да се пренесат на нашите Решетка дефиниција.
Locate the template named "OuterTemplate.CallItemTemplate" идентификувани од страна на низа:
<XSL:дефиниција име="OuterTemplate.CallItemTemplate">
Замени целата дефиниција како што следува:
|
<XSL:дефиниција име="OuterTemplate.CallItemTemplate">
<XSL:престанат име="CurPosition" />
<!--
Add the "LastRow" параметар.
We only use it when the item style pass in is "Grid".
-->
<XSL:престанат име="LastRow" />
<XSL:изберете>
<XSL:кога тест="@ Style = "NewsRollUpItem"">
<XSL:применува-шаблони изберете="." владата="itemstyle">
<XSL:со-Парам име="EditMode" изберете="$cbq_iseditmode" />
</XSL:применува-шаблони>
</XSL:кога>
<XSL:кога тест="@ Style = "NewsBigItem"">
<XSL:применува-шаблони изберете="." владата="itemstyle">
<XSL:со-Парам име="CurPos" изберете="$CurPosition" />
</XSL:применува-шаблони>
</XSL:кога>
<XSL:кога тест="@ Style = "NewsCategoryItem"">
<XSL:применува-шаблони изберете="." владата="itemstyle">
<XSL:со-Парам име="CurPos" изберете="$CurPosition" />
</XSL:применува-шаблони>
</XSL:кога>
<!--
Помине моментална позиција и lastrow да Мрежните itemstyle.xsl дефиниција.
ItemStyle.xsl ќе ја користат таа да се емитуваат на отворено и затворање <маса> тагови.
-->
<XSL:кога тест="@ Style = "Мрежа"">
<XSL:применува-шаблони изберете="." владата="itemstyle">
<XSL:со-Парам име="CurPos" изберете="$CurPosition" />
<XSL:со-Парам име="Последно" изберете="$LastRow" />
</XSL:применува-шаблони>
</XSL:кога>
<XSL:во спротивно>
<XSL:применува-шаблони изберете="." владата="itemstyle">
</XSL:применува-шаблони>
</XSL:во спротивно>
</XSL:изберете>
</XSL:дефиниција>
|
Коментари опише целта на промени.
Се разбира, the "OuterTemplate.CallItemTemplate" is itself called from another template. Locate that template by searching for this text string:
<XSL:дефиниција име="OuterTemplate.Body">
Движете се низ инструкциите во OuterTemplate.Body и вметнете ја параметар LastRow како што следува (прикажани како коментар во закосени букви):
<XSL:повик-дефиниција име="OuterTemplate.CallItemTemplate">
<XSL:со-Парам име="CurPosition" изберете="$CurPosition" />
<!-- Вметнете ја параметар LastRow. -->
<XSL:со-Парам име="LastRow" изберете="$LastRow"/>
</XSL:повик-дефиниција>
По сето ова, ние конечно работите се постави правилно, така што нашите ItemStyle.xsl можат да емитуваат <маса> тагови на вистинското место.
ItemStyle.Xsl
ЗАБЕЛЕШКА: Повторно, провери во ItemStyle.xsl по правење било какви промени, така што ќе го видите ефектот на тие промени.
Имаме две задачи овде:
- Replace the entire Grid template. You can copy/paste from below.
- Add some mumbo jumbo outside the template definition that enables "formatcurrency" template to work. (Можете да кажете дека имам слаб рачка на XSL).
Прва, во близина на врвот на ItemStyle.xsl, додадете оваа линија:
<!-- Некои mumbo џамбо што ни овозможува да се прикаже U.S. валута. -->
<XSL:децимална формат име="персонал" цифрениот="D" />
<XSL:дефиниција име="Стандардно" одговара="*" владата="itemstyle">
Имајте на ум дека јас се додава непосредно пред <XSL:template name="Default" …> дефиниција.
Следна, go back to our Grid template. Replace the entire Grid template with the code below. It is thoroughly commented, но немојте да се двоумите да ми пишете или оставете коментари на мојот блог, ако имате прашања.
|
<XSL:дефиниција име="Решетка" одговара="Ред[@ Style = "Мрежа"]" владата="itemstyle">
<!--
ContentMain.xsl поминува CurPos и Последен.
Ние ги користиме овие да се условно емитуваат на отворено и затворање <маса> тагови.
-->
<XSL:престанат име="CurPos" />
<XSL:престанат име="Последно" />
<!-- Следниве променливи се немодифицирана од стандардниот ItemStyle.xsl -->
<XSL:променлива име="SafeImageUrl">
<XSL:повик-дефиниција име="OuterTemplate.GetSafeStaticUrl">
<XSL:со-Парам име="UrlColumnName" изберете=""ImageUrl""/>
</XSL:повик-дефиниција>
</XSL:променлива>
<XSL:променлива име="SafeLinkUrl">
<XSL:повик-дефиниција име="OuterTemplate.GetSafeLink">
<XSL:со-Парам име="UrlColumnName" изберете=""LinkUrl""/>
</XSL:повик-дефиниција>
</XSL:променлива>
<XSL:променлива име="DisplayTitle">
<XSL:повик-дефиниција име="OuterTemplate.GetTitle">
<XSL:со-Парам име="Наслов" изберете="@ Наслов"/>
<XSL:со-Парам име="UrlColumnName" изберете=""LinkUrl""/>
</XSL:повик-дефиниција>
</XSL:променлива>
<XSL:променлива име="LinkTarget">
<XSL:ако тест="@ OpenInNewWindow = 'точно'" >_blank</XSL:ако>
</XSL:променлива>
<!--
Еве ние се дефинира променлива, "tableStart". Таа содржи HTML
. Имајте на ум дека ако CurPos = 1, тоа вклучува HTML во таг CDATA.
Во спротивно, таа ќе биде празна.
Вредноста на tableStart е emited секој пат ItemStyle се вика преку
.
-->
<XSL:променлива име="tableStart">
<XSL:ако тест="$CurPos = 1">
<![CDATA[
<маса границата = 1>
<tr bgcolor="blue">
<td><font color="white"><б>Име на проектот</б></фонт></td>
<td align="right"><font color="white"><б>Заврши Датум</б></фонт></td>
<td align="right"><font color="white"><б>Буџет</б></фонт></td>
<td align="right"><font color="white"><б>Крај на трошоците</б></фонт></td>
<td><font color="white"><б>Целокупната состојба</б></фонт></td>
</tr>
]]>
</XSL:ако>
</XSL:променлива>
<!--
Уште една променлива, tableEnd едноставно дефинира затворање табелата таг.
Како и со tableStart, тоа е секогаш emited. Ова е причината зошто неговата вредност е
.
-->
<XSL:променлива име="tableEnd">
<XSL:ако тест="$CurPos = $ Минатата">
<![CDATA[ </маса> ]]>
</XSL:ако>
</XSL:променлива>
<!--
Секогаш емитуваат на содржината на tableStart. Ако ова не е прв
, тогаш знаеме неговата вредност
.
Оневозможи излез избега, бидејќи кога tableStart не го полето празно, тоа
. Ако
, it will generate
stuff like "<маса>" instead of "<маса>".
-->
<XSL:вредност на изберете="$tableStart" disable-излез-бегство="Да"/>
<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:вредност на изберете="@ Project_x005F_x0020_Name"/>
</td>
<td усогласување на="право">
<XSL:вредност на изберете="@ Project_x005F_x0020_End_x005F_x0020_Date"/>
</td>
<td усогласување на="право">
<XSL:повик-дефиниција име="formatcurrency">
<XSL:со-Парам име="вредност" изберете="@ Project_x005F_x0020_Budget"></XSL:со-Парам>
</XSL:повик-дефиниција>
</td>
<td усогласување на="право">
<XSL:повик-дефиниција име="formatcurrency">
<XSL:со-Парам име="вредност" изберете="@ Project_x005F_x0020_Expenses"> </XSL:со-Парам>
</XSL:повик-дефиниција>
</td>
<td>
<XSL:вредност на изберете="@ Project_x005F_x0020_Status"/>
</td>
<!--
Сите од следниве е коментира надвор да се разјаснат работите.
Сепак, да се вратиме и работи го во <td> да ја видиме нејзината
.
-->
<!--
<div id="linkitem" class="item">
<XSL:if test="string-length($SafeImageUrl) != 0">
<div class="image-area-left">
<a href="{$SafeLinkUrl}" target="{$LinkTarget}">
<img class="image-fixed-width" src="{$SafeImageUrl}" alt="{@ ImageUrlAltText}"/>
</на>
</div>
</XSL:ако>
<div class="link-item">
<XSL:повик-дефиниција name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<a href="{$SafeLinkUrl}" target="{$LinkTarget}" title="{@ LinkToolTip}">
<XSL:value-of select="$DisplayTitle"/>
</на>
<div class="description">
<XSL:value-of select="@Description" />
</div>
</div>
</div>
-->
</tr>
<!--
Емитуваат на завршната табела таг. Ако ние не сме на последниот ред,
ова ќе биде празна.
-->
<XSL:вредност на изберете="$tableEnd" disable-излез-бегство="Да"/>
</XSL:дефиниција>
<XSL:дефиниција име="formatcurrency">
<XSL:престанат име="вредност" изберете="0" />
<XSL:вредност на изберете="формат-број($вредност, "$DDD,ДДД,DDD.DD", "staff")" />
</XSL:дефиниција>
|