Добавить новое поле в материал 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"> </span>
* Здесь и далее приведены номера строк которые могут незначительно отличаться в последующих и предыдущих релизах CMS Joomla
Интересная статья! Будет приятно читать ещё ваши статьи. Пишите ещё!
а разве так правильно – value=»new_field; ?>» /> ???
вроде нужно так – value=»new_field; ?>» />
перед php вроде нужно ставить ?
редактор бьет код …
ага, как видите, до вас попросту не было пользователей желающих запостить код в комментариях. но по gmt+2 уж слишком поздно чтобы немедленно по этому поводу что-либо предпринимать =\
укажите, пожалуйста, номера строк примера о которых идёт речь, возможно и правда ошибка коварно закралась в статью
Вы еще кое что забыли.
ALTER TABLE jos_version ADD new_field VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
Без этого не работает!
Верное замечание, однако, справедливо оно скорее для Вашего конкретного случая, а не для лабораторного вакуума о котором идёт речь в статье =) Дело в том что дефолтовая Джумла 1.5.* вообще мне имеет таблицы #__version. У Вас же, скорее всего, дополнительно установлен компонент типа Content Versioning, не так ли? Именно компоненты такого рода создают и используют данную таблицу.
Как бы то ни было, благодарю за ценное дополнение, уверен, найдётся немало пользователей со сходной конфигурацией ЦМС.
Огромное спасибо. Это то, что я искал. Мне нужно было, чтобы при добавлении материала было поле «Город», и под заголовком статьи выводилось:»Город: название Города». Теперь всё появляется.
Хочу вывести в списке материалов, функция вывода вроде такая item->new_field; ?> , но не выводит, что я делаю не так?
Смотри подпункт «3. Модификация библиотеки работы с базой данных». В примере описан случай работы с моделью материала – файл content.php. За список материалов отвечает иная модель, скорее всего, это файл category.php либо section.php.
Изучайте, пробуйте. Успехов.
А где это поле записывается в базу данных?
Я просто применил тип поля(input type=’file’) картинку, имя сохраняется, а файл нет. Где его могу принять, что бы в базу зписать? $_FILE(‘new_field ‘);
Для начала, разберитесь как происходит загрузка файла на сервер средствами php.
http://www.php.net/manual/en/features.file-upload.post-method.php
Огромная благодарность за статью от меня как от фрилансера. Отобрал в свою базу статей. Ровно сейчас возникла необходимость в контент добавить три поля. Статья мне в помощь. Огромная благодарность!!!!
Спасибо за статью. Несколько раз перерыл необходимые страницы о которых вы писали. так и не нашел ошибку, а менеджер материалов не грузится? и в чем может быть проблема???