Хотите немного Joomla-магии, господа? ;-) В этой статье я расскажу о том, как добавить любые дополнительные поля к материалам Joomla не касаясь базы данных и не ломая ядро(ну почти :-)).
Joomla-магия.
Начиная с Joomla 3.7, дополнительные поля для материалов стали частью ядра Joomla. Если вы используете последнюю версию Joomla, данная статья для вас не актуальна.
Всё началось с того, что в комментариях к статье «Новые функции Joomla 2.5» один из пользователей написал, что есть способ добавить дополнительные поля к материалам Joomla не касаясь базы данных и ядра. Суть его заключается в следующем (все действия описываются для Joomla 1.7):
1) Открываем файл administrator\components\com_content\models\forms\article.xml
2) В самый конец группы полей attribs (примерно 335 строка) добавляем собственное поле:
<field name="article_additional" type="inputbox" label="Дополнительное поле" description="Это дополнительное поле, которое мы создали" class="inputbox" size="25" />
3) В макете материала templates\ваш_шаблон\html\com_content\article\default.phpдобавляем вывод данных из нашего поля. В нужном месте пишем следующий код:
<?php if ($params->get('article_additional') !== '') : ?> <!-- Проверяем не является ли параметр пустым-->
<?php echo JText::_($params->get('article_additional')); ?> <!--Выводим значение параметра-->
<?php endif; ?> <!--Конец проверки-->
На этом всё. Добавляем новую статью. В параметрах отображения материала видим наше поле:
Вводим в поле информацию. Сохраняем статью. Идем на сайт. Смотрим эту статью. Видим информацию введенную в новое поле:
Ну разве не волшебство? :-)
Тайна фокуса.
Но давайте всё-таки разберемся, как такое возможно. Данная фишка, как оказалось, довольно известна. Но лично я о ней не знал и решил, что ее описание здесь будет не лишним.
Как же получилось сохранить информацию, не создавая дополнительных полей в базе данных? Оказывается, всё просто. Если мы заглянем в базу, то увидим, что в таблице материалов Joomla есть столбец attribs, в котором сохраняются все параметры отображения статьи. Все те, которые мы видим справа, когда добавляем материал в админке.
Все эти параметры считываются как раз из файла administrator\components\com_content\models\forms\article.xml.
Таким образом, добавив в этот файл всего несколько строчек, мы получаем дополнительное поле любого типа, которое хранится в поле attribs таблицы _content базы данных Joomla.
Ну а дальше проверяем наличие в нашем поле данных и если таковые имеются, выводим их в макете статьи.
Дополнительная информация.
Параметры добавляемого поля:
- Name – название поля. Придумываем сами.
- Type – тип поля. Т.к. я создаю текствовое, то использовал inputbox. Другие типы можно посмотреть выше в этом же файле.
- Label – текст, который написан перед полем. Придумываем сами.
- Description – описание, появляющееся во всплывающей подсказке. Придумываем сами.
- Class – CSS-класс для оформления поля. Указываем такой же, как и для других полей этого типа.
- Size – размер поля. Указываем такой же, как и для других полей этого типа.
В примере я заменил языковые константы на обычный текст. Так делать не нужно. Это сделано лишь для упрощения примера.
Заключение.
К сожалению, данный фокус обладает рядом недостатков:
- При переходе на следующую версию Joomla, файл article.xml скорее всего обновится и изменения пропадут. Т.е., фактически, мы всё же применили один мини-хак;
- Расположение дополнительных полей в админке стандартное. Его можно изменить, но это потребует дополнительных хаков;
- Информацию из дополнительных полей можно показывать в контенте, но по ним нельзя производить фильтрацию материалов. Сей факт является наиболее печальным, т.к. фильтрация крайне важна. Я не говорю, что фильтрацию нельзя сделать в принципе. Можно создать дополнительный компонент, который будет фильтровать материалы по атрибутам, но вряд ли кто-то займется этим в ближайшее время. Тем более, что есть SEBLOD, позволяющий выполнять те же самые функции, но гораздо более гибко.
В результате мы имеем небольшой фокус, который может быть полезен только в некоторых случаях. Но это всё равно лучше, чем ничего :-).