Наверх

Как добавить новое поле в модуль

При необходимости можно добавить в административную часть любого из модулей дополнительное поле и вывести его значение в пользовательской части.

В качестве примера добавим поле «Автор» в модуль новостей.

Для этого в таблицу {news} с помощью, например, phpMyAdmin, добавим поле author с типом varchar(250).

Выполним следующий SQL-запрос:

Пример:

ALTER TABLE `ВАШ_ПРЕФИКС_news` ADD `author` VARCHAR(250) NOT NULL;

Далее добавим в массив $variables файла modules/news/admin/news.admin.php в следующую запись:

Пример:

'main' => array (
    
'author' => array(
        
'type' => 'text',
        
'name' => 'Автор'
    
),

где:

  • type – тип поля (подробнее о типах полей можно посмотреть здесь);
  • name – название поля, которое будет отображаться в административной части.

Все! Этого достаточно, чтобы поле «Автор» появилось в административной части сайта на странице редактирования новости. Естественно, его можно заполнять, сохранять, редактировать.

Далее нужно вывести это поле где-нибудь в пользовательской части сайта, например, на странице списка новостей. Рассматривается случай, когда в настройках модуля не подключены категории.

Внесем изменения в файл modules/news/news.model.php. Корректировка затронет метод list_query, где происходит выборка всех полей новости.

Пример:

$rows = DB::query_range_fetch_all("SELECT e.id, e.author, e.created, ...");

Теперь, добавим в цикл вывода новостей файла modules/news/views/news.view.list.php код:

Пример:

if(! empty($row["author"]))
{
    echo
$row["author"];
}

Все! У новостей в списке отобразится наше поле «Автор».

Если категории подключены, нужно править метод list_category_elements_query в файле modules/news/news.model.php:

Пример:

$rows = DB::query_range_fetch_all("SELECT e.id, e.author, e.[name], ...");

Далее нужно действовать аналогично примеру с отключенными категориями. Файл modules/news/views/news.view.list.php:

Пример:

if(! empty($row["author"]))
{
    echo
$row["author"];
}

Для вывода автора в подробном описании новости нужно внести изменения в метод id_query все того же файла modules/news/news.model.php:

Пример:

$row = DB::query_fetch_array("SELECT id, author, [name], [anons], ...");

Шаблон вывода подробного описания новости находится в файле modules/news/views/news.view.id.php. Имя автора хранится в $result['author']. Чтобы его отобразить добавим в нужное место файла код:

Пример:

if(! empty($result['author']))
{
    echo
$result['author'];
}

Возможно, понадобится вывести имя автора в блоке последних новостей. Откроем файл modules/news/news.model.php и в метод show_block() внесем следующие изменения:

Пример:

$result["rows"] = DB::query_range_fetch_all("SELECT e.id, e.author, ...");

Далее в файле modules/news/views/news.view.show_block.php в цикле вывода новостей добавим:

Пример:

if(! empty($row["author"]))
{
    echo
$row["author"];
}

Добавление полей в другие модули осуществляется аналогично.

Ваши комментарии и дополнения

Для textarea такой способ не работает, надо дописывать функцию, что то вроде такой:

public function save_variable_menutext()
{
$this->diafan->set_query("menutext='%s'");
$this->diafan->set_value($_POST["menutext"]);
}
Ян, есть тип textarea. Он дает сохранение он дает тот же результат, что и описанная Вами функция.
Действовал по этому же примеру, только вместо 'type' => 'text' было 'type' => 'textarea'..
Можно ли добавить подобным образом еще одно поле с типом "module", модуль которого уже используется. Если конкретнее, то нужно чтобы у товара было еще одно поле для загрузки изображений. Я так понимаю без создания клона модуля "images" не обойтись?
Тип module подключает определенные функции в модуле: edit() и save() в modules/модуль/admin/модуль.admin,inc.php. А уже в этих функциях можно задать логику разного контента при разных вызовах. В изображениях просто не задано разделение контента в этой функции. Оно есть, если изображениях используются как характеристика по полю param_id. Но подключение там уже логикой модуля заложено, а не стандартным type=module.
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.