Пейджинг страниц на Pattemplate

В продолжение темы о patTemplate хочется немного окунуться уже в более практичное его применение с использованием его некоторых расширений. Довольно часто веб программистам приходится делать пейджинг страниц для вывода какого нибудь содержимого каталога. Я не буду пока вникать в создание самого педжинга, остановимся на его выводе при помощи patTemplate. Для этого необходимо создать шаблон, который будет обрабатываться Renderer'ом.<!--c1-->
CODE
<!--ec1-->
<?xml version="1.0"?>
<!DOCTYPE page  [
]>
<page title="Pager example">
    <control:for>
        <control:init>
            <var:set scope="internal" var="i">[FROM_PAGE]</var:set>
        </control:init>
    
        <control:condition>
            <var:get scope="internal">i</var:get><=[TO_PAGE]
        </control:condition>

        <control:iterate>
            <var:set scope="internal" var="i">
                <var:eval><var:get scope="internal" var="i"/>+1</var:eval>
            </var:set>
        </control:iterate>
        
        <control:body>
            <control:if>
                <control:condition>
                    <var:get scope="internal" var="i" />==<var:get scope="_GET" var="page"/>
                </control:condition>
                <control:body>
                    [<var:get scope="internal" var="i" />]
                </control:body>
            </control:if>
            <control:else>
                <control:body>
                <link type="pager" page="{CONTENT}"><var:get scope="internal" var="i" /></link>
                </control:body>
            </control:else>
        </control:body>
    </control:for>
</page>
<!--c2-->
<!--ec2-->
Его сохраняем в каталог со всеми вашими шаблонами. По умолчанию элемент <link> меня не устраивал,  да и кого устраивают вообще установки по умолчанию, но как задать дизайн(читаем скин) на свой вкус расскажу в следующий раз. Поэтому ищем файл content.tmpl, находится он где то в каталоге skins/pat, и меняем следующие строки
<!--c1-->
CODE
<!--ec1-->
<patTemplate:tmpl name="link" type="condition" conditionvar="TYPE" whitespace="trim">

    <patTemplate:sub condition="pager" whitespace="trim">
    <a href="[RANDY_SELF]&file={URL}">{CONTENT}</a>
    </patTemplate:sub>
    
    <patTemplate:sub condition="mailto" whitespace="trim">
    <a href="mailto:{URL}" class="link">{CONTENT}</a>
    </patTemplate:sub>
    
    <patTemplate:sub condition="external" whitespace="trim">
    <a href="{URL}" target="_blank" class="link">{CONTENT}</a>
    </patTemplate:sub>

    <patTemplate:sub condition="download" whitespace="trim">
    <a href="download.php?mode={MODE}&file={URL}" class="link">{CONTENT}</a>
    </patTemplate:sub>

</patTemplate:tmpl>
<!--c2-->
<!--ec2-->

на вот такую мелочь smile.gif
<!--c1-->
CODE
<!--ec1-->
<patTemplate:tmpl name="link" type="condition" conditionvar="TYPE" whitespace="trim">
    <patTemplate:sub condition="pager" whitespace="trim">
    <a href="[RANDY_SELF]&page={PAGE}">·{CONTENT}·</a>
    </patTemplate:sub>
</patTemplate:tmpl>
<!--c2-->
<!--ec2-->
Осталось нам заделать скрипт, который бы обработал сие безобразие в относительно нормальный пейджинг.

<!--c1-->
CODE
<!--ec1-->
<?
    require_once("config/patXMLRenderer.php");
    
    // для нашего пейджинга необходимо расширение `Control Extension` и `Var Extension`
    include_once($extDir."/knownExtensions.php");

    require_once("include/patTemplate.php");

    require_once("include/patXMLRenderer.php");

    require_once("include/patXMLRendererExtension.php");

    $randy = new PatXmlRenderer;
    $randy->setExtensionDir($extDir);

    // загрузим расширения
    $randy->setKnownExtensions($knownExtensions);
    $randy->setSkins($skins);

    $randy->setOption("autoadd","on");
    $randy->selectSkin("pat");
    $randy->setXMLDir($xmlDir);

    $start_page = 1;
    $final_page = 10;
    
    $xmlsrc = file_get_contents($xmlDir."/pager.xml");
    $xmlsrc = str_replace(array('[FROM_PAGE]','[TO_PAGE]'),array($start_page,$final_page),$xmlsrc);

    $randy->setXMLString($xmlsrc);

    $template = new PatTemplate();
    $randy->setTemplate($template);

    $randy->initRenderer();
    foreach( $baseTemplates as $tmplFile )
        $randy->addTemplateFile($tmplFile);
    $randy->displayRenderedContent();
?>
<!--c2-->
<!--ec2-->

А теперь собственно, что же произошло. Для вывода пейджинга я использовал 2 расширения patTemplate (Control и Var), их конфиг находится в переменной $knownExtensions. Control позволяет задавать циклы внутри xml документа, в принципе по его содержимому все видно.

<control:init> инициализирует внутреннюю (scope='internal') переменную var="i".
<control:condition> задает условие до которого необходимо выполнять цикл.
<control:iterate> собственно то что будет выполненно в цикле <control:for>.

Есть еще одна деталь - условия <control:if> и <control:else>. Собственно, мы сравниваем внутреннюю переменную с переменной из пространства $_GET <var:get scope="_GET" var="page"/> (смотрим в P.S.).

Но и на этом вся прелсть н заканчивается. Сейчас коротко расскажу об изменении контентана примере того же тега <link type="pager" page="{CONTENT}"></link>. Темплейт лишь задает набор тегов, а правила вывода задаются в скине. Структура скина была рассмотрена в прошлой
статье, но повторюсь уже для ясности.

Любой скин, содержит некий набор файлов, который может иметь, или вообще не иметь smile.gif
шаблон для patTemplate. Структура <patTemplate:tmpl></patTemplate:tmpl> будет обрабатываться рендерером. Теперь рассмотрим элемент <link> в нашем xml документе.

Теперь представим ситуацию, рендерер парсит xml и встречает этот элемент, затем смотрит, не переопределен ли этот элемент? Естественно мы его переопределили, и рендерер заменяет его на то содержание, которое мы для него указали. Ну а {CONTENT} содержит значение, которое содержится между тегами в нашем xml документе.

Я думаю, что такой простой пример, как вывод пейджинга на страницу, хоть немного прояснил суть использования patTemplate. Что дальше, дальше можно рассмотреть создание собственного скина, хотя думаю что из вышесказанного уже нетрудно догадаться о чем собственно пойдет речь.

Best regards, md5hash aka Volkov V. Vitaliy (mdfivehash@gmail.com).
Special for realcoding.net

<!--fonto:Arial--><!--/fonto-->P.S. В документации указано _GET, но увы не работает, может баг или что.



Опубликовал admin
27 Янв, Пятница 2006г.



Программирование для чайников.