Все оказалось проще. Даже не событие до и после для контроллера, а специальное событие orm.multiupdate.КОРОТКОЕ-ИМЯ-ORM-ОБЪЕКТА. Просто есть такая статья "Как правильно расширять функционал интернет-магазинов ReadyScript?" - так вот в ней приведен якобы полный список событий. По факту же он там устарел и больше не является полным, несмотря на название. Я просто не замечал ниже ссылку на обновленный, в котором конечно же уже есть необходимый хук.

Я так понимаю - пока такой возможности нет? Получается нужно непосредственно в actionMultiEdit в админ-контроллере править?

Добрый день!

Есть такой хук - orm.afterwrite

Подцепился на него для объекта товара из своего модуля чтобы добавить некоторые моменты после сохранения. Но при мультиэдите в админ-панели данный хук не отрабатывает. Это нормально, или я что-то не так делаю? Хотелось бы чтобы не только при одиночном редактировании выполнялся мой код, но и при множественном.

Добрый день! Делаю отчет по продажам для администраторов и есть задача организовать в запросе группировку по товару, при этом чтобы поля "количество" и "сумма" суммировались. Не нашел такой возможности в подсистеме ORM. Может плохо искал? Или действительно придется вручную формировать запрос?

Большое спасибо, все работает отлично!

Доброго дня!

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

https://joxi.ru/823zQg3U64JxOm.png

Как админ написал мне не подходит, так как подключение js идет не в шаблоне из модуля, а именно в layout.tpl. Тема у меня отклонированная, так что layout.tpl не перегрузится

нашел, в layout.tpl в теме подключается js. Спасибо за помощь!

Переделанная воздушная. Шаблон я и думал перегрузить изначально и подкинуть в него измененный js, но в шаблоне для данного блок-контроллера я не нашел подключения js

Добрый день!

Блок-контроллер oneclickcart берет js файл отсюда shop/view/js/jquery.oneclickcart.js

Можно ли в каталоге темы создать js c таким же названием и будет ли он в первую очередь цеплять его как в случае с шаблонами? Если да, то куда именно его положить?

Спасибо, все предельно ясно, внесу в modules.xml
Вот мои настройки.
По-умолчанию нужно выставить только некоторые поля с типами INTEGER и STRING, думаю проблем не будет.

<?php
namespace Photomanager\Config;
use RS\Orm\ConfigObject;
use RS\Orm\Type;

/**
* Класс конфигурации модуля
*/
class File extends ConfigObject
{
    /**
     * Метод инициализации свойств ORM объекта
     *
     * @return void
     */
    function _init()
    {
        //Дополняем свойства, определенные у родительского класса
        parent::_init()->append(array(
            t('Требования к обтравке'),
                'requirements_enable' => new Type\Integer(array(
                    'description' => t('Использовать требования к формату фотографий'),
                    'checkboxview' => array(1,0),
                )),
                'image_width' => new Type\Integer(array(
                    'description' => t('Ширина требуемого изображения в px:'),
                )),
                'image_height' => new Type\Integer(array(
                    'description' => t('Высота требуемого изображения в px:'),
                )),
            t('Настройки импорта'),
                'max_bundle' => new Type\Integer(array(
                    'description' => t('Максимальное количество фотографий в пакете у одного обтравщика'),
                )),
                'separator' => new Type\Varchar(array(
                    'maxLength' => '1',
                    'description' => t('Разделитель имени файла и номера при загрузке и выгрузке изображений'),
                )),
                'compare_product_field' => new Type\Varchar(array(
                    'maxLength' => '25',
                    'description' => t('Поле для поиска соответствия имени файла и товара'),
                )),
            t('Цены'),
            'standart_cost' => new Type\Decimal(array(
                'description' => t('Цена обтравки по-умолчанию. Используется, если не задана цена обтравщика'),
                'allowempty' => false,
                'maxlength' => 20,
                'decimal' => 2
            )),
        ));
    }
}

Добрый день!

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

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

Добрый день!

Хочу часть фильтров убирать под спойлер в каталоге. Количество отображаемых фильтров нужно вывести в настройки блока. Подскажите, как правильно подцепиться к инициализации блока и расширить его настройки из стороннего модуля.

Спасибо!

Добрый день!

Хочу заменить шаблон \templates\system\debug\top.tpl на свой. Возможно ли? И куда положить в своей теме?

Все, спасибо! Не правильно был назван файл с классом CatalogProduct
было: catalogproduct.php, а надо было catalogproduct.inc.php

Сделал все по инструкции. Ошибка должна выводиться на самой странице? Выводится пустая страница, а в консоли - 500 (Internal Server Error).

она ниже, вот полный код из файла handlers.inc.php:

<?php

namespace Custom\Config;
use Exchange\Model\Importers\Catalog;
use \RS\Orm\Type as OrmType;

