Вход • Регистрация

Вывод количества товара в главной категории которая имеет подкатегории

  • 10 декабря 2014 г. , редакция: 10 декабря 2014 г.
  • Здравствуйте.
    В файле shop.view.sort_block.php вывожу количество товарв в категории (которая не имеет подкатегорий) в каждой странице пагинации:
    Код
    $count = DB::query_result("SELECT COUNT(id) FROM {shop} WHERE cat_id=%d", $this->diafan->_route->cat);

    Но такой запрос не считает количество товаров в категории которая имеет подкатегории.

    ТП дали ответ:
    Цитата
    Потому что поле cat_id у товара имеет значение непосредственно родительской категории, т.е. той, к которой он принадлежит. Список же всех родителей товара хрнаиться в таблице shop_category_rel.

    Я пробовал такие вариации:
    Код
    $counts = DB::query_result("SELECT COUNT(element_id) FROM {shop_category_rel} WHERE cat_id=%d", $this->diafan->_route->cat);

    Код
    $counts = DB::query_result("SELECT COUNT(id) FROM {shop_category_rel} WHERE cat_id=%d", $this->diafan->_route->cat);

    Они не считают. Помогите пожалуйста.
    • 10 декабря 2014 г.
    • Используйте в качестве основы get_count_in_cat() из файла shop.model.php или непосредственно ее, если делаете манипуляции в файле модели.
  • 10 декабря 2014 г.
  • А таким методом как я делаю нельзя? Мне нужно учитывать страницы пагинации. С моим способом это отлично получается.
    • 10 декабря 2014 г.
    • В методе get_count_in_cat() содержиться готовый запрос - используйте его.
      • 10 декабря 2014 г. , редакция: 10 декабря 2014 г.
      • Я не очень разбираюсь в методах Диафана.... Мне сложно разобрать этот запрос. Не могли бы вы помочь?
        Код
        private function get_count_in_cat($cat_ids, $time)
        {
        return DB::query_result(
        "SELECT COUNT(DISTINCT e.id) FROM {shop} AS e"
        . " INNER JOIN {shop_category_rel} AS r ON e.id=r.element_id"
        . ($this->diafan->_users->role_id ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='shop' AND a.element_type='element'" : "")
        . " WHERE r.cat_id IN (%s) AND e.[act]='1' AND e.trash='0'"
        ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
        . " AND (e.access='0'"
        . ($this->diafan->_users->role_id ? " OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id : '')
        . ")",
        implode(',', $cat_ids), $time, $time);
        }

        То есть я делаю:
        Код
        $counts = DB::query_result(
        "SELECT COUNT(DISTINCT e.id) FROM {shop} AS e"
        . " INNER JOIN {shop_category_rel} AS r ON e.id=r.element_id"
        . ($this->diafan->_users->role_id ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='shop' AND a.element_type='element'" : "")
        . " WHERE r.cat_id IN (%s) AND e.[act]='1' AND e.trash='0'"
        ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
        . " AND (e.access='0'"
        . ($this->diafan->_users->role_id ? " OR e.access='1' AND a.role_id=".$this->diafan->_users->role_id : '')
        . ")",
        implode(',', $cat_ids), $time, $time);

        Но оно ничего не выводит....
        • 10 декабря 2014 г.
        • Попробуйте так:
          $cat_ids = здесь используйте метод get_children, он в документации есть, для получения потомков текущей категории.
          Далее
          Код
          $counts = DB::query_result(
          "SELECT COUNT(DISTINCT e.id) FROM {shop} AS e"
          . " INNER JOIN {shop_category_rel} AS r ON e.id=r.element_id"
          . " WHERE r.cat_id IN (%s) AND e.[act]='1' AND e.trash='0'", implode(',', $cat_ids))

          Только мог запятые пропустить или знаки какие-то в запросе, не проверял.
          • 10 декабря 2014 г. , редакция: 10 декабря 2014 г.
          • Все это я делаю в файле shop.view.sort_block.php
            Я экспериментирую для категории id=37. У нее есть товары. Так же подкатегории. В подкатегориях все отлично подсчитывается тем моим способом.
            В этом файле я пишу:

            Код
            $cat_ids = '37';
            $counts = DB::query_result("SELECT COUNT(DISTINCT e.id) FROM {shop} AS e"." INNER JOIN {shop_category_rel} AS r ON e.id=r.element_id"." WHERE r.cat_id IN (%s) AND e.[act]='1' AND e.trash='0'", implode(',', $cat_ids));
            echo $counts;


            Но ничего не подсчитывается.
            Код
            $cat_ids = $this->diafan->get_children($this->diafan->_site->id, 'site');
            • 10 декабря 2014 г.
            • $cat_ids нужно получать так:
              Код
              $cat_ids = $this->diafan->get_children($this->diafan->_route->cat, "shop_category");
              $cat_ids[] = $this->diafan->_route->cat; // здесь включаем текущую категорию в массив


              В запросе для отладки пишите DEV перед SELECT, чтобы вывести его на сайте и пробуйте выполнить в phpMyAdmin или аналоге, чтобы понять в чем проблема



              • 10 декабря 2014 г. , редакция: 10 декабря 2014 г.
              • Спасибо! Я вам очень благодарен! Я не правильно выводил $cat_ids. Еще раз спасибо что не бросили.
  • 10 декабря 2014 г.
  • Я извеняюсь..тут проблема схожа с этой. Вывожу диапазон цен в фильтре.
    Код
    $max_price = 0;
    $min_price = 0;
    $r = DB::query("SELECT MAX( sp.price ) as maxprice, MIN( sp.price ) as minprice FROM {shop_price} sp"
    . " Inner join {shop} s"
    . " on s.id=sp.good_id"
    . " WHERE sp.trash = '0' AND s.trash='0'"
    . " and s.cat_id=%d", $this->diafan->_route->cat);
    $row = DB::fetch_array($r);
    $max_price = $row['maxprice'];
    $min_price = $row['minprice'];

    Все выводится нормально в категории которая не имеет подкатегорий))
    Судя по всему тут тоже нужно менять запрос... Не подскажете?
    • 10 декабря 2014 г.
    • Думаю так: получаете по аналогии $cat_ids, а далее в запросе вместо
      Код
      s.cat_id=%d", $this->diafan->_route->cat)

      пишете
      Код
      cat_id IN (%s)", implode(',', $cat_ids))
      • 11 декабря 2014 г.
      • Да, все верно! Спасибо!

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум