Назовем наш элемент — 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, приоритет и скорость ответа там выше.