Стили позиций в Zoo существуют для того, чтобы выводить элементы внутри шаблона материала с нужной версткой — будь это таблица, блок или обычный список. Бывает так, что стандартных не хватает, и рано или поздно встает вопрос: «А как же вывести элементы используя свою верстку, классы, id и т.д.?» Вот тут к нам на помощь и приходят пользовательские стили для позиций.
Открывая шаблоны, вы наверное видели следующие строки:
<?php echo $this->renderPosition('subtitle', array('style' => 'block')); ?>
Функция renderPosition выводит все элементы, которые принадлежат установленной позиции. Она имеет как минимум 1 обязательный входящий параметр — это название позиции (из примера выше это subtitle), второй необязательный входящий параметр — это массив настроек (из примера выше это array(’style’ => ’block’)). Массив настроек можно не передавать функции renderPosition, тогда все элементы будут выводиться по стандартному шаблону default.
По умолчанию Zoo имеет 8 стилей, посмотреть их можно в папке:
сайт/components/com_zoo/renderer/element
Там вы увидите следующие php-файлы:
block.php — элементы внутри блока div, блоку можно указать class.
comma.php — внутри тега span, так же можно указать класс.
default.php — без форматирования — в строку.
hyphen.php — строку, разделяя дефисом «-».
inline.php — строку, разделяя запятой «,».
list.php — списком — li.
paragraph.php — элементы абзацами.
pipe.php — строку, разделяя «|».
Название файла — это имя стиля, которое передается в массив настроек. Например, чтобы вывести элементы списком нам достаточно написать:
<?php echo $this->renderPosition('имя позиции', array('style' => 'list')); ?>
В JBZoo также присутствуют стили позиций, и они находятся уже в другой папке, а именно в сайт/media/zoo/applications/jbuniversal/templates/catalog/renderer/element
Открыв эту папку, вы увидите такие файлы как:
jbblock.php
jbsubtitle.php
jbtable.php
jbtitle.php
Далее разберем каждый по порядку...
JBblock — по умолчанию выглядит как стандартный стиль от Zoo (block). Но имеет ряд дополнительных параметров:
tag — возможность указать, в каком теге будет выводиться все содержимое элемента.
labelTag — показывает, как будет выводиться заголовок, по умолчанию strong.
wrapperTag — в каком теге будет выводиться значение.
class — добавляет класс для названия элемента (label).
altlabel — с помощью этого параметра можно заменить название/заголовок (заменится для всех элементов внутри позиции).
clear — принимает значения true, false, по умолчанию false. Если установить в true, то после каждого выведенного элемента будет добавляться блок-разделитель:
<div class="clear clr clearfix"></div>
Параметры для стиля прописываются с помощью массива в this->renderPosition после указания названия позиции.
echo $this->renderPosition('anons' , array(
'style' => 'jbblock',
'class' => 'simple-block' ,
'altlabel' => 'Заголовок элемента' ,
'labelTag' => 'strong',
'tag' => 'p' ,
'wrapperTag' => 'i'
));
На выходе, в исходном коде, вы можете увидеть следующие классы, которые прописываются для элементов:
index-<N> — присваивает число от нуля до последнего элемента (по возрастанию).
element-<ELEMENT_ID> — добавляет hash-id.
element-<ELEMENT_TYPE> — добавляет в класс тип.
first / last — данный класс добавляется первому и последнему элементу соответственно. Первому будет присвоен класс first, а последнему класс last.
JBSubtitle имеет все тоже самое что и JBblock, за исключение параметра tag. По умолчанию установлен размер h2.
JBTable также включает в себя все настройки JBblock, но принудительно установлены следующие параметры:
echo $this->renderPosition('anons' , array(
'style' => 'jbtable',
'labelTag' => 'td',
'tag' => 'tr' ,
'wrapperTag' => 'td'
));
Они нужны для того, чтобы на выходе выводилась таблица. Т.к. эти параметры (labelTag , tag , wrapperTag) установлены принудительно для вывода таблицы, необходимо в массиве указать только стиль ’style’ => ’jbtable’.
JBblock достаточно универсальный. С его помощью можно выводить как таблицу, не используя jbtable, так и списки.
Чтобы вывести элементы в таблице, используя jbblock, нужно вывести позицию следующим образом:
<?php if ($this->checkPosition('anons')) : ?>
<table class="item-anons">
<?php echo $this->renderPosition('anons' , array(
'style' => 'jbblock',
'labelTag' => 'td',
'tag' => 'tr' ,
'wrapperTag' => 'td'
)); ?>
</table>
<?php endif; ?>
А чтобы вывести список, используйте следующую конструкцию:
<?php if ($this->checkPosition('anons')) : ?>
<ul class="item-anons">
<?php echo $this->renderPosition('anons' , array(
'style' => 'jbblock',
'tag' => 'li' ,
'wrapperTag' => 'p'
)); ?>
</ul>
<?php endif; ?>
В его создании ничего трудного нет. Нужны лишь элементарные знания php и html. Наш стиль будет выводить элемент в указанном теге, содержать по умолчанию класс, который также можно указать принудительно или он будет изменен. А также добавим возможность указать тег и id заголовку элемента.
Создаем php файл нашего стиля в папке:
/media/zoo/applications/jbuniversal/templates/catalog/renderer/element
назовем его jbexample.php. Пишем в файл следующие строки:
<?php
defined('_JEXEC') or die('Restricted access'); // Запрещаем прямой доступ к файлу
// Вывод заголовка элемента
$label = ''; // Переменная, в которой будет хранится заголовок
/**
* Т.к вывод заголовка можно указать в настройках элемента - это скрыть/показать.
* Необходимо сделать данную проверку.
*/
if (isset($params['showlabel']) && $params['showlabel']) {
$label .= $element->config->get('name');
}
/**
* Выводим значения элементов.
* Функция render выводит в цикле значения элемента(ов)
*/
echo $label.$element->render($params);
Все готово, можно проверить работу нашего стиля. Откроем шаблон типа (full , teaser и т.д.), например, full и в любой из выводимых позиций укажем только что созданный нами стиль.
У меня есть позиция anons, в которой он не указан:
<?php if ($this->checkPosition('anons')) : ?>
<div class="item-anons"><?php echo $this->renderPosition('anons'); ?></div>
<?php endif; ?>
Вот эту позицию можно вывести с помощью только что созданного стиля. Добавляем второй параметр и указываем наш стиль.
<?php if ($this->checkPosition('anons')) : ?>
<div class="item-anons"><?php echo $this->renderPosition('anons'); ?></div>
<?php endif; ?>
Вот эту позицию можно вывести с помощью только что созданного стиля. Добавляем второй параметр и указываем наш стиль.
<?php if ($this->checkPosition('anons')) : ?>
<div class="item-anons">
<?php
echo $this->renderPosition('anons' , array(
'style' => 'jbexample',
));
?>
</div>
<?php endif; ?>
Давайте проверим.
Вы видите, что 2 элемента выводятся в одну строку без тегов. Давайте это исправим.
Добавим в функцию renderPosition следующее:
<?php if ($this->checkPosition('anons')) : ?>
<div class="item-anons">
<?php
echo $this->renderPosition('anons' , array(
'style' => 'jbexample',
'label' => array(
'tag' => 'strong', // тег, в котором будет заголовок
'id' => 'label', // id заголовка
),
'element' => array(
'tag' => 'p', // тег, в котором будет значение элемента
'class' => 'my-elents' // класс элемента
),
));
?>
</div>
<?php endif; ?>
Если попробуем обновить страницу, то результат останется прежний, т.к. мы не приняли эти параметры в нашем стиле.
Для более лучшего понимая желательно сделать var_dump($params) в файле jbexample.php и посмотреть, что находится в этой переменной. $params возвращает массив с данными. Красным отмечены те самые данные, которые мы вписывали в функцию renderPosition чуть выше.
Принимаем параметры в jbexample.php
<?php
defined('_JEXEC') or die('Restricted access'); // Запрещаем прямой доступ к файлу
// Вывод заголовка элемента
$label = ''; // Переменная, в которой будет хранится заголовок
/**
* Т.к вывод заголовка можно указать в настройках элемента - это скрыть/показать.
* Необходимо сделать данную проверку.
*/
if (isset($params['showlabel']) && $params['showlabel']) {
// Принимаем тег заголовка, если его не указали ставим по умолчанию тег i
$labelTag = (!empty($params['label']['tag'])) ? $params['label']['tag'] : 'i' ;
// Принимаем id заголовка если не указали не выводим
$labelId = (!empty($params['label']['id'])) ? 'id="'.$params['label']['id'].'"' : '' ;
// Склеиваем тег, id и сам заголовок
$label .= '<'.$labelTag.' '.$labelId.'>';
$label .= $element->config->get('name');
$label .= '</'.$labelTag.'>';
}
/**
* Выводим значения элементов/
* Функция render выводит в цикле значения элемента(ов)
*/
// Принимаем тег элемента, если его не указали ставим по умолчанию тег div
$elementTag = (!empty($params['element']['tag'])) ? $params['element']['tag'] : 'div' ;
// Принимаем класс элемента, если не указали не выводим
$elementClass = (!empty($params['element']['class'])) ? 'class="'.$params['element']['class'].'"' : '' ;
// Склеиваем тег, класс и значение. Помещаем все в переменную $myElement
$myElement = '<'.$elementTag.' '.$elementClass.'>'.$element->render($params).'</'.$elementTag.'>';
// Выводим
echo $label.$myElement;
Вот и все! Наш стиль готов, и теперь можно им любоваться.
Используя пользовательские стили позиций, можно выводить свои элементы в любой верстке: обрамляя их нужными тегами, дописывая им собственные классы, id, атрибуты, и много другое, что имеет место в html.
Вы можете обратиться на наш специальный форум техподдержки JBZoo. Если у вас нет активного аккаунта со знаком «плюс» в тарифном плане, то вы можете задать свой вопрос в одном из этих разделов или на любой из наших контактов. Форум специально предназначен для JBZoo, приоритет и скорость ответа там выше.