На Deep-CMS «напал»:

Typical Programmer

Получение данных в шаблоне

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

Хлебные крошки

dataHelper::getBreadcrumbs($id, $showHome = false)

Возвращает массив «хлебных крошек». Первым аргументом передается идентификатор узла от которого нужно подняться вверх и построить путь, второй аргумент булевый, по желанию — прикрепить к началу пути «хлебных крошек» главную страницу или нет. Если целевой узел не имеет родителей, метод вернет пустой массив.

Каждый элемент «хлебных крошек», является массивом следующего вида:

array(

  'id'         => 1,
  'parent_id'  => 0,
  'lvl'        => 2,
  'page_alias' => '/url/do/page.html',
  'node_name'  => 'Название узла'

);

Ниже приведен пример, который построит «хлебные крошки» начиная с главной страницы, заканчивая текущим узлом, идентификатор которого содержится в предопределенной переменной окружения $id:

<?php foreach (dataHelper::getBreadcrumbs($id, true) as $item) { ?>
    <a href="<?=$item['page_alias']?>"><?=$item['node_name']?></a>
<?php } ?>

Текущая страница

В шаблоне текущей страницы уже доступны все возможные данные отображаемого узла. Конечно, у каждого типа узла разное количество свойств (полей) и разные их имена. Тем не менее — на странице присутствуют все. Однако среди этих данных нет ни прикрепленных к узлу изображений, ни его характеристик. Оно и понятно — никогда не будет лишним поберечь ресурсы сервера. Но на случай если прикрепленные изображения и характеристики все-же понадобятся, есть специальные методы.

dataHelper::getAttachedImages($id)

Метод принимает в качестве аргумента идентификатор целевого узла. Возвращает массив имен прикрепленных изображений. Если целевой узел не имеет прикрепленных изображений, метод вернет пустой массив. Внимание! Данный метод используется в контексте только одного узла! Не используйте его в цикле! К получению прикрепленных изображений для коллекции узлов существует более оптимальный способ!

Пример получения прикрепленных изображений для текущей страницы:

<div id="images">
  <?php foreach (dataHelper::getAttachedImages($id) as $img) { ?>
    <a href="/upload/<?=$img?>"><img alt="" src="/upload/thumb_<?=$img?>" /></a>
  <?php } ?>
</div>

В данном примере, в каждой переменной $img содержится только имя изображения, например «picture.jpg». Однако, при добавлении изображения через административный раздел, создаются три его копии: полноразмерная, средняя и превью. Доступ к полноразмерному изображению возможен непосредственно по его имени. Для получения среднего изображения необходимо присоединить к имени префикс «middle_», а для получения превью префикс «thumb_»

Принцип получения превью и ссылки на просмотр полноразмерного изображения, находящихся в папке «upload» в корне сайта, показан в примере выше.

dataHelper::getNodeFeatures($id)

Метод принимает в качестве аргумента идентификатор целевого узла. Возвращает массив характеристик узла. Если целевой узел не имеет характеристик, метод вернет пустой массив. Внимание! Данный метод используется в контексте только одного узла! Не используйте его в цикле! К получению характеристик для коллекции узлов существует более оптимальный способ!

Пример получения характеристик для текущего документа:

<div id="features">
  <?php foreach (dataHelper::getNodeFeatures($id) as $feature) { ?>
    <div><?=$feature['name']?></div>
    <div><?=$feature['value']?></div>
  <?php } ?>
</div>

Узлы дерева

dataHelper::getNode($id, $options = array())

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

dataHelper::getNodeChildren($id, $options = array())

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

dataHelper::getChainChildren($id, $options = array())

Возвращает массив ВСЕХ потомков узла вне зависимости от глубины их вложенности, а так же их дополнительные поля, на основании опций, переданных во втором аргументе. Если у целевого узла нет потомков, метод вернет пустой массив.

Например, если в разделе каталога есть подразделы, а в них еще подразделы вложенные в эти подразделы, и только потом товары — будут получены ВСЕ потомки включая подразделы, подразделы подразделов и сами товары.

dataHelper::getMenuItems($id, $options = array())

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

Получение коллекции узлов без использования опций

По умолчанию для любого узла в выборке возвращаются следующие поля:

