Sitecore XSL pagination

Някъде в средата на август имах възможност да посетя Лондон – град за който бях чувал все хубави неща. Вярно, престоят ми беше прекалено кратък – само 4 дни, при това служебно – но не съжалявам за нито един момент прекаран там. Този пост, обаче, не е за Лондон, а за причината да бъда там всъщност – трябваше да посетя курс за сертифициране като Sitecore Developer (Level 1). Та да се похваля – от близо 2 месеца съм сертифициран Sitecore Developer
Sitecore e .NET базирано enterprise CMS решение от което всеки developer има какво да научи. За съжаление 2-та дена (толкова трае курса, заедно с изпита след това), макар и интензивно наситени с лекции и практически упражнения могат да дадат на всеки начинаещ само повърхностен поглед върху системата. Преди въпросния курс бях писал съвсем малко C# и се чувствах като тотален новак. Слава богу, основната част от работата с CMS-a се състои в работа с XSL като основен език за Rendering-ите и малко ASP.NET за Layout-a и се учи бързо.
Вчера се сблъсках с един дребен проблем, част от всеки динамичен сайт – странирането на резултатите. Решението реших да прехвърля върху XSL, вместо да пиша Extension, и изглежда не съм сбъркал, понеже не губя почти нищо от гледна точка на производителност. Да, Extension-a ще е по-бърз, най-малкото защото ще е компилиран до .dll, но така или иначе XSL сравняването с position() се случва при кеширан XML и е достатъчно оптимизирано в parser-а.
В .aspx файла сложих следното:
<script type="cs" runat="server"> void Page_Load(object sender, System.EventArgs e) { int Page = 0; if (Request["page"] != null && Request["page"].Length != 0) { bool success = Int32.TryParse(Request["page"].ToString(), out Page); if (success != true) { Page = 0; } } ArticlesPagination.Parameters="page="+Page.ToString(); } </script>
Rendering-a за pagination-a изглежда така в .aspx Layout-а:
<div class="paging"> <sc:XslFile runat="server" renderingid="{the-rendering-id}" path="/xsl/ArticlesPagination.xslt" id="ArticlesPagination"> </sc:XslFile> </div>
ArticlesPagination.xsl съдържа следното (пропуснал съм служебните декларации за namespace, както и някои променливи, които нямат отношение към странирането):
<xsl:template match="*" mode="main"> <xsl:variable name="total" select="count($sc_currentitem/item[@template='article'])-1" /> <xsl:variable name="per_page" select="3" /> <xsl:variable name="pages" select="ceiling($total div $per_page)"/> <xsl:variable name="start" select="($page * $per_page)+1" /> <xsl:variable name="end" select="($start + $per_page)+1" /> <xsl:variable name="path" select="sc:path(.)" /> <xsl:choose> <xsl:when test="number($page)-1 >= 0"> <a class="prev" href="{$path}?page={number($page)-1}"> Previous</a> </xsl:when> <xsl:otherwise> <!-- display something else --> </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="number($pages) = 1"> <span>Page <strong> <xsl:value-of select="number($page)+1"/> of  <xsl:value-of select="number($pages)"/></strong></span> </xsl:when> <xsl:otherwise> <xsl:call-template name="loopPages"> <xsl:with-param name="goUntil" select="$pages"/> <xsl:with-param name="currentPage" select="number($page)+1"/> <xsl:with-param name="startAt" select="1"/> <xsl:with-param name="path" select="$path"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="number($page)+1 < number($pages)"> <a class="next" href="{$path}?page={number($page)+1}"> Next</a> </xsl:when> <xsl:otherwise> <!-- display something else --> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="loopPages"> <xsl:param name="startAt" select="0" /> <xsl:param name="goUntil" select="0" /> <xsl:param name="currentPage" select="0" /> <xsl:param name="path" /> <xsl:if test="number($startAt) < number($goUntil)+1"> <xsl:choose> <xsl:when test="number($startAt) = number($currentPage)"> <a class="current-page" href="{$path}?page={number($currentPage)-1}"> <xsl:value-of select="$startAt"/></a> </xsl:when> <xsl:otherwise> <a href="{$path}?page={number($startAt)-1}"> <xsl:value-of select="$startAt"/></a> </xsl:otherwise> </xsl:choose> <xsl:call-template name="loopPages"> <xsl:with-param name="startAt" select="$startAt + 1"/> <xsl:with-param name="goUntil" select="$goUntil"/> <xsl:with-param name="currentPage" select="$currentPage"/> <xsl:with-param name="path" select="$path"/> </xsl:call-template> </xsl:if> </xsl:template>
Маркери: pagination, sitecore, xml, xsl
За тази статия
В момента четете "Sitecore XSL pagination", статия в stinger's thoughts
Отпечатване на статията
- Публикувана на:
- 14.11.2008 в 12:46
- Категория:
- Web Development
- Изпращане:
- Изпрати чрез email
Категории
- Books (10)
- Linux/UNIX (66)
- Movies (32)
- Music (73)
- Web Development (59)
- Други (182)






















IE8 Webslice
RSS с публикации
2 коментара
RSS с коментaрите