Где формируется $wa->shop->productSet ? Есть решение

Не могу найти место где формируется $wa->shop->productSet. Мне надо, что бы туда попадали все картинки товара (точнее еще одна). Изначально там только id основной.

Собственно хотел на главной сделать при hover на картинку, смену изображения на второе. Решил написать helper, который будет выводить:

<img src="урл картинки" data-image="url второй картинки" >

Но столкнулся с гемороем, что в $wa->shop->productSet id только одной картинки. Делать лишние запросы в базу не хочется. Хотелось бы расширить выборку, которая попадает в productSet, так как она потом кешируется.

2 ответа

  • 1
    Алексей Webasyst 21 апреля 2016 11:56 # Решение

    /wa-apps/shop/lib/classes/shopViewHelper.class.php

  • 1
    wokster 21 апреля 2016 12:13 #

    Это понятно. Вопрос был, где там формирование массива. Но уже сделал. Не уверен, что это допустимо, так что, уважаемые профи, скажите насколько правильным методом будет добавления следующего в shopViewHelper.class.php

        public function productSetWithImg($set_id, $offset = null, $limit = null, $options = array())
        {
            if (!$offset && !$limit && !$options && ($cache = $this->wa->getCache())) {
                $route = $this->getRoute();
                $cache_key = 'set_'.$set_id.'_'.str_replace('/', '_', waRouting::clearUrl($route['domain'].'/'.$route['url']));
                $products = $cache->get($cache_key, 'sets');
                if ($products !== null) {
                    return $products;
                }
            }
            $products = $this->products('set/'.$set_id, $offset, $limit, $options);
            foreach ($products as $key=>$one)
            {
                $products[$key]['images'] = [];
                $model = new shopProductImagesModel();
                foreach($model->select('id','product_id','sort')
                            ->where('product_id = '.(int)$one['id'])
                            ->order('sort ASC')
                            ->fetchAll() as $img){
                    $products[$key]['images'][] = $img['id'];
                }
            }
            if (!empty($cache)) {
                $cache->set($cache_key, $products, 1200, 'sets');
            }
            return $products;
        }
    • +2
      Алексей Алексей Webasyst 21 апреля 2016 12:52 #

      Не надо так. Это примерно 30+ лишних запросов к базе. Блок foreach убрать.

      Получить изображения можно если передать параметр в getProducts.

      $collection = new shopProductsCollection("set/bestsellers");
      $collection->getProducts("*,images");

      • +1
        wokster wokster 21 апреля 2016 12:59 #

        Спасибо

      • +1
        wokster wokster 21 апреля 2016 13:06 #

        Остается только вопрос что будет после обновления. Я так понимаю, все перезапишется. Стоит вынести все это в пользовательский helper? Можно ли его унаследовать от shopViewHelper.class.php или есть другой способ дергать его методы?

        • +1
          Алексей Алексей Webasyst 21 апреля 2016 14:03 #

          Вынести в пользовательский хелпер и дергать его.

          • +1
            wokster wokster 21 апреля 2016 15:23 #

            Вынес, но кеш не работает:


            class shopCustom
            {
              public static function getProductList($set_id, $offset = null, $limit = null, $options = array())
              {
                if ($cache = wa('shop')->getCache('default')){
                  $products = $cache->get('ProductList_'.$set_id, 'sets');
                  if ($products !== null) {
                    return $products;
                  }
                }
                $collection = new shopProductsCollection('set/'.$set_id, null);
                $products = $collection->getProducts('*,images', 0, null, true);
                if (!empty($cache)) {
                  $cache->set('ProductList_'.$set_id, $products, 1200, 'sets');
                }
                return $products;
              }
            }

Добавить ответ

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