array(

  'id'         => 1,
  'parent_id'  => 0,
  'prototype'  => 'simplePage',
  'lvl'        => 1,
  'lk'         => 1,
  'rk'         => 2,
  'page_alias' => '/url/do/page.html',
  'node_name'  => 'Главная страница'

);

где:

  • id — идентификатор узла
  • parent_id — идентификатор родителя
  • prototype — тип узла
  • lvl — уровень (глубина) вложения узла
  • lk — левый ключ Nested Set
  • rk — правый ключ Nested Set
  • page_alias — URL узла
  • node_name — название узла

Ниже приведен простой пример без использования дополнительных опций, который вернет массив потомков целевого узла:

<div>
  <?php foreach (dataHelper::getNodeChildren($id) as $item) { ?>
    <div><?php echo $item['node_name']; ?></div>
  <?php } ?>
</div>

Использование опций

Второй аргумент вышеперечисленных методов для работы с узлами дерева является масивом опций. В этих опциях доступны следующие ключи:

$options = array(

  'more'   => array(),
  'filter' => array(),
  'sort'   => array(),
  'limit'  => 0,
  'pages'  => true

);

где:

more — массив имён дополнительных полей. Эти поля будут добавлены к основным возвращаемым полям узлов. Если требуемого поля у конкретного типа узла не существует, то будет возвращен ключ с пустым значением. Ниже приведен пример получения дополнительных полей:

<div>
  <?php

    $options = array(
      'more' => array('price', 'page_text')
    );

    foreach (dataHelper::getNodeChildren($id, $options) as $item) { ?>

      <div><?php echo $item['node_name']; ?></div>
      <div><?php echo $item['price']; ?></div>
      <div><?php echo $item['page_text']; ?></div>

  <?php } ?>
</div>

filter — массив, в который можно передать названия типов узлов. Если этот массив не пуст, то в результат будут добавлены только те узлы, типы которых перечислены в этом массиве. Остальные узлы будут отфильтрованы и в выборку не попадут. Это, например, полезно при выборке цепочки потомков для фильтрации товаров среди подразделов. Ниже приведен пример фильтрации по типам при получении цепочки вложенных потомков:

<div>
  <?php

    $options = array(
      'more'   => array('price', 'page_text'),
      'filter' => array('simpleGoods')
    );

    foreach (dataHelper::getChainChildren($id, $options) as $item) { ?>

      <div><?php echo $item['node_name']; ?></div>
      <div><?php echo $item['price']; ?></div>
      <div><?php echo $item['page_text']; ?></div>

  <?php } ?>
</div>

sort — массив описывающий по каким полям и в какую сторону будет идти сортировка. Доступны два типа сортировки: ASC и DESC, по возрастанию и по убыванию соответственно. Регистр передаваемых типов не важен, валидными будут считаться: AsC, aSC, ASC, desc, DeSc и т.д.. По умолчанию считается что сортировка идет по возрастанию. Если система не распознает переданный тип сортировки, будет подставлен тип сортировки по умолчанию, т.е. ASC.

Если переданное поле для сортировки отсутствует, оно будет проигнорировано. По умолчанию выборка сортируется по одному полю «lk» по возрастанию. Для сортировки можно передавать несколько полей. В каком порядке они были описаны в опциях, в таком и будут применены при выборке. Ниже представлен пример использования сортировки:

<div>
  <?php

    $options = array(
      'more' => array('page_text'),
      'sort' => array('price' => 'desc', 'weight' => 'asc')
    );

    foreach (dataHelper::getNodeChildren($id, $options) as $item) { ?>

      <div><?php echo $item['node_name']; ?></div>
      <div><?php echo $item['page_text']; ?></div>

  <?php } ?>
</div>

Внимание! Перечисленные в сортировке поля никогда автоматически не добавляются в выборку! Если они Вам нужны — указывайте их явно в массиве more.

limit — целое число, ограничивающее количество возвращаемых выборкой потомков. По умолчанию лимит равен нулю, что означает отсутствие ограничений. Лимит полезен в случае когда необходимо вернуть только несколько узлов, например, анонсы последних новостей. Ниже приведен пример использования ограничения выборки:

<div>
  <?php foreach (dataHelper::getNodeChildren($id, array('limit' => 4)) as $item) { ?>
    <div><?php echo $item['node_name']; ?></div>
  <?php } ?>
</div>