/**
* Класс предназначен для объявления событий, которые будет прослушивать данный модуль и обработчиков этих событий.
*/
class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this
            ->bind('orm.init.shop-order')
            ->bind('initialize');
    }

    /**
     * Подключаем методы к объекту товара из стороннего модуля
     */
    public static function initialize()
    {
        \Catalog\Model\Orm\Product::attachClassBehavior(new \Custom\Model\Behavior\CatalogProduct);
    }

    /**
     * Расширяем объект заказа
     *
     * @param \Shop\Model\Orm\Order $order - объект закзаа
     */
    public static function ormInitShopOrder(\Shop\Model\Orm\Order $order)
    {
        $order->getPropertyIterator()->append(array(
            'order_post_id' => new OrmType\Varchar(array(
                'maxLength' => '50',
                'description' => t('Идентификатор отправления'),
            )),
            'delivery_cost' => new OrmType\Decimal(array(
                'maxLength' => '15',
                'decimal' => 2,
                'description' => t('Стоимость доставки'),
            )),
        ));
    }
}

Модуль был создан ранее и с расширением объекта Заказ справлялся. Проблемы начались после добавления хука ->bind('initialize') и соответствующей функции

Добрый день!
При попытке расширить поведение ORM-объекта Product возникли сложности.
Исходя из того, насколько я понял видеоурок на эту тему - мною сделано следующее:

1. В стороннем модуле Custom в классе handlers.inc.php:

    function init()
    {
        $this
            ->bind('orm.init.shop-order')
            ->bind('initialize');
    }

    /**
     * Подключаем методы к объекту товара из стороннего модуля
     */
    public static function initialize()
    {
        \Catalog\Model\Orm\Product::attachClassBehavior(new \Custom\Model\Behavior\CatalogProduct);
    }

2. В \custom\model\behavior\catalogproduct.php:

namespace Custom\Model\Behavior;
use RS\Behavior\BehaviorAbstract;

class CatalogProduct extends BehaviorAbstract
{
    /**
     * Возвращает массив товаров с с таким же базовым артикулом
     *
     */
    function getProductsLikeThis()
    {
        return "test";
    }

}

Вроде бы все по инструкции, но при очистке кэша - 500 (Internal Server Error)
До написания необходимой функции и использования ее в шаблоне - соответственно не дошел, так как уперся в данную проблему. Помогите найти ошибку.

Финальный вариант, если кого вдруг заинтересует:

$adv_config = \RS\Config\Loader::byModule("custom"); /*Проверяем настройку показа товаров без фотографий*/
        if ($adv_config['hide_nophoto_product'] == 1) {

            $q = $this->queryObj();

            if ($q->select === '*') {
                $q->select = null;
                $q->select('A.*, X.*');
            }

            $q->join(new \Photo\Model\Orm\Image, 'I.linkid = A.id', 'I');
            $q->groupby('A.id');

        }

Выяснилось, что при использовании подзапроса в секции WHERE - ломается напрочь поиск и крайне медленно выполняется запрос в случае использования фильтров на странице каталога. Сделал в итоге через JOIN и добавил условие, так как при поиске должны выбираться только поля из таблицы `A`, а таблица `X` - вообще не джойнится при поиске. Косяков не обнаружено и скорость отличная.

Все, теперь я доволен.

$adv_config = \RS\Config\Loader::byModule("custom");
        if ($adv_config['hide_nophoto_product'] == 1) {
            $qImage = new \RS\Orm\Request();
            $qImage
                ->select('linkid')
                ->from(new \Photo\Model\Orm\Image(), 'Img');
            $this->queryObj()
                ->where("A.id IN (".$qImage->toSql().")");

        }

только вот мне не нравится, что замес получился с sql синтаксисом. Хочется как-то в отдельный запрос вывести то, что в скобках, но не пойму, как.

Не, так не пойдет. Тогда приджойненные цены не выведутся. Но я нашел способ. Вместо join использовал where с подзапросом и условием, что id товара находится в результатах этого запроса.

$this->queryObj()
                ->where("A.id IN (SELECT `linkid` FROM `readyscriptyoung`.`rs_images`)");

Александр, спасибо. Заработало. Вот текст запроса. Новая проблема - после JOIN в поле id товара передается теперь id изображения. Соответственно, в каталоге начинается вакханалия, ибо везде в переменной $product.id теперь id картинки. Как-то можно исключить из секции SELECT поле Img.id?

SELECT * FROM `readyscriptyoung`.`rs_product` as A 
INNER JOIN `readyscriptyoung`.`rs_product_x_dir` as X ON A.id = X.product_id 
INNER JOIN `readyscriptyoung`.`rs_images` as Img ON A.id = Img.linkid 
WHERE (`A`.`site_id` = '1') AND `X`.`dir_id` IN ('675','676','677','678','679','680','681','682','683','684','685','686','687','688','689','690','691','692','834','835','837','845','846','847','848','849','850','851','852','853','854','855','907','674','694','695','696','698','699','700','701','702','703','838','856','857','858','875','876','900','901','902','904','905','906','693','673','672') AND `A`.`public` = '1' AND `A`.`num` > '0' 
ORDER BY dateof DESC