Куда идем?

Хотите немного 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, позволяющий выполнять те же самые функции, но гораздо более гибко.

В результате мы имеем небольшой фокус, который может быть полезен только в некоторых случаях. Но это всё равно лучше, чем ничего :-).

Об авторе
Wedal
(Виталий). Веб-разработчик полного цикла (Full Stack). Создатель и автор сайта Wedal.ru.
Основной профиль – создание сайтов и расширений на CMS Joomla.
Добавить комментарий

Комментарии  
0
К сожалению, раз вносится изменение в системный файл, это все-таки хак, а хаки - зло. Нужно осваивать SEBLOD, вот в чем сила! Там любые дополнительные поля прикручиваются на раз.
PS. Но решение и вправду - чистое волшебство :-)
0
athree, ну всё же изменения вносятся в xml файл, а не php. Файл article.xml отвечает только за набор полей статьи. Это значит, что при обновлениях текущих версий он не будет затронут. Почти наверняка он обновится при выходе новой версии Joomla. Например, Joomla 2.5. Но это происходит раз в пол года. Восстанавливать файл всего 2 раза в год - не такая уж большая плата за дополнительные поля. А если вы не собираетесь обновляться до новых версий(например, сидите на длительном релизе), то восстанавливать файл не потребуется вообще.
0
Рад, что помог кому то советом которым давно уже сам пользовался. Все никак руки не доходили написать соответствующий статью.

Данный возможность(не знаю по чему ее не довели joomla разработчики, думаю в ближайшее время это произойдет) избавит многих пользователей устанавливать CCK со слабыми возможностями. Тот же K2 для доп. полей использует подобную модель в виде метаданных, но они там хранятся не в виде ini-формата как в нашем случае, а в JSON форматате.

Варианты использования на самом деле весьма широки и в основном для полей по которым не нужно фильтровать или сортировать. Например унификация вставки видео материалов(напр. в блоге картинка youtobe, а в статье само видео) вставка аудио, доп. картинки(на сколько я понял в J!2.5 уже не понадобится) и другие варианты которые можно реализовать стандартными элементами(http://docs.joomla.org/Standard_parameter_types), но даже если этих элементов не хватает всегда можно расширить класс JElement добавив свое собственное поле со своим функционалом.
0
Не плохо. Я так понимаю что для 1.5 это тоже должно работать?
0
slovoblud, да, работает,. Только в Joomla 1.5 файл article.xml находится немного по другому адресу.
0
Вот вопрос а зачем это поле вообще нужно? смысл от него? Тупо написать пару слов? Так это можно сделать и не создавая нового поля а просто дописать в статье и все
1
rete, смысл в удобстве и аккуратности оформления. Если вы используете дополнительное поле, то вам достаточно один раз оформить его в макете. Если же вы будете выводить информацию этого поля каждый раз в редакторе, то:
1) вам каждый раз придется ее оформлять
2) если только вы не сверхаккуратный человек, то в разных материалах оформление хоть немного, но будет отличаться.
0
rete, ну смотрите я вам приведу конкретный пример. Допустим заводим мы таким образом доп. текстовое поле для вставки видео с youtobe. В это поле будем вставлять только Id(напр. oHg5SJYRHA0) от видеоролика и больше нечего.

Далее мы в шаблоне статьи вставляем само видео, а в шаблоне блога только картинку привью видео с ссылкой на полную статью, при этом эти шаблоны располагаются в папке html основного шаблона.

Что получилось смотрим здесь __http://xmama.ru/index.php?option=com_content&view=section&layout=blog&id=5


Таким образом потратив на проблему пол часы, мы в будущем можем избавить себя от проблем со вставкой видео, ведь будет достаточно вставить лишь id видеоролика, а не весь код. И если в будущем мы решим изменить способ отображения ролика(размеры, расположение и т.д.), нам будет необходимо лишь сделать несколько правок в шаблонах, а не проходится по всем статьям.
1

Цитирую joniks:



Что получилось смотрим здесь __http://xmama.ru/index.php?option=com_content&view=section&layout=blog&id=5