pages — булевое. Если передан true, dataHelper переходит в режим пагинации. Предыдущий параметр «limit» в режиме пагинации работает иначе, а именно — указывает сколько элементов выводить на одну страницу. Кроме этого есть несколько специальных методов для режима пагинации. Ниже приведен пример разбивки выборки на страницы:

<div>
  <?php

    $options = array(
      'more'  => array('price', 'page_text'),
      'sort'  => array('price' => 'asc'),
      'pages' => true,
      'limit' => 10
    );

    foreach (dataHelper::getNodeChildren($id, $options) as $item) { ?>

      <div><?php echo $item['node_name']; ?></div>
      <div><?php echo $item['price']; ?></div>
      <div><?php echo $item['page_text']; ?></div>

  <?php } ?>
</div>

<div>
  <?php foreach (dataHelper::getPages() as $item) { ?>
    <a<?=$item['current']?' class="current"':''?>
      href="<?=request::changeOriginURL(array('page' => $item['number']))?>"><?=$item['number']?></a>
  <?php } ?>
</div>

В примере, после основного цикла видно использование специального метода dataHelper::getPages(), который возвращает массив для построения навигации. Кроме этого метода имеются еще несколько. Ниже представлен их полный список:

  • dataHelper::getPages() — возвращает массив для построения навигации.
  • dataHelper::getNumberOfItems() — возвращает количество всех элементов в данной выборке.
  • dataHelper::getNumberOfPages() — возвращает количество страниц выборки.
  • dataHelper::getCurrentPage() — возвращает номер текущей страницы в выборке.

Постраничную выборку можно вызывать любое количество раз. Внимание! Повторный вызов выборки затирает предыдущие результаты!

Прикрепленные изображения в коллекции узлов

Начнем с того, что в административном разделе каждому узлу дерева можно установить основное изображение, выбрав его из заранее загруженных прикрепленных изображений.

Это основное изображение узла можно получить в выборку, передав в опциях ключ «image» вместе с прочими именами дополнительных полей. Если у узла нет ни одного прикрепленного изображения, или основное изображение узла отсутствует по каким-либо иным причинам, в результате вернется имя изображения заглушки:

<div>
  <?php

    $options = array(
      'more' => array('image', 'price')
    );

    foreach (dataHelper::getNodeChildren($id, $options) as $item) { ?>

      <div><?php echo $item['node_name']; ?></div>
      <div><img alt="" src="/upload/middle_<?php echo $item['image']; ?>" /></div>
      <div><?php echo $item['price']; ?></div>

  <?php } ?>
</div>

А для получения всей коллекции прикрепленных изображений необходимо передать ключ «images» (обратите внимание — во множественном числе):

<div>
  <?php

    $options = array(
      'more' => array('price', 'images')
    );

    foreach (dataHelper::getNodeChildren($id, $options) as $item) { ?>

      <div><?php echo $item['node_name']; ?></div>
      <div><?php echo $item['price']; ?></div>

      <?php foreach ($item['images'] as $img) { ?>
        <img alt="" src="/upload/thumb_<?php echo $img; ?>" />
      <?php } ?>

  <?php } ?>
</div>

Как можно видеть из примера — в результате возвращается массив изображений, который можно затем вывести в цикле. Если узел не имеет прикрепленных изображений, то массив будет пустым.

Ключи «image» и «images» и их комбинации никаким образом не влияют друг на друга и не порождают магии. Каждый из ключей возвращает именно то, чего от него ожидают.

Получение характеристик в коллекцию узлов

Получение характеристик ничем не отличается от получения прикрепленных изображений. Необходимо в опциях, вместе с прочими именами дополнительных полей, передать ключ «features»:

<div>
  <?php

    $options = array(
      'more' => array('features')
    );

    foreach (dataHelper::getNodeChildren($id, $options) as $item) { ?>

      <div><?php echo $item['node_name']; ?></div>

      <?php foreach ($item['features'] as $feature) { ?>
        <div><?php echo $feature['name']; ?></div>
        <div><?php echo $feature['value']; ?></div>
      <?php } ?>

  <?php } ?>
</div>

По аналогии с прикрепленными изображениями, возвращается массив существующих характеристик. Если у узла нет ни одной характеристики, этот массив будет пуст.

Deep: 2013-11-12 16:12:58 (обновлено 2014-03-03 18:16:07)

Оставить комментарий

Комментарии:

protection