Sitecore XSL pagination

Sitecore

Някъде в средата на август имах възможност да посетя Лондон – град за който бях чувал все хубави неща. Вярно, престоят ми беше прекалено кратък – само 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 &gt;= 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&#160;<strong>
    <xsl:value-of select="number($page)+1"/>&#160;of&#160;
    <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 &lt; 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) &lt; 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>

Маркери: , , ,

За тази статия



Категории