Baxış və obyektiv
Qutusu həyata, MOSS’ Məqalələr Query Web Part (CQWP) siyahısı formatda nəticələri göstərir, similar to search results. It is also possible to display the results in a grid format (i.e. HTML masa formatında). Grid formats are better in some circumstances. I describe how to achieve that effect in this article.
Biznes Ssenari
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, belə adı kimi, büdcə, gözlənilən Tamamlanma tarixi, remaining budget and other summary type fields. By "singleton" I mean a custom SharePoint list guaranteed to contain only one item. Simplistically, bu kimi görünür:
Təsvir kimi texniki yanaşma çox eyni burada (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:
Bu kimi HTML nəticəsində yaradır:
|
<html>
<orqan>
<mərkəz>
<masa sərhəd= 1>
<!-- Etiketler ->
<tr bgcolor= Blue>
<TD><şrift rəng= Ağ><b>Layihənin adı</b></şrift></TD>
<TD align= Sağ><şrift rəng= Ağ><b>Tarix doldurun</b></şrift></TD>
<TD align= Sağ><şrift rəng= Ağ><b>Büdcə</b></şrift></TD>
<TD align= Sağ><şrift rəng= Ağ><b>Aktual Xərcləri</b></şrift></TD>
<TD><şrift rəng= Ağ><b>Ümumi Status</b></şrift></TD>
</tr>
<tr>
<TD>Re-tel kompüter otağı.</TD>
<TD align= Sağ>02/01/08</TD>
<TD align= Sağ>22,500.00</TD>
<TD align= Sağ>19,000.00</TD>
<TD>Davam</TD>
</tr>
<tr>
<TD>SQL Upgrade üçün ehtiyat server</TD>
<TD align= Sağ>04/01/08</TD>
<TD align= Sağ>7,500.00</TD>
<TD align= Sağ>0.00</TD>
<TD>Planlı</TD>
</tr>
</masa>
</mərkəz>
</orqan>
</html>
|
Yanaşma
Bu grid yaratmaq üçün bu adımları edin:
- Grid komponentləri müəyyən (satır / sütun).
- Zəruri site sütun müəyyən və yaratmaq.
- Layihələr və Singleton siyahıları sub sites yaratmaq.
- Bir web page CQWP əlavə və siyahıları üçün axtarış üçün konfiqurasiya.
- Əlavə sütun qədər toplanması üçün CQWP XML Düzelt.
- Bir masa yaratmaq üçün XSL dəyişdirin.
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 burada (http://msdn2.microsoft.com/en-us/library/bb897399.aspx) və Heather Süleymanın blog burada (http://www.heathersolomon.com/blog/articles/CustomItemStyle.aspx).
Qoz-fındıq və boltlar
Addımlar MSDN sənədlərin və Heather Süleymanın maddə uyğun olaraq beş vasitəsilə bir başlayın və həyata keçirilməsi.
Bu noktada, sahifada üçün CQWP əlavə etdik və sizin <CommonViewFields> zəruri olaraq yapılandırılmış.
Adi adımları, Mən bu aralıq nəticələr almaq:
1. Içerik növü yaratmaq, a templatized custom list for that content type and two sites. Here is the content type:
Burada site strukturu:
2. Mənim layihə subsites və Singleton layihə icmalı siyahıları yaratmaq sonra CQWP əlavə et:
3. Vasitəsilə istəyirəm bütün əlavə məlumat əlavə et <CommonViewFields>:
<əmlak ad="CommonViewFields" növü="sim">Project_x0020_Name;Project_x0020_Expenses;Project_x0020_Status;Project_x0020_Start_x0020_Date;Project_x0020_End_x0020_Date;Project_x0020_Budget</əmlak>
Mən bir line bütün əmlak sahələrində saxlamaq idi Qeyd edək ki, ya bu iş olmaz (CQWP sorğu yoxdur maddələr geri ki, mənə demək istəyirəm).
4. Bu noktada, 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 özelleştirilmiş bir yaratmaq üçün / unghosted version of ItemStyle.xsl. I follow Heather’s advice, addım vasitəsilə 11 bu aralıq nəticələr almaq:
4.1: Mənim XSL şablon kimi aşağıdakı adlandırın:
<XSL:template name="Grid" match="Row[@Style=’Grid’]" mode="itemstyle">
Mən də bir az onun təklif dəyişdirmək <XSL:-hər biri üçün …> bir əlavə <br /> təmiz siyahı təmin etmək üçün etiket yapışdırmaq:
<XSL:-hər biri üçün seçmək="@ *">
P:<XSL:dəyər və seçmək="ad()" /><br/>
</XSL:-hər biri üçün>
4.2: Mən web hissəsi dəyişdirmək, go to appearance and select my "Grid" üslub:
Dəyişiklik müraciət və burada nəticəsidir:
Biz sahələrində biz istəyirik ki, yuxarıda göründüyü (Layihənin adı, xərc, vəziyyət, və s.) 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. Məsələn, we reference Project Status as "Project_x005F_x0020_Name".
Bu noktada, biz Heather blog və bu nəhənglərin çiyinlərində yola, Mən öz kiçik qədər əlavə.
ContentQueryMain.xsl
QEYD: Həm ContentQueryMain.xsl dəyişikliklər edilməsi, habelə ItemStyle.xsl zaman, Siz dəyişikliklərin təsiri görmək əvvəl geri bu faylları yoxlamaq lazımdır.
Grid vermə məqsədləri üçün, 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 <masa> məlumatların ilk sıraya emitting əvvəl tag və yekun <masa> tag after emitting the last row. To accomplish this, ContentQueryMain.xsl is modified to pass two parameters to our "grid" ItemStyle.xsl ilə şablon, "last row" and "current row". ItemStyle.xsl uses these to conditionally emit the necessary tags.
Heather Süleymanın texnika istifadə, we locate ContentQueryMain.xsl. It is located in the same place as ItemStyle.xsl. This screen shot should help:
Biz aşağıdakı dəyişiklik etmək lazımdır:
- Bir XSL şablon dəyişdirmək, "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 <masa> tags.
- Modify another bit of ContentQueryMain.xsl that calls the "CallItemTemplate" to pass it a "LastRow" LastRow bizim Grid şablon üçün qəbul edilə bilər parametri ki,.
Locate the template named "OuterTemplate.CallItemTemplate" simli tərəfindən müəyyən:
<XSL:şablon ad="OuterTemplate.CallItemTemplate">
Aşağıdakı kimi bütün şablon dəyişdirin:
|
<XSL:şablon ad="OuterTemplate.CallItemTemplate">
<XSL:Param ad="CurPosition" />
<!--
Add the "LastRow" parametr.
We only use it when the item style pass in is "Grid".
-->
<XSL:Param ad="LastRow" />
<XSL:seçmək>
<XSL:zaman sınaq="@ Style = 'NewsRollUpItem'">
<XSL:-şablonları tətbiq seçmək="." üsul="itemstyle">
<XSL:ilə-Param ad="EditMode" seçmək="$cbq_iseditmode" />
</XSL:-şablonları tətbiq>
</XSL:zaman>
<XSL:zaman sınaq="@ Style = 'NewsBigItem'">
<XSL:-şablonları tətbiq seçmək="." üsul="itemstyle">
<XSL:ilə-Param ad="CurPos" seçmək="$CurPosition" />
</XSL:-şablonları tətbiq>
</XSL:zaman>
<XSL:zaman sınaq="@ Style = 'NewsCategoryItem'">
<XSL:-şablonları tətbiq seçmək="." üsul="itemstyle">
<XSL:ilə-Param ad="CurPos" seçmək="$CurPosition" />
</XSL:-şablonları tətbiq>
</XSL:zaman>
<!--
Bu grid itemstyle.xsl şablon cari vəziyyəti və lastrow Pass.
ItemStyle.xsl açıq və bağlanış ayırmaq üçün istifadə edəcək <masa> tags.
-->
<XSL:zaman sınaq="@ Style = 'Grid'">
<XSL:-şablonları tətbiq seçmək="." üsul="itemstyle">
<XSL:ilə-Param ad="CurPos" seçmək="$CurPosition" />
<XSL:ilə-Param ad="Sonuncu" seçmək="$LastRow" />
</XSL:-şablonları tətbiq>
</XSL:zaman>
<XSL:başqa cür>
<XSL:-şablonları tətbiq seçmək="." üsul="itemstyle">
</XSL:-şablonları tətbiq>
</XSL:başqa cür>
</XSL:seçmək>
</XSL:şablon>
|
Şərh dəyişikliklərin məqsədi təsvir.
Əlbəttə, the "OuterTemplate.CallItemTemplate" is itself called from another template. Locate that template by searching for this text string:
<XSL:şablon ad="OuterTemplate.Body">
OuterTemplate.Body təlimatlara vasitəsilə gedin və LastRow parametri aşağıdakı kimi daxil edin (italik Şərh kimi göstərilir):
<XSL:Zəng şablon ad="OuterTemplate.CallItemTemplate">
<XSL:ilə-Param ad="CurPosition" seçmək="$CurPosition" />
<!-- Ki, LastRow parametr daxil edin. -->
<XSL:ilə-Param ad="LastRow" seçmək="$LastRow"/>
</XSL:Zəng şablon>
Bu bütün sonra, nəhayət, biz hər şeyi düzgün bizim ItemStyle.xsl buraxmaq olar ki, qurmaq <masa> sağ yer tags.
ItemStyle.Xsl
QEYD: Yenidən, bu dəyişikliklərin təsiri oldu ki, hər hansı dəyişikliklərdən sonra ItemStyle.xsl kontrol.
Biz burada iki vəzifələr:
- 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. (Mən XSL bir seyrək sapı var ki, deyə bilərsiniz).
Ilk, ItemStyle.xsl üstündeki, Bu xətt əlavə:
<!-- Bizə U.S keçirmək üçün imkan verir ki, bəzi mumbo jumbo. valyuta. -->
<XSL:Mexanizmi Boylam decimal format ad="heyət" rəqəmli="D" />
<XSL:şablon ad="Default" matç="*" üsul="itemstyle">
Mən əvvəl birbaşa əlavə edək ki, <XSL:template name="Default" …> tərif.
Sonrakı, go back to our Grid template. Replace the entire Grid template with the code below. It is thoroughly commented, ancaq mənə e-poçt çekinmeyin və ya sualınız varsa, mənim blog comments tərk etmir.
|
<XSL:şablon ad="Tor" matç="Sıra[@ Style = 'Grid']" üsul="itemstyle">
<!--
ContentMain.xsl CurPos və son keçir.
Biz şərti açıq və bağlanış buraxmaq üçün bu istifadə edin <masa> tags.
-->
<XSL:Param ad="CurPos" />
<XSL:Param ad="Sonuncu" />
<!-- Aşağıdakı dəyişənlər standart ItemStyle.xsl dən değiştirilmemiş olunur -->
<XSL:dəyişən ad="SafeImageUrl">
<XSL:Zəng şablon ad="OuterTemplate.GetSafeStaticUrl">
<XSL:ilə-Param ad="UrlColumnName" seçmək="'ImageUrl'"/>
</XSL:Zəng şablon>
</XSL:dəyişən>
<XSL:dəyişən ad="SafeLinkUrl">
<XSL:Zəng şablon ad="OuterTemplate.GetSafeLink">
<XSL:ilə-Param ad="UrlColumnName" seçmək="'LinkUrl'"/>
</XSL:Zəng şablon>
</XSL:dəyişən>
<XSL:dəyişən ad="DisplayTitle">
<XSL:Zəng şablon ad="OuterTemplate.GetTitle">
<XSL:ilə-Param ad="Title" seçmək="@ Title"/>
<XSL:ilə-Param ad="UrlColumnName" seçmək="'LinkUrl'"/>
</XSL:Zəng şablon>
</XSL:dəyişən>
<XSL:dəyişən ad="LinkTarget">
<XSL:əgər sınaq="@ OpenInNewWindow = 'true'" >_blank</XSL:əgər>
</XSL:dəyişən>
<!--
Burada biz bir dəyişən müəyyən, "tableStart". Bu HTML ehtiva
. Qeyd edək ki, əgər CurPos = 1, bir CDATA tag olan HTML daxildir.
Başqa cür, boş olacaq.
TableStart dəyəri hər zaman ItemStyle vasitəsilə adlanır hazırlayıb çap edir
.
-->
<XSL:dəyişən ad="tableStart">
<XSL:əgər sınaq="$CurPos = 1">
<![CDATA[
<Cədvəl sərhəd = 1>
<tr bgcolor="blue">
<TD><font color="white"><b>Layihənin adı</b></şrift></TD>
<td align="right"><font color="white"><b>Tarix doldurun</b></şrift></TD>
<td align="right"><font color="white"><b>Büdcə</b></şrift></TD>
<td align="right"><font color="white"><b>Aktual Xərcləri</b></şrift></TD>
<TD><font color="white"><b>Ümumi Status</b></şrift></TD>
</tr>
]]>
</XSL:əgər>
</XSL:dəyişən>
<!--
Digər dəyişən, tableEnd sadəcə yekun cədvəli tag müəyyən.
TableStart ilə, həmişə hazırlayıb çap edir. Onun dəyəri Buna görə
.
-->
<XSL:dəyişən ad="tableEnd">
<XSL:əgər sınaq="$CurPos Son $ =">
<![CDATA[ </masa> ]]>
</XSL:əgər>
</XSL:dəyişən>
<!--
Həmişə tableStart məzmunu buraxmaq. Bu ilk deyil
, sonra biz onun qədrini bilmək
.
Qaçan çıxış Disable çünki zaman tableStart onu boş deyil, o
. Əgər
, it will generate
stuff like "<masa>" instead of "<masa>".
-->
<XSL:dəyər və seçmək="$tableStart" aradan çıxdı-qaçan="bəli"/>
<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:dəyər və seçmək="@ Project_x005F_x0020_Name"/>
</TD>
<TD align="sağ">
<XSL:dəyər və seçmək="@ Project_x005F_x0020_End_x005F_x0020_Date"/>
</TD>
<TD align="sağ">
<XSL:Zəng şablon ad="formatcurrency">
<XSL:ilə-Param ad="dəyər" seçmək="@ Project_x005F_x0020_Budget"></XSL:ilə-Param>
</XSL:Zəng şablon>
</TD>
<TD align="sağ">
<XSL:Zəng şablon ad="formatcurrency">
<XSL:ilə-Param ad="dəyər" seçmək="@ Project_x005F_x0020_Expenses"> </XSL:ilə-Param>
</XSL:Zəng şablon>
</TD>
<TD>
<XSL:dəyər və seçmək="@ Project_x005F_x0020_Status"/>
</TD>
<!--
Aşağıdakı hər şeyə aydınlıq üçün şərh edir.
Lakin, geri gətirmək və onu mövzusu <TD> onun görmək
.
-->
<!--
<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}"/>
</bir>
</div>
</XSL:əgər>
<div class="link-item">
<XSL:Zəng şablon name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<a href="{$SafeLinkUrl}" target="{$LinkTarget}" title="{@ LinkToolTip}">
<XSL:value-of select="$DisplayTitle"/>
</bir>
<div class="description">
<XSL:value-of select="@Description" />
</div>
</div>
</div>
-->
</tr>
<!--
Yekun masa tag buraxmaq. Biz son sırada deyilsə,
Bu boş olacaq.
-->
<XSL:dəyər və seçmək="$tableEnd" aradan çıxdı-qaçan="bəli"/>
</XSL:şablon>
<XSL:şablon ad="formatcurrency">
<XSL:Param ad="dəyər" seçmək="0" />
<XSL:dəyər və seçmək='format nömrəsi($dəyər, "$DDD,DDD,DDD.DD", "staff")' />
</XSL:şablon>
|