Тема: Как добавить поле товару или любому другому объекту в 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',
            //и т.д.
       )
)),Пробуйте!


