views:

41

answers:

1

i'm trying to implement paging in xml using this code and got around to making it work. while it works perfectly, there is a small issue, that when i click on the NEXT button, it keeps reloading the page with the same initial records. it does not take the user to the next page.

i came across this link wherein the poster had a similar issue, and it seems from the answers parameters need to be passed. however, the guy in that link was using MM_XSLTransform, while i'm not. hence when i try to implement this code in index.php:

$xsl->addParameter("Page", $_GET["Page"]);
$xsl->addParameter("PageSize", $_GET["PageSize"]);

it throws an error:

Fatal error: Call to undefined method XSLTProcessor::addParameter() 

UPDATED

php code:

<?php
        error_reporting(E_ALL);
        ini_set("display_errors", 1);

            $xmldoc = new DOMDocument();
            if(!file_exists('test.xml')){
              echo "Sorry this file does not exists!";
              exit();
            } else {
                $xmldoc->load('test.xml', LIBXML_NOBLANKS);

               // Load up the XSL file
                $xslDoc = new DomDocument;
                $xslDoc->load("test.xsl");
                $xsl = new XSLTProcessor;
                $xsl->importStyleSheet($xslDoc);

                $xsl->setParameter(null, 'Page', $_GET['Page']);
                $xsl->setParameter(null, 'PageSize', $_GET['PageSize']);

                // apply the transformation
                echo $xsl->transformToXml($xmldoc);

            } 
?>

xsl:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
<xsl:output method="html" />

<!-- XML Parameters -->
<xsl:param name="Page" select="0" />
<xsl:param name="PageSize" select="5" />

<xsl:template match="/">

<xsl:variable name="mycount" select="count(root/verse)"/>
<xsl:variable name="selectedRowCount" select="floor((number($mycount)-1) div $PageSize)+1"/>

<div>
    <div>
        <xsl:value-of select="root/title"/>
    </div>
    <div>
        <p><xsl:value-of select="root/introduction"/></p>
    </div>
    <div>

            <xsl:for-each select="root/verse">  

                <xsl:if test="position() &gt;= ($Page * $PageSize) + 1">
                <xsl:if test="position() &lt;= $PageSize + ($PageSize * $Page)">

                    <div><xsl:value-of select="p"/></div> <br />
                    <div><xsl:value-of select="trla"/></div> <br />
                    <div><xsl:value-of select="trli"/></div> <br />

                </xsl:if>
                </xsl:if>
            </xsl:for-each>


            <!-- Prev link for pagination -->
              <xsl:choose>
               <xsl:when test="number($Page)-1 &gt;= 0">&#160;
                <A>
                 <xsl:attribute name="href">index.php?page=<xsl:value-of select="number($Page)-1"/>&amp;pagesize=<xsl:value-of select="$PageSize"/></xsl:attribute>
                  &lt;&lt;Prev
                </A>
               </xsl:when>
               <xsl:otherwise>
                <!-- display something else -->
               </xsl:otherwise>
              </xsl:choose>

              <xsl:if test="$selectedRowCount &gt; 1">
               &#160;<b class="blacktext"><xsl:value-of select="number($Page)+1"/>&#160;of&#160;<xsl:value-of select="number($selectedRowCount)"/></b>&#160;
              </xsl:if>

              <!-- Next link for pagination -->
              <xsl:choose>
               <xsl:when test="number($Page)+1 &lt; number($selectedRowCount)">&#160;
                <A>
                 <xsl:attribute name="href">index.php?page=<xsl:value-of select="number($Page)+1"/>&amp;pagesize=<xsl:value-of select="$PageSize"/></xsl:attribute>
                  Next&gt;&gt;
                </A>
               </xsl:when>
               <xsl:otherwise>
                <!-- display something else -->
               </xsl:otherwise>
              </xsl:choose>

    </div>

</div>

</xsl:template>
</xsl:stylesheet>
+2  A: 

Take a look at the documentation of the xsl module. You will find a setParameter method.

edit: e.g.

<?php
$doc = new DOMDocument;
$doc->loadxml('<a />');
$proc = getProcessor();
$proc->setParameter(null, 'Page', '99');
$proc->setParameter(null, 'PageSize', '11');
echo $proc->transformToXML($doc);

function getProcessor() {
  $doc = new DOMDocument;
  $doc->loadxml('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
    <xsl:output method="text" />
    <xsl:param name="Page" select="0" />
    <xsl:param name="PageSize" select="1" />
    <xsl:template name="results" match="/">
      Page: <xsl:value-of select="$Page" />
      PageSize: <xsl:value-of select="$PageSize" />
    </xsl:template>
  </xsl:stylesheet>');
  $xsl = new XSLTProcessor();
  $xsl->importStyleSheet($doc);

  return $xsl;
}

prints

Page: 99
PageSize: 11

edit2: Try

<?php
$page = isset($_GET['Page']) ? intval($_GET['Page']) : 0;

$proc = getProcessor();
$proc->setParameter(null, 'Page', $page);
$proc->setParameter(null, 'PageSize', '11');
$doc = getDoc();
echo $proc->transformToXML($doc);

function getProcessor() {
  $doc = new DOMDocument;
  $doc->loadxml('<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
    <xsl:output method="html" />
    <xsl:param name="Page" select="0" />
    <xsl:param name="PageSize" select="1" />
    <xsl:template name="results" match="/">
      Page: <xsl:value-of select="$Page" />
      PageSize: <xsl:value-of select="$PageSize" />
      <hr />
      <a><xsl:attribute name="href">?Page=<xsl:value-of select="($Page)-1" /></xsl:attribute>Prev</a>
      |
      <a><xsl:attribute name="href">?Page=<xsl:value-of select="($Page)+1" /></xsl:attribute>Next</a>
    </xsl:template>
  </xsl:stylesheet>');
  $xsl = new XSLTProcessor();
  $xsl->importStyleSheet($doc);

  return $xsl;
}

function getDoc() {
  $doc = new DOMDocument;
  $doc->loadxml('<a></a>');
  return $doc;
}

edit3: In your code you have

index.php?page=<xsl:value-of select="number($Page)-1"/>

Either use $_GET['page'] instead of $_GET['Page'] or change the template to index.php?Page=<xsl:value .... Same with PageSize/pagesize.

VolkerK
+1 for being quick there.
Sarfraz
i tried that. it throws this error: `Undefined index: Page` and `Wrong parameter count for XSLTProcessor::setParameter()`
fuz3d
You probably haven't read the documentation but simply replaced `add` by `set`. See example. And the `Undefined index: Page` notice most likely means that there is no GET-parameter `Page`.
VolkerK
i tried your code. altho it doesn't display any error, it's still stuck at the 'Page' even if i click 'PREV'. it keeps on reloading the page. how do i set the $_GET parameter to retrieve the page no? and i have posted the code, please check.
fuz3d
Not possible to tell from the code snippet you've posted.
VolkerK
updated the xsl code again.
fuz3d
tried your code. it still seems to reload the page with the default value, when NEXT is clicked.
fuz3d
@VolkerK, thanks for all your help. The code and everything is correct but I'm assuming the parameter isn't being passed because the page I've referenced to is the same page. Hence it cannot pass the parameter to it's own page. Am I right?
fuz3d
If the user clicks the link the client/browser sends a new http request and of course GET parameters can be included, regardless of whether the same script is triggered or not. My example also only consists of one script and changing parameters are passed to it.
VolkerK
finally, it worked! thanks A LOT! :D you rock. now if only i could vote up your post a 100 more times!
fuz3d