1 Отредактировано AleksC1976 (15.12.2014 14:06:15)

Тема: Как правильно добавить дополнительное поле в таблицу product_offer

Необходимо добавить дополнительное поле в БД в таблицу product_offer.
С товарами вроде все понятно, через ORM объекты, а как быть с товарными предложениями? Нужно добавить дополнительное поле в таблицу с товарными предложениями.

С подменой классов конечно все легко и просто - "2 минуты делов", а вот с собственными модулями как то не очень. Непонятно, на какое событие можно повесить добавление поля к товарному предложению.

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

2

Re: Как правильно добавить дополнительное поле в таблицу product_offer

Торговое предложение - это обычный ORM объект класса \Catalog\Model\Orm\Offer.
В нашей статье подробно расписано, как расширять ORM объект из дополнительного модуля. (см. обработку события orm.init.КОРОТКОЕ_ИМЯ_ORM_ОБЪЕКТА)
http://readyscript.ru/text-blog/Kak-pra … adyScript/

Следует учитывать, что Торговое предложение имеет не автоматически генерируемую форму отображения в админ. панели. Т.е. если необходимо выводить данное поле визуально в админ. панели, то необходимо будет править шаблон \modules\catalog\view\form\product\offers.tpl

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

3

Re: Как правильно добавить дополнительное поле в таблицу product_offer

Пользуясь случаем, хочу сказать, когда люди пишут на форум - это обычно означает, что они ознакомились с руководством на вашем сайте и что то пошло не так. Ну да ладно - это все лирическое отступление. По существу имею сказать следующее

вот такой файл handlers.inc.php упорно не добавляет нужное поле в таблицу product_offer

<?php
namespace Custom\Config;
 
class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this->bind('orm.init.catalog-offer');
    }
    public static function ormInitCatalogProduct(\Catalog\Model\Orm\Offer $orm_offer)
    {
        $orm_offer->getPropertyIterator()->append(array( //Добавляем свойства к объекту
               
            'offertype' => new \RS\Orm\Type\Integer(array( //Тип поля. Задает тип в базе INT
            'maxLength' => 1, // Длина поля в базе будет INT(1)
            'description' => 'Признак заказной позиции', //Название поля

            ))
        ));
    }
}

а  вот такой файл handlers.inc.php  добавляет нужное поле в таблицу product

<?php
namespace Custom\Config;
 
class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this->bind(orm.init.catalog-product');
    }

    public static function ormInitCatalogProduct(\Catalog\Model\Orm\product $orm_offer)
    {
        $orm_offer->getPropertyIterator()->append(array( //Добавляем свойства к объекту
               
            'offertype' => new \RS\Orm\Type\Integer(array( //Тип поля. Задает тип в базе INT
            'maxLength' => 1, // Длина поля в базе будет INT(1)
            'description' => 'Признак заказной позиции', //Название поля

            ))
        ));
    }
}

Отличия в этих файлах всего 2

1) $this->bind('orm.init.catalog-product') / $this->bind('orm.init.catalog-offer')
2)  public static function ormInitCatalogProduct(\Catalog\Model\Orm\product $orm_offer) / public static function ormInitCatalogProduct(\Catalog\Model\Orm\Offer $orm_offer)

Из чего я делаю вывод, что то не в порядке с именованием ORM видимо с моей стороны, именовал ORM в соответствии с руководством и вашим сообщением http://forum.readyscript.ru/post/806/#p806, я все эти операции уже проделал перед тем как написать на форум. Отчаялся заставить работать функцию из трех строчки  и сделал с подменой классов, но после обновленя магазина все перестало работать - начались ошибки. при изменении структуры БД, о чем я уже писал в соседней ветке.

Получается что я не могу никак добавить поле в БД, только в PHPMyAdmin - что не есть хорошо. Хотелосб бы использовать модульность системы. Может я не вижу какую то запятую конечно ?  ПОдскажите пожалуйста. Спасибо.

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

4

Re: Как правильно добавить дополнительное поле в таблицу product_offer

Ошибка в следующем:

Вы подвешиваетесь на событие orm.init.catalog-offer. 2,3 аргумент у bind - не задан, соответственно это означает, что система будет искать в данном классе функцию для обработки события с названием события, за вычетом точек и минусов.

т.е. Вам необходимо назвать функцию вместо ormInitCatalogProduct так:

public static function ormInitCatalogOffer(\Catalog\Model\Orm\Offer $offer)

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

5

Re: Как правильно добавить дополнительное поле в таблицу product_offer

я правильно понял, что на события для их обработаки навешивается функция которая именуется ВСЕГДА так

orm.init.catalog-offer = function OrmInitCatalogOffer

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

6

Re: Как правильно добавить дополнительное поле в таблицу product_offer

Да, если в аргументе 2,3 метода bind - не задан callback на другой обработчик.

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