Solution Technologies
Управление сайтом без ограничений

Руководство разработчика XS2

Скачать pdf-версию.

Часть 1. XS2 шаг за шагом

Глава 9. Повторное использование методов

В реальных веб-проектах очень часто одна и та же часть повторяется практически на всех страницах сайта: например, меню, "шапка", "подвал", блок с последними новостями и т.п. В этой главе мы узнаем, как с помощью XS2 организовать повторное испльзование методов. В обычном PHP повторное использование фрагментов кода чаще всего осуществляют с помощью функции include(), которая просто вставляет код из определенного файла в место своего вызова в текущем коде. В XS2 примерно той же цели служит функция xs2Fetch(), которая выполняет произвольный метод в месте своего вызова. Для того, чтобы познакомится с ее работой поближе, реализуем следующую задачу. Мы вынесем код, который выводит на главной странице новости конкретной ленты в отдельный метод, а на главной странице будем вызывать его для каждой из выбранных лент.

Для начала мы создадим метод, в который вынесем вывод последних пяти новостей из конкретной ленты. Мы назовем его "hotnew" и прикрепим к типу "news_feed" модуля "news". Для начала мы просто скопируем строки №9-21 из Листинга 10:

Листинг 14
1.  <div>
2.    <h1>Новости из ленты "{$news_feed.NName}"</h1>
3.  
4.    {xs2GetChildren mod="news" NType="news_post" ¶
                 ParId=$news_feed.NodId limit=5 sort="Date ¶
                 desc" var="my_news_posts"}
5.  
6.    {foreach from=$my_news_posts item="my_news_post"}
7.      <h2>{$my_news_post.NName}</h2>
8.      {foreach name="authors" from=$my_news_post.Authors ¶
                 item="author"}
9.        {$author.NName}{if !$smarty.foreach.authors.last}, ¶
                 {/if}
10.     {/foreach}
11.     <div>{$my_news_post.Date|date_format:"%d.%m.%Y"}</div>
12.   {/foreach}
13. </div>

Сохранив новый метод, мы на время оставим его и займемся модификацией метода главной страницы. Строки №9-21 из Листинга 10 мы заменим вызовом фукнции xs2Fetch:

Листинг 15
1.  <html>
2.    <head>
3.      <title>Ваша первая страница</title>
4.    </head>
5.    <body>
6.      {xs2GetNodes mod="news" NType="news_feed" ¶
                 var="news_feeds"}
7.  
8.      {foreach from=$news_feeds item="news_feed"}
9.        {xs2Fetch mod="news" obj="news_feed" met="hotnews" ¶
                 atr=$news_feed.NodId}
10.     {/foreach}
11.   </body>
12. </html>

Функция xs2Fetch в качестве параметров принимает те же самые данные, которые передаются в URL для доступа к определенному методу: модуль ("mod"), тип ("obj") и имя метода ("met"), который необходимо вызвать. Для наглядности приведем сравнение вариантов вызова метода xs2Fetch с вариантами URL, описанными в Главе 4:

Если метод прикреплен непосредственно к проекту, то вызов имеет вид
{xs2Fetch met="имя метода"}
http://имя домена/имя метода/
Если метод прикреплен к модулю, то его URL имеет вид
{xs2Fetch mod="имя модуля" met="имя метода"}
http://имя домена/имя модуля/имя метода
Если метод прикреплен к типу, то его URL имеет вид
{xs2Fetch mod="имя модуля" obj="имя типа" met="имя метода"}
http://имя домена/имя модуля/имя типа/имя метода/ 

Кроме этого, через атрибут "atr" можно передать в вызываемый метод параметры, разделенные "." точно так же, как и в URL, но только без конечного ".htm". Например, следующие две строки производят совершенно одинаковый вызов одного и того же метода из шаблона и из браузера соответственно:

{xs2Fetch mod="articles" obj="section" met="show" atr="12.2004"}
http://www.example.com/articles/section/show/12.2004.htm

Передача атрибутов, разделенных точкой, производится в URL и xs2Fetch аналогично, однако способы обращения к этим атрибутам в вызываемых методах различны. Обратите внимание на эту разницу.

Атрибуты, переданные через URL всегда доступны методу через массив $_THE.PARAMS.
Артрибуты, переданные через параметр "atr" при вызове xs2Fetch доступны исключительно в вызываемом методе через массив $_THE.FETCH.PARAMS.

За счет этой разницы методы, которые включаются в другие методы, имеют доступ к тем самым первоначальным параметрам, которые были переданы через URL. Для иллюстрации сказанного расмотрим следующую схему.

Схема вложенных методов
1.  Метод A (http://www.example.com/index/a.b.htm) [
2.    Метод A: Параметр 1 = {$_THE.PARAMS[0]}, Параметр 2 = ¶
                 {$_THE.PARAMS[1]}
3.  
4.    Метод B: {xs2Fetch met="fetch1" atr="c.d"}[
5.     Параметр 1 = {$_THE.PARAMS[0]}, Параметр 2 = ¶
                 {$_THE.PARAMS[1]}
6.     Параметр xs2Fetch 1 = {$_THE.FETCH.PARAMS[0]}, Параметр ¶
                 xs2Fetch 2 = {$_THE.FETCH.PARAMS[1]}
7.  
8.     Метод C: {xs2Fetch met="fetch2" atr="e.f"}[
9.       Параметр 1 = {$_THE.PARAMS[0]}, Параметр 2 = ¶
                 {$_THE.PARAMS[1]}
10.      Параметр xs2Fetch 1 = {$_THE.FETCH.PARAMS[0]}, ¶
                 Параметр xs2Fetch 2 = ¶
                 {$_THE.FETCH.PARAMS[1]}
11.    ]
12.   ]
13. ]

Если создать три изображенных на схеме метода и в каждый поместить код из соотвествующих квадратных скобок, а затем вызвать в браузере URL http://www.example.com/index/a.b.htm, то мы получим следующее:

Метод A: Параметр 1 = a, Параметр 2 = b
Метод B: Параметр 1 = a, Параметр 2 = b
Метод B: Параметр xs2Fetch 1 = c, Параметр xs2Fetch 2 = d
Метод C: Параметр 1 = a, Параметр 2 = b
Метод C: Параметр xs2Fetch 1 = e, Параметр xs2Fetch 2 = f

Как вы уже поняли, вызов xs2Fetch в шаблоне Smarty приводит к вставке результата выполнения другого метода в то месте, где стоит вызов. А что будет, если вызвать эту функцию в процессоре? Точно так же, как и при вызове в шаблоне, выполнится вызываемый метод, однако не произойдет вывод результата его выполнения непосредственно в место вызова. Однако результат выполнения xs2Fetch можно вернуть в переменную, которою затем используется для вывода. В Листинге 16 показано, что сам вызов xs2Fetch не приводит к выводу данных, а лишь к их возврату:

Листинг 16
1.  <?php
2.    $method_result = xs2Fetch(array('mod'=>"news", ¶
                 'obj'=>'news_feed', 'met'=>"hotnews", ¶
                 'atr'=>$news_feed['NodId']));
3.    echo($method_result);
4.  ?>

Вернемся к нашей задаче. В методе главной страницы в вызове xs2Fetch через параметр "atr" мы передаем идентификатор очередной ленты новостей. Теперь необходимо изменить код метода /news/news_feed/hotnews так, чтобы функция xs2GetChildren брала идентификатор ленты из переданного методу значения:

Листинг 17
1.  <div>
2.    ...
3.  
4.    {xs2GetChildren mod="news" NType="news_post" ¶
                 ParId=$_THE.FETCH.PARAMS[0] limit=5 ¶
                 sort="Date desc" var="my_news_posts"}
5.  
6.    ...
7.  </div>

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

Теперь мы можем использовать метод /news/news_feed/hotnews/ повторно. Например, мы можем использовать его на странице новости для вывода пяти свежих новостей из той же ленты, что и текущая новость. Для этого изменим код метода /news/news_post/show следующим образом:

Листинг 18
1.  <html>
2.    <head>
3.      <title>Страница новости</title>
4.    </head>
5.    <body>
6.      {xs2GetNode mod="news" NodId={$_THE.PARAMS[0]} ¶
                 var="my_news_post"}
7.  
8.      <h1>{$my_news_post.NName}</h1>
9.      <div>{$my_news_post.Date}</div>
10.     <div>
11.       {$my_news_post.Text}
12.     </div>
13.     <div>
14.       <h2>Еще свежие новости из той же ленты</h2>
15.       {xs2Fetch mod="news" obj="news_feed" met="hotnews" ¶
                 atr=$my_news_post.ParId}
16.     </div>
17. 
18.     <form name="postComment" method="POST" ¶
                 action="/news/news_post/add_comment/">
19.     ...
20.   </body>
21. </html>

В строке №14 мы передаем через параметр "atr" содержимое поля "ParId" текущей новости. Поле "ParId" является системным и обязательно присутствует в любом узле XS2. Оно содержит идентификатор родительского узла. Поскольку узлы типа "Новость" по нашей модели данных вкладываются в узлы типа "Лента новостей", то мы знаем, что поле "ParId" у каждой новости содержит идентификатор ленты, к которой она принадлежит. Если теперь с главной страницы мы перейдем на любую новость, то под текстом новости и над формой отправки комментария мы увидим блок с пятью самыми свежими заголовками.

Введение

Основные характеристики системы XS2
Требование к хостинг-площадке, на которой устанавливается XS2.
Инструкции по установке XS2 на хостинг-площадке.

Часть 1. XS2 шаг за шагом

Модель данных в XS2: модуль, тип, узел, метод.
Как организовать простейшую структуру данных в XS2 и вывести узлы на главной странице сайта.
Множественный выборки узлов и их вывод на странице в цикле.
Создание второстепенной страницы и организация ссылок на нее.
Структура метода в XS2. Что такое процессор и как он взаимодействует в шаблоном внутри одного метода.
Дерево как универсальный способ организации узлов в XS2. Как настраивать вложенность узлов друг в друга.
Ссылки между узлами как основное средство построения альтернативных структур узлов.
Использование функция XS2 API для выполнения редакторских операций в коде методов.
Функция xs2Fetch и ее возможности при организации повторного использования методов.
Подробнее о взаимодействии процессора и шаблона в одном методе: передача данных между процессором и шаблоном.

Часть 2. Решения на платформе XS2

О чем пойдет речь во второй части, для кого она предназначена.
Как производить дополнительные манипуляции с узломпри его вставка, редактировании, удалении, копировании или перемещении.
Постраничный вывод как способ показа больших массивов данных в одном шаблоне.
Как с помощью XS2 быстро сделать сайт с поддержкой множества языковых версий.
Быстрое развертывание удобных пользовательских интерфейсов с технологией AJAX на платформе XS2.
Подробнее о том, как организовать сложные структуры данных в XS2 и производить в них поиск.
В следующих главах, которые будут публиковаться здесь по мере их написания, мы планируем рассказать о:
Copyright ©1998-2009 Солютекс. Все права защищены.
Этот сайт сделан в designLab | Работает на технологии XS2
Условия использования | О защите конфиденциальности