Добавить новое поле в материал Joomla 1.5

Нередко возникает необходимость расширить функциональность стандартного компонента публикации материалов Joomla, будь то добавление в панель администрирования контента дополнительного текстового поля, select-списка, информационного блока и т.д. В подобном случае, использование громоздких сторонних CCK является нерациональным, хотя бы по причине их значительной избыточности. Ищущим простых изящных решений предназначена эта статья.
Задача не из сложных, и требует не столько понимания принципов работы CMS Joomla, сколько эмпирического знания – где что нужно дописать/изменить. Далее следует пример создания «эталонного» дополнительно поля <input type="text" /> в админке материала.


Примеры тестировались на:

  • PHP – 5.3.2
  • Joomla – 1.5.21

1. Добавление в шаблон интерфейса back-end

Открываем файл administrator/components/com_content/admin.content.html.php – здесь содержится шаблон страницы добавляемого/редактируемого материала. Находим строку номер 833* где видим закрывающий тег. Непосредственно после него добавляем свою таблицу:

<table class="adminform">
	<tbody>
		<tr>
			<td>Новое поле:</td>
			<td><input id="new_field" class="inputbox" maxlength="255" name="new_field" size="40" type="text" value="<php echo $row->new_field; ?>" /></td>
			<td></td>
			<td></td>
		</tr>
	</tbody>
</table>

1.1. (опционально) Добавление в шаблон интерфейса front-end

Для возможности работы с новым полем непосредственно со страниц сайта, аналогично работаем с файлом components/com_content/views/article/tmpl/form.php:

<table class="adminform">
	<tbody>
		<tr>
			<td>Новое поле:</td>
			<td><input id="new_field" class="inputbox" maxlength="255" name="new_field" size="40" type="text" value="<php echo $this->article->new_field; ?>" /></td>
			<td></td>
			<td></td>
		</tr>
	</tbody>
</table>

2. Модификация базы данных

При помощи любого менеджера баз данных (например phpMyAdmin) редактируем структуру таблицы #__content (по умолчанию jos_content), добавляя поле new_field с текстовым типом данных. Например, таким запросом:

ALTER TABLE jos_content ADD new_field VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

3. Модификация библиотеки работы с базой данных

Открываем файл libraries/joomla/database/table/content.php , находим строку class JTableContent extends JTable и добавляем свойство var $new_field = null;

class JTableContent extends JTable {
	/** @var string This is our new field */
	var $new_field 		= null;
	/** @var int Primary key */
	var $id 			= null;
	/** @var string */
	var $title 			= null;

4. Модификация модели компонента

В папке components/com_content/models расположены несколько файлов, функциональное назначение которых отражено в их названии. Например, category.php содержит код MVC-модели части компонента отвечающего за вывод данных в формате списка/блога. В случае использования данных из нового поля вне пределов страницы материала/статьи, за которую отвечает файл article.php который не требует модификаций, необходимо будет внести изменения в запрос для выборки из таблицы . Проще всего это сделать найдя в нужном файле текст a.title_alias и добавив в перечень обрабатываемых столбцов a.new_field . К примеру, для модели категории это изменение будет выглядеть следующим образом:
В строке 361 файла category.php найти текст:

$query = 'SELECT cc.title AS category, a.id, a.title, a.alias, a.title_alias, a.introtext, ...

И модифицировать выборку:

$query = 'SELECT cc.title AS category, a.id, a.title, a.alias, a.title_alias, a.new_field, a.introtext, ...

5. Использование

К этому моменту мы уже имеем полнофункциональную систему, осталось лишь продемонстрировать пример использования добавленного функционала, что мы и сделаем, добавив данные из нового поля как постскриптум материала/статьи. Один из вариантов реализации – модификация стандартных шаблонов. Для этого необходимо открыть файл components/com_content/views/article/tmpl/default.php и, добавив необходимый html-блок, вывести данные из переменной $this->article->new_field . Находим html-код и добавляем перед ним наш код:

</table>
<div><?php echo $this->article->new_field; ?></div>
<span class="article_separator">&nbsp;</span>

* Здесь и далее приведены номера строк которые могут незначительно отличаться в последующих и предыдущих релизах CMS Joomla

  1. Drinna
    1st Ноябрь 2010 в 05:03

    Интересная статья! Будет приятно читать ещё ваши статьи. Пишите ещё!

  2. Игорь
    13th Декабрь 2010 в 01:25

    а разве так правильно – value=»new_field; ?>» /> ???

    вроде нужно так – value=»new_field; ?>» />

  3. Игорь
    13th Декабрь 2010 в 01:26

    перед php вроде нужно ставить ?

    редактор бьет код …

    • admin
      13th Декабрь 2010 в 01:56

      ага, как видите, до вас попросту не было пользователей желающих запостить код в комментариях. но по gmt+2 уж слишком поздно чтобы немедленно по этому поводу что-либо предпринимать =\
      укажите, пожалуйста, номера строк примера о которых идёт речь, возможно и правда ошибка коварно закралась в статью

  4. Stas
    21st Декабрь 2010 в 22:54

    Вы еще кое что забыли.
    ALTER TABLE jos_version ADD new_field VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
    Без этого не работает!

    • admin
      22nd Декабрь 2010 в 11:26

      Верное замечание, однако, справедливо оно скорее для Вашего конкретного случая, а не для лабораторного вакуума о котором идёт речь в статье =) Дело в том что дефолтовая Джумла 1.5.* вообще мне имеет таблицы #__version. У Вас же, скорее всего, дополнительно установлен компонент типа Content Versioning, не так ли? Именно компоненты такого рода создают и используют данную таблицу.
      Как бы то ни было, благодарю за ценное дополнение, уверен, найдётся немало пользователей со сходной конфигурацией ЦМС.

  5. Владимир
    28th Декабрь 2010 в 16:54

    Огромное спасибо. Это то, что я искал. Мне нужно было, чтобы при добавлении материала было поле «Город», и под заголовком статьи выводилось:»Город: название Города». Теперь всё появляется.

  6. fAcknet
    1st Март 2011 в 14:08

    Хочу вывести в списке материалов, функция вывода вроде такая item->new_field; ?> , но не выводит, что я делаю не так?

    • admin
      2nd Март 2011 в 12:08

      Смотри подпункт «3. Модификация библиотеки работы с базой данных». В примере описан случай работы с моделью материала – файл content.php. За список материалов отвечает иная модель, скорее всего, это файл category.php либо section.php.
      Изучайте, пробуйте. Успехов.

  7. Антон
    1st Март 2011 в 16:24

    А где это поле записывается в базу данных?
    Я просто применил тип поля(input type=’file’) картинку, имя сохраняется, а файл нет. Где его могу принять, что бы в базу зписать? $_FILE(‘new_field ‘);

  8. RedPixel
    12th Июнь 2011 в 10:24

    Огромная благодарность за статью от меня как от фрилансера. Отобрал в свою базу статей. Ровно сейчас возникла необходимость в контент добавить три поля. Статья мне в помощь. Огромная благодарность!!!!

  9. Agenm
    18th Август 2011 в 00:55

    Спасибо за статью. Несколько раз перерыл необходимые страницы о которых вы писали. так и не нашел ошибку, а менеджер материалов не грузится? и в чем может быть проблема???