Search Documentation

Создание шаблонов - статьи

Для понимания этой темы необходимо ознакомится с темой основы работы с шаблонами.

В шаблоне списка статей или полного вида статьи Вы увидите объект $item, который содержит в себе Запись (record).

Объект $item содержит как основные свойства Записи, например ctime (время создания), rating (рейтинг), hits (просмотры), user_id (id пользователя), так и поля. Доступ к основным свойствам Записи можно получить, как показано ниже:

Hits: <?php echo $item->hits; ?>

Q: Как посмотреть список всех доступных свойств объекта Запись (record)?

Для просмотра всех свойств объекта $item можно просто добавить в нужных местах шаблона следующее выражение

var_dump(get_object_vars($item));

Q: Как получить URL записи?

Если вы хотите получить URL текущей записи. Для URL объекта $item это работает так

<?php echo JRoute::_($item->url);?>

Если Вам необходим URL другой записи и Вы имеете только ID

<?php echo JRoute::_(Url::record($record_id));?>

Поля Записи

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

  • $item->fields_by_id - массив полей записи, где ID поля является ключом массива.
  • $item->fields_by_key - массив полей записи, где ключ (key) поля является ключом массива. Пожалуйста, прочитайте что это такое в FAQ в конце этого раздела статьи.
  • $item->fields_by_group - многоуровневый массив полей записи, где первый уровень является группой полей, а на втором уровне расположены сами поля. Поля не сгруппированые в группы находятся в индексе 0.

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

<?php if(isset($item->fields_by_id[12])): ?>
	<span class="field-year">
    	<?php echo $item->fields_by_id[12]->result; ?>
    </span>
<?php endif; ?>

Если Вы хотите вызвать поле по ключу, сначала необходимо получить ключ по ID поля а потом уже вызвать поле по ключу.

<?php $key = $this->fields_keys_by_id[12];?>
<?php if(isset($item->fields_by_key[$key])): ?>
	<span class="field-year">
    	<?php echo $item->fields_by_key[$key]->result; ?>
    </span>
<?php endif; ?>

Пример выше поддерживает шаблон с несколькими типами контента. Предположим это список статей нескольких типов и в каждом типе есть поле цена. В одном типе это ID 12 в другом 25. Этот пример покажет как то поле так и другое. Так как $this->fields_keys_by_id[12] и $this->fields_keys_by_id[25] вернут совершенно одиноковый ключ.

Q: Как узнать идентификатор (ID) поля?

Вы можете найти идентификатор поля в списке полей (2)

Q: Что такое ключ (key) поля.

Ключ поля теперь есть часть поддержки нескольких типов контента в шаблонах. Вам не нужно создавать этот ключ, я просто хочу объяснить нашу концепцию. Ключ поля образуется как результат MD5 типа поля и его метки.

$field_key = 'k'.md5($field->label.'-'.$field->field_type);

Пусть метка поля будет Year и тип поля будет digits. Тогда

$field_key = 'k'.md5('Year-digits');

Тогда при вызове поля по ключу (field by key), независимо от его типа, если это было поле Year типа digits, оно будет показано в Вашем шаблоне.

Вы можете найти ключ поля в столбце key списка полей jos_js_res_fields (3).

Q: Результат поля содержит HTML код. Как получить строку текста?

Самый просто способ получить текст без HTML кода.

echo strip_tags($item->fields_by_id[12]->result);

Q: Как получить данные поля если поле недоступно?

Предположим есть поле которое нельзя показывать в списке но вы хотите получить данные этого поля. У объекта $item есть свойство fields. Оно является массивом данных с индексом данных полей по айди поля. Вот такой код покажет вам читсные данные поля не обработаные и не преобразованые в HTML.

var_dump($item->fields[12]);

Q: Как я могу посмотреть все доступные свойства объекта Поле (field object)?

Вы можете использовать этот метод для получения списка свойств объекта.

var_dump(get_object_vars($item->fields_by_id[12]));

Объект Поле (Field)

Каждый $item->fields_by_key[$key] или $item->fields_by_id[12] является объектом Поле (field) и содержит значительно больше параметров, чем ->result.

Некоторые из них очень полезны. Например, в таблице Вы хотите все поля типа digits выровнять по правому краю.

<td<?php echo ($field->type == 'digits' ? ' align="right" ' : NULL ) ?>>
	<?php echo $field->result;?>
</td>

Или $item->fields_by_id[12]->params содержит в себе все параметры, которые Вы установили при создании поля. Например класс, установленный в параметрах поля.

<span class="my-class <?php echo $item->fields_by_id[12]->params->get('core.field_class')?>">
    <?php echo $item->fields_by_id[12]->result;?>
</span>

Или $field->value содержить не обработанные данные поля.

Q: Какие типы полей доступны и как я могу узнать тип поля?

Вы можете найти тип поля в списке полей (1)

Настройка полей в Параметрах

Это отличная технология для управления, стилизации или позиционирования полей. Например, есть поле Price. И Вы хотите показать его в определенном месте в особом стиле.

  • Добавьте параметр

    <fields name="tmpl_params">
        <fieldset name="name1" label="Position Fields" key="id"
            description="Set fields to be positioned">
            <field name="field_price" type="meresourcesfields" label="Where is the price?" />
        </fieldset>
    </fields>
    
    Если какой-либо из параметров ссылается на поле, имя этого параметра должно начинаться с `field_*` для дальнейшей корректной упаковки и распаковки упаковщиком.

    Если Вы хотите, чтобы в списке были показаны поля только некоторого типа, используйте атрибут filters="'text', ' textarea', 'html'". Этим Вы ограничите типы показываемых полей.

    Чтобы поле имело множественный выбор, добавьте size="15" и multiple="true"

  • В шаблоне используйте что-нибудь типа этого

    <?php $key = $this->fields_keys_by_id[$params->get('tmpl_params.field_price')];?>
    <?php if(isset($item->fields_by_key[$key])): ?>
        <span class="field-price">
            <?php echo $item->fields_by_key[$key]->result; ?>
        </span>
    <?php endif; ?>
    

Читайте подробнее о работе с параметрами в шаблонах

Q: Как исключить определенное поле из массива полей после его вывода?

После того, как Вы вывели это поле, Вы можете исключить его из массива полей.

<?php $key = $this->fields_keys_by_id[$params->get('tmpl_params.field_price')];?>
 <?php if(isset($item->fields_by_key[$key])): ?>
    <span class="field-price">
        <?php echo $item->fields_by_key[$key]->result; ?>
        <?php unset($item->fields_by_key[$key]) ?>
    </span>
<?php endif; ?>

Теперь поля field_price не будет в массиве.

Дополнение