Таким образом потратив на проблему пол часы, мы в будущем можем избавить себя от проблем со вставкой видео, ведь будет достаточно вставить лишь id видеоролика, а не весь код. И если в будущем мы решим изменить способ отображения ролика(размеры, расположение и т.д.), нам будет необходимо лишь сделать несколько правок в шаблонах, а не проходится по всем статьям.



Скажите пожалуйста, а как у Вас вывод превьшного изображения происходит к списке новостей?!
Хорошо сделано в целом все) Просто и приятно!
0
Они как раз и применили видимо подобную фишку в Joomla 2.5, где картинка для вводного текста и остального + 3 ссылки в конце статьи задаются именно при помощи этих самых полей - ФОТО
0
Было бы очень хорошо- если бы Вы описали как поменять позицию автора и поставить его в конец материала. Уже 3 день гуглю и всё никак.
0
Andrey, http://wedal.ru/uroki-joomla/joomla-17-layouts.html
0
Спасибо Автору авансом за оперативность - буду читать позже попробую. Просто поставил Нюсграббер и нужно указать ссылки на источник массово и чтоб источник был под статей.
Ещё раз спасибо- буду смотреть и при входе на Ваш сайт буду нажимать на баннеры :-)
0
Как создать для поля отдельное поле в БД?
Чтобы избежать будущих проблем, + добиться сортировки, хотелось бы добавить все таки еще и поле в БД.

пробывал аналогично - http://joomlaforum.ru/index.php/topic,40455.0.html

не получилось. подскажите пож-та.
0
Николай, лучше используйте конструкторы контента, типа Seblod. Они позволят добавить поля без хаков.
0
Данный способ не работает на Joomla 2.5.4
0
А как в списке категории возле анонсов статей вывести этот параметр? Добавляю в файле templates\шаблон\html\com_content\category\blog_item.php - не выводит.
0
перешел до шаблона в нем html/com_content/category/default_articles.php - вот этот файл и надо править. для того чтобы разобраться задублировал hits ( там два раза) в итоге в списке появились два ХИТа. на этом остановился. как свое поле дальше переписать не пойму (( а вы решили свою проблему? и как
0
Разве тема еще актуальна?!
Версия которая актуальна на сегодня уже имеет встроенные поля.

Используя не актуальную версию, рискуете в вопросе безопасности.
0
Александр, всё верно. С выходом Joomla 3.7 тема больше не актуальна.
2

Цитирую lutsk:

А как в списке категории возле анонсов статей вывести этот параметр? Добавляю в файле templates\шаблон\html\com_content\category\blog_item.php - не выводит.


Нужно сделать так:
В blog_item.php в начале файла после $canEdit
добавить строчки
$para = $this->item->attribs;
$attribs = new JRegistry($para);
$show_pole = $attribs->get('article_pole');
echo $show_pole;
0
в джумле 2.5.6 можете поточнее по этому поводу написать? хочу доп поля вывести в анонсе материалов при просмотре категории
жуткие ошибки и кракозябли выдает
0
Подскажите такой-же хак, для третьей джумлы
0
Ништяк! Спасибо, ща опробую))) :D
0
Здравствуйте!

метод вроде хороший, но можно ли как-то вывести значение добавленного поля на фронтэнде без добавления кода в templates\ваш_шаблон\html\com_content\article\default.php

мне надо вывести значение этого поля в модуле "произвольный html"
через плагин sourcerer уже все варианты перепробовал, не выводит и всё :(
0
Евгений, уточните: вы хотите вывести значение дополнительного поля материала в модуле, когда открыт данный материал? Т.е. если мы открываем разные материалы, в модуле выводятся разные значения дополнительного поля, соответствующие разным материалам? И это должен быть именно модуль?
0
спасибо за ответ. да, это должен был быть именно модуль, т.к. мне надо было его показывать только в определённых странах (собирался реализовать через расширение MetaMod). но у меня так и не получилось вывести это поле в модуле. в итоге реализовал через плагины MiniCCK и Hameleon.