Назовем наш элемент — jbint, который будет принимать и выводить целые числа.
У него будет 3 шаблона:
edit.php — форма для редактирования.
default.php — обычный вывод целого числа.
thousand.php — вывод числа с разделением тысячных через пробел.
Элемент повторяемо-отправляемый. Он будет иметь настройку для выбора шаблона и настройку, которая будет использоваться для теста при ajax запросе.
При подаче материала элемент будет принимать целые числа.
Создайте папку jbint в директории:
media/zoo/elements/
или в
media/zoo/applications/jbuniversal/elements
В первом случае элемент будет доступен любым каталогам для Zoo. Во втором только для JBZoo.
Положите туда следующие 2 файла.
<?xml version="1.0" encoding="utf-8" ?> <!-- type - Тип элемента. Он должен быть уникальным. group - Группа элемента. Группа определяется позицией при создании новых элементов. --> <element type="jbint" group="JBZoo"> <name>JBInt</name> <author>A. Oganov</author> <creationDate>2014 April</creationDate> <copyright>Copyright (C)</copyright> <authorEmail>email автора</authorEmail> <authorUrl>url автора</authorUrl> <version>1.0</version> <params> <!-- Параметры выводятся при создании элемента, конфиг элемента --> <param name="ajax" type="text" default="ajax" label="Default text" /> </params> <params group="render"> <!-- параметры выводятся в настройках шаблона вывода - full, teaser и т.д. --> <param name="template" type="zoolist" default="default" label="Chose template"> <option name="JBZOO_ELEMENT_STANDART">default.php</option> <option name="JBZOO_ELEMENT_THOUSAND">thousand.php</option> </param> <param name="separated_by" type="zoolist" default="Space" label="Separated by" description="CHOOSE_SEPARATOR_REPEATED_ELEMENTS"> <option name="Space"><![CDATA[separator=[ ]]]></option> <option name="Break"><![CDATA[separator=[<br />]]]></option> <option name="Span"><![CDATA[tag=[<span>%s</span>]]]></option> <option name="Paragraph"><![CDATA[tag=[<p>%s</p>]]]></option> <option name="Div"><![CDATA[tag=[<div>%s</div>]]]></option> <option name="List Item"><![CDATA[tag=[<li>%s</li>]]]></option> <option name="Unordered List"><![CDATA[tag=[<li>%s</li>] enclosing_tag=[<ul>%s</ul>]]]></option> <option name="Ordered List"><![CDATA[tag=[<li>%s</li>] enclosing_tag=[<ol>%s</ol>]]]></option> <option name="Warp Item"><![CDATA[tag=[<article class="item">%s</article>]]]></option> </param> </params> </element>
Все типы параметров, которые мы можем использовать в элементе, находятся по адресу -
/administrator/components/helpers/fields/
или jbuniversal/joomla/elements/
Тут же можно создавать свои типы, но это уже другая история.
// Запрещаем прямой доступ к файлу defined('_JEXEC') or die('Restricted access'); // Регистрируем ElementRepeatable class App::getInstance('zoo')->loader->register('ElementRepeatable', 'elements:repeatable/repeatable.php'); class ElementJBInt extends ElementRepeatable implements iRepeatSubmittable { /** * Checks if the repeatables element's value is set. */ public function _hasValue($params = array()) { $value = $this->get('number'); return !empty($value); } /** * Get elements search data. * @return null | int */ public function _getSearchData() { return (int) $this->get('number'); } /** * Renders the edit form field. * @return string HTML */ public function _edit() { if ($layout = $this->getLayout('edit.php')) { return $this->renderLayout($layout); } return false; } /** * Render * @param array $params * @return null | string HTML */ public function _render($params = array()) { if ($layout = $this->getLayout($params->get('template', 'default.php'))){ return $this->renderLayout($layout); } return false; } /** * Renders the element in submission. * @param array $params submission parameters * @return null | string HTML */ public function _renderSubmission($params = array()) { return $this->_edit($params); } /** * Validates the submitted element * @param AppData $value value * @param AppData $params submission parameters * @return array * @throws AppValidatorException */ public function _validateSubmission($value, $params) { $value = $this->app->validator->create('integer', array( 'required' => $params->get('required') ) )->clean($value->get('number')); return array('number' => $value); }
Дабы не смешивать код логики и код представления, нам нужно создать файлы, которые мы будем использовать для вывода — шаблоны.
Шаблоны должны лежать в папке tmpl. Негласное соглашение об именовании гласит — если элемент повторяемый, к названию шаблона надо добавлять нижнее подчеркивание. Это упростит разработку больших и сложных элементов.
Суть разделения логики и представления состоит в том, что эти компоненты могут модифицироваться независимо друг от друга.
Разберем небольшой пример.
// Проверяем существует ли файл if ($layout = $this->getLayout('_default.php')) { // Буферизация и подключение файла _default.php return $this->renderLayout($layout, array( ‘one’ => ‘var1’, ‘two’ => ‘var2’ )); }
Теперь в файле _default.php мы можем проводить манипуляции с нашими переменными $one и $two.
Так же мы можем вызывать методы элемента в шаблоне — $this остается объектом класса элемента.
Для любопытных, в классе Element можно посмотреть реализации всех методов —
/media/zoo/elements/element/element.php
Вы можете обратиться на наш специальный форум техподдержки JBZoo. Если у вас нет активного аккаунта со знаком «плюс» в тарифном плане, то вы можете задать свой вопрос в одном из этих разделов или на любой из наших контактов. Форум специально предназначен для JBZoo, приоритет и скорость ответа там выше.