Невозможность использовать кастомные коллекций в хуке frontend_products Принято

3

Если напрямую вызывать в хуке frontend_products создание коллекции:

$collection = new shopProductsCollection('myrule/' . $rule['id']);

то на шаге 

$collection->getProducts();

Получим безконечную рекурсию, так как есть код:

if ($this->is_frontend && empty($this->options['no_plugins']) && empty($this->options['no_plugins_frontend_products'])) {    
    wa('shop')->event('frontend_products', ref(array(        'products' => &$products,    ))); 
}

Ну ладно есть вроде как магический недокументированный параметр no_plugins добавляем его в вызов:

$collection = new shopProductsCollection('myrule/' . $rule['id'], array('no_plugins' => 1));

И ... шах и мат, получаем exception:

Unknown collection hash type: myrule 

Потому что в getProducts вызывается prepare в котором есть такой момент:

            $method = strtolower($type).'Prepare';
            if (method_exists($this, $method)) {
                $this->$method(isset($this->hash[1]) ? $this->hash[1] : '', $auto_title);
            } else {
                if (empty($this->options['no_plugins']) && empty($this->options['no_plugins_products_collection'])) {
                    /**
                     * @event products_collection
                     * @param array [string]mixed $params
                     * @param array [string]shopProductsCollection $params['collection']
                     * @param array [string]boolean $params['auto_title']
                     * @param array [string]boolean $params['add']
                     * @return bool null if ignored, true when something changed in the collection
                     */
                    $this->prepared = true;
                    $processed = wa('shop')->event('products_collection', ref(array(
                        'collection' => $this,
                        'auto_title' => $auto_title,
                        'add'        => $add,
                    )));
                }
                if (empty($processed)) {
                    throw new waException('Unknown collection hash type: '.htmlspecialchars($type));
                }
            }

так как $processed определяется в условии, а условие на нем вне блока if - логично предположить что данный блок должен быть внутри условия, иначе всегда! вызывается exception

 Просим исправить, ну или может есть какой другой способ вызвать свою коллекцию из данного хука


1 комментарий

  • +1
    Леонид Вакуленко Леонид Вакуленко Webasyst 11 октября 2019 17:18 #

    В данном случае поможет вызов коллекции с параметром `'no_plugins_frontend_products' => 1,` но вообще говоря это заведомо плохая идея - использовать коллекцию в хуке, который вызывается в коллекции. Не надо так.

    Ещё один вариант. Блокировать рекурсию в коде вашего же обработчика. Если обработчик видит, что запущен второй раз рекурсивно, он больше не вызывает коллекцию.

    Добавить комментарий

    Чтобы добавить комментарий, зарегистрируйтесь или войдите