2009-09-17 10 views
1

je le XSLT suivant:Comment faire de la pagination dans XSLT

Je suis
<xsl:template match="/">   
    <div id="dokumentliste"> 
    <xsl:variable name="alleNyheder" select="$currentPage//node" /> 

    <xsl:for-each select="$alleNyheder"> 
    <xsl:sort data-type="text" select="@createDate" order="descending" />    

     <xsl:if test="./data[@alias='manchet'] != ''"> 
      <div class="newsitem"> 
       <h2> 
        <xsl:value-of select="./data[@alias='title']"/> 
       </h2> 

       <xsl:if test="./data[@alias = 'manchet'] != ''"> 
        <div class="nyhedContent"> 
         <p> 
          <span class="dokumentListeDato"> 
           <xsl:choose> 
            <xsl:when test="./data[@alias='date'] != ''"> 
             <xsl:value-of select="umbraco.library:FormatDateTime(./data[@alias='date'], 'dd. MMMM yyyy')"/> 
            </xsl:when> 
            <xsl:otherwise> 
             <xsl:value-of select="umbraco.library:FormatDateTime(./@createDate, 'dd. MMMM yyyy')"/> 
            </xsl:otherwise> 
           </xsl:choose> 
          </span> 
          <xsl:value-of select="./data[@alias = 'manchet']"/> 
         </p> 
        </div> 
       </xsl:if> 
       <div class="dokumentListe_laes_mere"> 
        <a href="{umbraco.library:NiceUrl(@id)}"> 
         Læs mere<img src="/frontend/images/macro/macro_laes_mere.png" alt="Læs mere"/> 
        </a> 
       </div> 
      </div> 
      <!-- End newsitem --> 
     </xsl:if> 
     </xsl:for-each> 
    </div> 
</xsl:template> 

faire une liste de nouvelles, et je voudrais faire une sorte de pagination. Presque le même que vu sur Google. Vous connaissez "l'habituel".

Mais je n'arrive pas à comprendre comment faire.

Le nombre de nouvelles sur chaque page n'est pas si important, mais disons 10 sur chaque page. Quand les 10 premiers articles sont montrés, j'aimerais que la pagination apparaisse. Avec les boutons "Next" et "Previous" à droite et à gauche des chiffres.

Est-il possible de faire cela, et ai-je expliqué mon problème assez bien? J'utilise le CMS Umbraco en passant :)

Merci beaucoup.

-Kim

Répondre

1

Quelque chose comme ceci: J'ai laissé un peu de code là-dedans pour traiter les images dans votre liste trop :-)

<xsl:output method="xml" omit-xml-declaration="yes"/> 
<xsl:param name="currentPage"/> 
<xsl:template match="/"> 
    <xsl:variable name="recordsPerPage" select="2"/> 
    <xsl:variable name="pageNumber"> 
     <xsl:choose> 
      <!-- first page --> 
      <xsl:when test="umbraco.library:RequestQueryString('page') &lt;= 0 or string(umbraco.library:RequestQueryString('page')) = '' or string(umbraco.library:RequestQueryString('page')) = 'NaN'">0</xsl:when> 
      <!-- what was passed in --> 
      <xsl:otherwise> 
       <xsl:value-of select="umbraco.library:RequestQueryString('page')"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:variable name="numberOfRecords" select="count($currentPage/node)"/> 

    <!-- The fun starts here --> 

    <xsl:call-template name="pagination"> 
     <xsl:with-param name="pageNumber" select="$pageNumber"/> 
     <xsl:with-param name="recordsPerPage" select="$recordsPerPage" /> 
     <xsl:with-param name="numberOfRecords" select="$numberOfRecords" /> 
    </xsl:call-template> 

<ul class="listing self-clear"> 
     <xsl:for-each select="$currentPage/node [string(data [@alias='umbracoNaviHide']) != '1']"> 
      <xsl:sort order="descending" select="data[@alias='releasedOn']"></xsl:sort> 

      <xsl:if test="position() &gt; $recordsPerPage * number($pageNumber) and position() &lt;= number($recordsPerPage * number($pageNumber) + $recordsPerPage)"> 
       <li> 
        <xsl:attribute name="class"> 
         <xsl:if test="data[@alias='image'] = ''"> 
          no-img 
         </xsl:if> 
         <xsl:if test="position() = $recordsPerPage * (number($pageNumber) + 1)"> 
          last 
         </xsl:if> 
        </xsl:attribute> 
        <h3> 
         <a href="{umbraco.library:NiceUrl(@id)}"> 
          <xsl:value-of select="@nodeName"/> 
         </a> 
        </h3> 
        <xsl:if test="data[@alias='image'] != ''"> 
         <img src="{data[@alias='image']}" class="drop-shadow" /> 
        </xsl:if> 
        <p class="date"><xsl:value-of select="umbraco.library:LongDate(data[@alias='releasedOn'])"/></p> 
        <xsl:value-of select="data[@alias='abstract']" disable-output-escaping="yes"/> 
        <a href="{umbraco.library:NiceUrl(@id)}" class="read-more">Read More</a> 
       </li> 
      </xsl:if> 
     </xsl:for-each> 
    </ul> 

    <xsl:call-template name="pagination"> 
     <xsl:with-param name="pageNumber" select="$pageNumber"/> 
     <xsl:with-param name="recordsPerPage" select="$recordsPerPage" /> 
     <xsl:with-param name="numberOfRecords" select="$numberOfRecords" /> 
    </xsl:call-template> 

