1 Отредактировано Александр (22.06.2015 11:46:23)

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

)),

Пробуйте!

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Добрый день, после включения модуля во вкладке "Модули" или же после обновления БД все слетает. Админка вообще не работает, а сайт выглядит следующим образом: http://screenshot.ru/upload/images/2015/03/09/13b3915.jpg
Все делал согласно инструкции, даже пробовал полностью все копировать без изменений.
Может ли быть проблема связана с тем, что нет файла установки "install.inc" ? Просто уже не знаю в какую сторону копать. Заранее спасибо.

Повысить оценку Понизить оценку

3

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Надо увидеть точный текст ошибки, чтобы сказать в чем причина ошибки.  ( по скриншоту единственное что видно - это то что стили не подгрузились )
Включите display_errors в настройках PHP, можно с помощью .htaccess.  ( http://readyscript.ru/faq/#faq-errors )
И посмотрите на исходный код страницы в браузере. В конце страницы наверняка будет надпись Fatal error..........

Повысить оценку Понизить оценку

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Включил отображение ошибок, вывело:
Fatal error: Class 'Custom\Config\OrmType\Integer' not found in Z:\home\test1.ru\www\modules\custom\config\handlers.inc.php on line 25
Поменял строку:
'is_root' => new OrmType\Integer(array
на:
'is_root' => new \RS\Orm\Type\Integer(array

Переустановил модуль и все получилось, спасибо большое за помощь.

Повысить оценку Понизить оценку

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Прошу прощения! Всё верно.

Я подправил первый пост. Сейчас правильно.
Отсутствовала запись:

use \RS\Orm\Type as OrmType;

После указания namespace

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Сделал видеоурок на эту тему:
https://www.youtube.com/watch?v=KoF2IyGPj9U

7

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Спасибо за урок все получилось, но остался один вапросик. Скажи как при редактировании разместить новое поле между "краткое поисание" и "описание"? Потому что сейчас оно появилось в самом конце.

Повысить оценку Понизить оценку

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Никак можно либо в конец. Либо в отдельную вкладку.

9

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Очень жаль, было бы очень полезно менять порядок полей в форме

Повысить оценку Понизить оценку

10

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

'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' => 'Картинка',
)),

Может вместо image/pjpeg -> image/jpg ?

Повысить оценку Понизить оценку

11

Re: Как добавить поле товару или любому другому объекту в ReadyScript?

Стандартно, при загрузке jpg файлов приходит mime тип - image/jpeg
https://stackoverflow.com/questions/336 … image-jpeg

Повысить оценку Понизить оценку