Агляд і мэты
З скрынкі, MOSS’ Запыт змесціва вэб-часткі (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>
<!-- Этыкетка ->
<тр BGCOLOR= Сіні>
<TD><шрыфт колер= Белы><B>Назва праекта</B></шрыфт></TD>
<TD выраўнаваць= Правы><шрыфт колер= Белы><B>Поўная дата</B></шрыфт></TD>
<TD выраўнаваць= Правы><шрыфт колер= Белы><B>Бюджэт</B></шрыфт></TD>
<TD выраўнаваць= Правы><шрыфт колер= Белы><B>Фактычны расход</B></шрыфт></TD>
<TD><шрыфт колер= Белы><B>Агульны стан</B></шрыфт></TD>
</тр>
<тр>
<TD>Re-правадной кампутарная зала.</TD>
<TD выраўнаваць= Правы>02/01/08</TD>
<TD выраўнаваць= Правы>22,500.00</TD>
<TD выраўнаваць= Правы>19,000.00</TD>
<TD>In Progress</TD>
</тр>
<тр>
<TD>Прадастаўленне сервераў для абнаўлення SQL</TD>
<TD выраўнаваць= Правы>04/01/08</TD>
<TD выраўнаваць= Правы>7,500.00</TD>
<TD выраўнаваць= Правы>0.00</TD>
<TD>Запланаваны</TD>
</тр>
</стол>
</цэнтр>
</цела>
</HTML>
|
Падыход
Выканайце наступныя крокі для стварэння сеткі:
- Апісанне кампанентаў сеткі (радкоў / слупкоў).
- Вызначыць і стварыць неабходныя слупкі сайта.
- Стварэнне сайтаў для суб праектаў і Сінглтан спісы.
- Дадаць 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 пасля стварэння майго праекта даччыных сайтаў і спісаў Сінглтан рэзюмэ праекта:
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:коштам ад выбіраць="імя()" /><бр/>
</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:калі тэст="@ Стыль = 'NewsRollUpItem'">
<XSL:Apply-шаблоны выбіраць="." рэжым="ItemStyle">
<XSL:з параметрам- імя="EditMode" выбіраць="$cbq_iseditmode" />
</XSL:Apply-шаблоны>
</XSL:калі>
<XSL:калі тэст="@ Стыль = 'NewsBigItem'">
<XSL:Apply-шаблоны выбіраць="." рэжым="ItemStyle">
<XSL:з параметрам- імя="CurPos" выбіраць="$CurPosition" />
</XSL:Apply-шаблоны>
</XSL:калі>
<XSL:калі тэст="@ Стыль = 'NewsCategoryItem'">
<XSL:Apply-шаблоны выбіраць="." рэжым="ItemStyle">
<XSL:з параметрам- імя="CurPos" выбіраць="$CurPosition" />
</XSL:Apply-шаблоны>
</XSL:калі>
<!--
Перадаць бягучае становішча і LASTROW ў шаблон ItemStyle.xsl Сетка.
ItemStyle.xsl будзе выкарыстоўваць гэта, каб выпраменьваць адкрытыя і закрыццё <стол> тэгі.
-->
<XSL:калі тэст="Стыль @ = "Сетка"">
<XSL:Apply-шаблоны выбіраць="." рэжым="ItemStyle">
<XSL:з параметрам- імя="CurPos" выбіраць="$CurPosition" />
<XSL:з параметрам- імя="Апошні" выбіраць="$LASTROW" />
</XSL:Apply-шаблоны>
</XSL:калі>
<XSL:у адваротным выпадку>
<XSL:Apply-шаблоны выбіраць="." рэжым="ItemStyle">
</XSL:Apply-шаблоны>
</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, дадайце гэты радок:
<!-- Некаторыя фетыш, які дазваляе нам прадстаўляць U.S. валюта. -->
<XSL:дзесятковы фармат імя="персанал" лічба="Рэ" />
<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:шаблон імя="Сетка" супадаць="Радок[Стыль @ = "Сетка"]" рэжым="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:з параметрам- імя="Назва" выбіраць="@ Title"/>
<XSL:з параметрам- імя="UrlColumnName" выбіраць="'LinkUrl'"/>
</XSL:выклік-шаблону>
</XSL:пераменная>
<XSL:пераменная імя="LinkTarget">
<XSL:калі тэст="@ OpenInNewWindow = 'True'" >_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"><B>Назва праекта</B></шрыфт></TD>
<td align="right"><font color="white"><B>Поўная дата</B></шрыфт></TD>
<td align="right"><font color="white"><B>Бюджэт</B></шрыфт></TD>
<td align="right"><font color="white"><B>Фактычны расход</B></шрыфт></TD>
<TD><font color="white"><B>Агульны стан</B></шрыфт></TD>
</тр>
]]>
</XSL:калі>
</XSL:пераменная>
<!--
Іншая пераменная, tableEnd проста вызначае зачыняе тэг табліцы.
Як і tableStart, гэта заўсёды emited. Менавіта таму яго значэнне
.
-->
<XSL:пераменная імя="tableEnd">
<XSL:калі тэст="$CurPos = $ Апошняя">
<![CDATA[ </стол> ]]>
</XSL:калі>
</XSL:пераменная>
<!--
Заўсёды выпраменьваць ўтрыманне tableStart. Калі гэта не першы
, то мы ведаем, яго значэнне
.
Забараніць маскіраванне tableStart таму што, калі ён не пусты, гэта
. Калі
, it will generate
stuff like "&л;стол>" instead of "<стол>".
-->
<XSL:коштам ад выбіраць="$tableStart" адключыць-выхад-ўцёкі="ды"/>
<тр>
<!--
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}"/>
</a>
</спраў>
</XSL:калі>
<div class="link-item">
<XSL:выклік-шаблону name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<a href="{$SafeLinkUrl}" target="{$LinkTarget}" title="{@ LinkToolTip}">
<XSL:value-of select="$DisplayTitle"/>
</a>
<div class="description">
<XSL:value-of select="@Description" />
</спраў>
</спраў>
</спраў>
-->
</тр>
<!--
Выпраменьваюць зачыняе тэг табліцы. Калі мы не на апошнім шэрагу,
гэта будзе пустой.
-->
<XSL:коштам ад выбіраць="$tableEnd" адключыць-выхад-ўцёкі="ды"/>
</XSL:шаблон>
<XSL:шаблон імя="FormatCurrency">
<XSL:параметраў імя="значэнне" выбіраць="0" />
<XSL:коштам ад выбіраць="Format-лік($значэнне, "$DDD,DDD,DDD.DD", "staff")" />
</XSL:шаблон>
|