Хотите немного 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, позволяющий выполнять те же самые функции, но гораздо более гибко.
В результате мы имеем небольшой фокус, который может быть полезен только в некоторых случаях. Но это всё равно лучше, чем ничего :-).
PS. Но решение и вправду - чистое волшебство
Данный возможность(не знаю по чему ее не довели joomla разработчики, думаю в ближайшее время это произойдет) избавит многих пользователей устанавливать CCK со слабыми возможностями. Тот же K2 для доп. полей использует подобную модель в виде метаданных, но они там хранятся не в виде ini-формата как в нашем случае, а в JSON форматате.
Варианты использования на самом деле весьма широки и в основном для полей по которым не нужно фильтровать или сортировать. Например унификация вставки видео материалов(напр. в блоге картинка youtobe, а в статье само видео) вставка аудио, доп. картинки(на сколько я понял в J!2.5 уже не понадобится) и другие варианты которые можно реализовать стандартными элементами(http://docs.joomla.org/Standard_parameter_types), но даже если этих элементов не хватает всегда можно расширить класс JElement добавив свое собственное поле со своим функционалом.
1) вам каждый раз придется ее оформлять
2) если только вы не сверхаккуратный человек, то в разных материалах оформление хоть немного, но будет отличаться.
Далее мы в шаблоне статьи вставляем само видео, а в шаблоне блога только картинку привью видео с ссылкой на полную статью, при этом эти шаблоны располагаются в папке html основного шаблона.
Что получилось смотрим здесь __http://xmama.ru/index.php?option=com_content&view=section&layout=blog&id=5
Таким образом потратив на проблему пол часы, мы в будущем можем избавить себя от проблем со вставкой видео, ведь будет достаточно вставить лишь id видеоролика, а не весь код. И если в будущем мы решим изменить способ отображения ролика(размеры, расположение и т.д.), нам будет необходимо лишь сделать несколько правок в шаблонах, а не проходится по всем статьям.
Скажите пожалуйста, а как у Вас вывод превьшного изображения происходит к списке новостей?!
Хорошо сделано в целом все) Просто и приятно!
Ещё раз спасибо- буду смотреть и при входе на Ваш сайт буду нажимать на баннеры
Чтобы избежать будущих проблем, + добиться сортировки, хотелось бы добавить все таки еще и поле в БД.
пробывал аналогично - http://joomlaforum.ru/index.php/topic,40455.0.html
не получилось. подскажите пож-та.
Версия которая актуальна на сегодня уже имеет встроенные поля.
Используя не актуальную версию, рискуете в вопросе безопасности.
Нужно сделать так:
В blog_item.php в начале файла после $canEdit
добавить строчки
$para = $this->item->attribs;
$attribs = new JRegistry($para);
$show_pole = $attribs->get('article_pole');
echo $show_pole;
жуткие ошибки и кракозябли выдает
метод вроде хороший, но можно ли как-то вывести значение добавленного поля на фронтэнде без добавления кода в templates\ваш_шаблон\html\com_content\article\default.php
мне надо вывести значение этого поля в модуле "произвольный html"
через плагин sourcerer уже все варианты перепробовал, не выводит и всё :(