Добавить использование hash в ссылке для коллекции (UI 2)

2

В shopProdList.action.php видим такое:

$collection = new shopProductsCollection('', $sorting_options);

То есть хеш из ссылки не читается от слова совсем

Однако смотрим class shopProductsCollection и видим там такое:

/**
     * Creates a new product collection.
     *
     * @param string|array $hash Product selection conditions. Examples:
     *     array(12,23,34) or 'id/12,23,34' — explicitly specified product ids
     *     'related/cross_selling/12' — cross-selling items for product with id = 12
     *     'related/upselling/23' — upselling items for product with id = 23
     *     'category/208' — search by category id
     *     'search/query=style' — search results by query 'style'
     *     'search/tag=style' — search results by tag 'style'
     *     'tag/style' — alternative form of search by tag
     *     'search/type_id=1' — search results by any field of shop_product table; e.g., type_id
     *     'search/sku_id=1,2,42' - search by specified sku_ids, use field 'skus_filtered' to get exact skus only
     *     'search/category_id=1,2,42' - search by product's primary category_ids
     *     'type/2' — search by type_id
     *     'search/name=SuperProduct' — search by 'name' field (exact match)
     *     'search/color.value_id=6' — search by value with id=6 of 'checkboxes'-type feature with code 'color'
     *     'filter/6' - search for all products matching the filter
     *     'presentation/42' - search by saved view's filter settings specified in the backend
     * @param array $options Extra options:
     *     'filters'    => whether products must be filtered according to GET request conditions
     *     'product'    => shopProduct object to select upselling items for; for upselling-type collections only
     *     'conditions' => upselling items selection conditions; for upselling-type collections only
     *     'params'     => whether extra product params must be included in collection products
     *     'absolute'   => whether absolute product image URLs must be returned for collection products
     *     'filter_by_rights' => (bool|string), filter products by rights
     *        - TRUE: leave products with right level to type >= shopRightsConfig::RIGHT_EDIT
     *        - FALSE: not check rights
     *        - int: min right level to product type (see shopRightsConfig::RIGHT_* constants). Compare will be by '>=' logic
     *        - 'delete': if right level to product type is shopRightsConfig::RIGHT_EDIT it also check contact_id of product. User can delete own products if level is shopRightsConfig::RIGHT_EDIT
     * @throws waException
     */

В ui 1.3 все эти возможности были доступны в ссылке. Можно было использовать хеш, обработать его по хуку, а потом вывести отфильтрованные товары или заказы в админке. Сейчас есть только презентации, но они не решают вопрос. Приходится в плагине наследовать shopProdList.action.php и перехватывать execute если я хочу показать какой-нибудь свой список товаров. Считаю это варварским способом.

7 комментариев

  • +1
    Михаил Ушенин Михаил Ушенин 22 апреля 2025 09:39 #

    Попробуйте использовать такой способ — возможно, он будет менее затратным с точки зрения поддержания работоспособности плагина (не нужно будет следить за обновлением кода класса, унаследованного от класса приложения):

    1. Добавить собственный фильтр товаров с помощью хука backend_prod_filters — без заранее жёстко заданных условий фильтрации (их надо будет применять динамически исходя из параметров, полученных в следующем шаге).
    2. При запросе некоторого URL, соответствующего заданной вами маршрутизации запросов к бекенду плагина (например, /products/myplugin/search%2Ftag%3Diphone/), считывать хеш из параметров этого URL и сохранять его, например, в сессию пользователя, а также применять этот фильтр к текущей презентации пользователя и перенаправлять его на корень раздела «Товары → Каталог».

    В этом случае сработает фильтр вашего плагина, который отфильтрует товары в соответствии со значением, полученным из сессии (к примеру).

  • +1
    Anton F Anton F 22 апреля 2025 10:34 #

    Можно добавить обработчик products_collection.filter и в нем задавать хэш

    function productsCollectionFilterHandler(shopProductsCollection $collection) {
       if (empty($collection->getHash())) {
            $collection->setHash(waRequest::request('hash', '', waRequest::TYPE_STRING_TRIM));
       }
    }

    • +1
      ITFrogs ITFrogs 23 апреля 2025 22:15 #

      Интересно, но мне почему-то кажется что не сработает. Хотя можно попробовать.

    • +1
      ITFrogs ITFrogs 23 апреля 2025 23:02 #

      не получится

      protected function setHash($hash)

      • +1
        ITFrogs ITFrogs 23 апреля 2025 23:22 #

        Получилось через рефлексию. Интересно, не сломаю ли я что-нибудь таким методом...

        • +1
          Anton F Anton F 24 апреля 2025 00:11 #

          не должен (: единственное что, я бы по возможности использовал другую переменную вместо hash

          • +1
            ITFrogs ITFrogs 21 августа 2025 18:37 #

            Все таки на некоторых установках с пхп 7.4 этот метод не работает. А где-то работает. Не пойму в чем разница.

            Но ui2 кажется неполноценным без возможности использовать те же ссылки с хешем, которые работали в 1.3

            Добавление новых комментариев к этой теме отключено.