Тема: Как добавить поле товару или любому другому объекту в ReadyScript?
Как добавить поле товару или любому другому объекту ORM(таблица в базе) в ReadyScript?
Иногда народ интересуется как быстро добавить поле к товару. Например нужна какая-либо дополнительная галочка, или ещё текстовое поле, или картинка для загрузки. В нашей системе всё просто.
Если у Вас есть модуль дополнительный свой можно сделать в нём дополнительные действия, но я буду рассматривать ситуацию когда дополнительного модуля у вас нет и Вы первый раз программируете для RS.
Всё просто.
Рассмотрим ситуацию, когда нам нужно добавить галочку в карточку товара.
Создаём свою папочку в modules с именем Вашего модуля на латинском языке. Например - custom.
Обратите внимание, что в Вашем классе namespace должен соответствовать имени папки в которой лежит. В нашем случае это custom.
Создаём внутри custom папку config. И добавляем в config файл file.inc.php .
Этот файл отвечает за конфигурацию Вашего модуля.
Вставляем туда следующее содержимое:
<?php
namespace Custom\Config;
use \RS\Orm\Type;
/**
* Конфигурационный файл модуля
*/
class File extends \RS\Orm\ConfigObject
{
}
И сохраняем его.
Теперь создаём файл со сведениями о модуле, которые отвечаю за имя и описание модуля. А именно файл с именем module.xml в той же папке. Вот его содержимое
<?xml version="1.0" encoding="utf-8"?>
<config>
<defaultValues>
<name multilanguage="true">Имя Вашего дополнительного модуля</name>
<description multilanguage="true">Модуль с дополнительным функционалом</description>
<version>1.0.0.0</version>
<author>ВАШЕ авторские имя</author>
</defaultValues>
</config>
Далее в этой же папке config создаём другой файл с именем handlers.inc.php
Этот файл отвечает за добавление полей, навешивания на события, прописывания роутов и др. Подробнее листайте документацию для разработчиков.
Следующий шаг, это то что нам нужно в этом файле указать хук который будет перехвачен при инициализации объекта товара(строка записи из таблицы переводится в ORM объект).
Расширение объекта ORM(таблицы) товара производится через хуки.
Идём на страницу с описанием хуков системы. Читаем и спускаемся ниже к таблице где перечислены Все хуки системы.
В нашем случаем нам нужен хук:
orm.init.КОРОТКОЕ_ИМЯ_ORM_ОБЪЕКТА
где КОРОТКОЕ_ИМЯ_ORM_ОБЪЕКТА будет равно catalog-product
Т.к. файл с ORM объектом у нас находится в
/modules/catalog/model/orm/product.inc.php
то короткое имя у нас будет:
catalog-product (название папки модуля на латинице-имя файла ORM объекта)
Полное же имя хука будет orm.init.catalog-product
Почему так? Поймёте из документации по хукам!
В файл handlers вставляем следующее содержимое, для добавления поля с именем is_root в таблицу БД:
<?php
namespace Custom\Config;
use \RS\Orm\Type as OrmType;
class Handlers extends \RS\Event\HandlerAbstract
{
/**
* Функция инициализирует регистрацию действий
*/
function init()
{
$this->bind('orm.init.catalog-product'); //Сообщаем что у нас появился хук расширяющий товар
}
/**
* Расширяем объект товара
* Обратите внимание на название хука и этой функции . и - не используются
*
* @param array $list
*/
public static function ormInitCatalogProduct(\Catalog\Model\Orm\Product $orm_product)
{
//Расширяем поля
$orm_product->getPropertyIterator()->append(array(
t('Основные'), //Вкладка на которую будет добавлено поле, поля в массиве ниже будут приписаны к этой вкладке в конец
'is_root' => new OrmType\Integer(array( //Название поля в таблице БД и его тип
'description' => 'Корневой элемент?', //Подпись к полю
'maxLength' => 1, //Длинна поля
'default' => 0, //Значение по умолчанию
'CheckBoxView' => array(1,0) //Отвечает за отображение в качестве флага(галочки)
))
));
}
}
Посмотреть какие ещё поля бывают и какие у них свойства можно загляну в любой другой ORM объект. Или посмотреть типы ORM объектов в папке:
/core/rs/orm/type
В массиве все методы у этих обхектов начинающиеся с setИмяМетода можно указать в массиве как 'ИмяМетода'
Например:
Почти у всех есть метод
setDescription, а в массиве параметров это будет просто
'description' => 'Корневой элемент?'
Т.е. приставка set убирается.
Доступные методы можно подсветить для себя в не олдскульном редакторе через конструкцию такого типа
new OrmType\Integer::set(ctrl+пробел) и Вам выпадет список из доступных параметров для типа Integer поля.
Собственно всё!
Теперь у нас появилось поле is_root у товара.
Осталось добавить это поле в таблицу. Можно это сделать через базу, но не нужно:)
Достаточно лишь в адмике зайти в Управление ->Настройки системы и нажать Исправить структуру БД(справа).
Всё, поле добавлено. Можно пользоваться.
В шаблонах это поле будет доступно например так:
Поле корневой элемент? - {$product.is_root}
Рассмотрим ещё варианты:
Строка
'is_root' => new OrmType\String(array(
'description' => t('Строка'),
)),
Текст
'is_root' => new OrmType\Text(array(
'description' => t('Текст'),
)),
Текст с редактором
'is_root' => new OrmType\RichText(array(
'description' => t('Текст с редактором'),
'maxLength' => 1000
)),
Число
'is_root' => new OrmType\Integer(array(
'description' => t('Число'),
'maxLength' => 11
)),
Картинка
'is_root' => new OrmType\Image(array(
'maxLength' => '255',
'max_file_size' => 10000000,
'allow_file_types' => array('image/pjpeg', 'image/jpeg', 'image/png', 'image/gif'),
'description' => 'Картинка',
)),
Файл
'is_root' => new OrmType\File(array(
'description' => t('Файл'),
)),
Выпадающий список
Тут всё несколько сложнее. Нужно понять, что список можно получить 2-мя способами.
1. Из Апи системы. Т.е. вызывается метод, который получает массив значений . Ключи массива будут как значения, значения будут как значения.
Поумолчанию в системе все апи являются наследниками
\RS\Module\AbstractModel\TreeList или
\RS\Module\AbstractModel\EntityList
Автоматически в этих апи есть метод staticSelectList, который получает все нужные нам значения.
//Например, получение регионов доставки
'is_root' => new OrmType\Integer(array(
'description' => t('Регион'),
'list' => array(array('\Shop\Model\RegionApi','staticSelectList'))
)),
2. значения из прямо заданного списка:
//Например, получение регионов доставки
'is_root' => new OrmType\String(array(
'description' => t('Регион'),
'listFromArray' => array(
0 => 'Вариант 1',
'var2' => 'Вариант 2',
'var3' => 'Вариант 3',
//и т.д.
)
)),
Пробуйте!