</xsl:template> 

<xsl:template name="pagination"> 
    <xsl:param name="pageNumber"/> 
    <xsl:param name="recordsPerPage"/> 
    <xsl:param name="numberOfRecords"/> 

    <div class="pagination"> 
    <div class="wrapper"> 

     <xsl:if test="(($pageNumber +1) * $recordsPerPage) &lt; ($numberOfRecords)"> 
      <a href="?page={$pageNumber +1}" class="next">Next</a> 
     </xsl:if> 

     <xsl:if test="$pageNumber &gt; 0"> 
      <a href="?page={$pageNumber -1}" class="prev">Prev</a> 
     </xsl:if> 

     <span class="page-nos"> 
     Page 
     <xsl:call-template name="for.loop"> 
      <xsl:with-param name="i">1</xsl:with-param> 
      <xsl:with-param name="page" select="$pageNumber +1"></xsl:with-param> 
      <xsl:with-param name="count" select="ceiling(count($currentPage/node)div $recordsPerPage)"></xsl:with-param> 
     </xsl:call-template> 
     </span> 

    </div> 
    </div> 
</xsl:template> 

<xsl:template name="for.loop"> 
    <xsl:param name="i"/> 
    <xsl:param name="count"/> 
    <xsl:param name="page"/> 
    <xsl:if test="$i &lt;= $count"> 
     <span> 
     <xsl:if test="$page != $i"> 
      <a href="{umbraco.library:NiceUrl($currentPage/@id)}?page={$i - 1}" > 
       <xsl:value-of select="$i" /> 
      </a> 
     </xsl:if> 
     <xsl:if test="$page = $i"> 
      <xsl:value-of select="$i" /> 
     </xsl:if> 
     </span> 
    </xsl:if> 

    <xsl:if test="$i &lt;= $count"> 
     <xsl:call-template name="for.loop"> 
      <xsl:with-param name="i"> 
       <xsl:value-of select="$i + 1"/> 
      </xsl:with-param> 
      <xsl:with-param name="count"> 
       <xsl:value-of select="$count"/> 
      </xsl:with-param> 

      <xsl:with-param name="page"> 
       <xsl:value-of select="$page"/> 
      </xsl:with-param> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
+0

Il fonctionne presque Myster, mais pas totalement :) Quand je suis sur la première page, il dit Page 1, et c'est bien. Mais les liens n'apparaissent pas. Quand je dis les liens, je pense aux chiffres et au bouton "Suivant". Je mets le $ recordsPerPage = 5, et il y a 12 newsitems, donc il devrait y avoir page 1, 2 et 3. –

+0

Si vous utilisez Visual Studio et que vous avez configuré le débogage, vous pouvez mettre un breakpoint sur le xsl: le bouton "Suivant" et inspecter les variables. Je m'attends à ce que votre NumberOfRecords ne soit pas correctement défini. Tous les nœuds sont-ils publiés? pour être à deux reprises republier de l'arbre, et cocher publier tous les enfants – Myster

1

je me suis dit celui-ci maintenant. Je peux voir que vous venez de copier/coller la pagination qui a été faite par Tim Geyssens ici: http://www.nibble.be/?p=11

Et le code est aussi un peu bon, mais j'ai changé certains d'entre eux pour le faire fonctionner. Je ne sais pas si je devrais juste accepter ma propre réponse comme la bonne, la réponse de Myster comme la bonne ou si je peux supprimer ce poste?

+0

heh, il a été copié et collé tant de fois, je ne sais pas il vient de Tim ;-) Tim a toujours beaucoup de bonnes choses. S'il y a une erreur dans ma réponse, faites le moi savoir, je pense que nous utilisons le même xslt sur différents sites. – Myster