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

Вывод количества комментариев у товара выводим через шаблонный тег show_block

  • 08 октября 2013 г.
  • Нужно получить кол-во комментариев у товара.
    Товары выводятся через шаблонный тег на главную.
    Те у которых есть галочка Хит, Новинка, Акции

    В ТП написали что делается так:
    Количество комментариев можно запросить так: $row["comments"] = DB::query_result("SELECT COUNT(*) FROM {comments} WHERE module_name='shop' AND element_id=%d AND trash='0'", $row["id"]);

    Подскажите пожалуйста, как теперь это реализовать.

    Пробовал, не получается, перелопатил весь shop.model.php
    • 08 октября 2013 г.
    • Денис, Вы определитесь сначала, где именно нужно вывести это количество. В карточке товара, в списке товаров, в блоке?
      Соответственно, этот запрос надо совать в ту функцию, list, id или show_block, там же, где получаются название товара, описание и пр. И присваиваются в $row[], для передачи во view. Вот там же прилепляете $row["comments"]
      Затем выводите в view
      • 08 октября 2013 г.
      • Выводить нужно везде.
        1. В блоке
        2. В списке товаров
        3. В карточке товара
        4. В похожих товарах
  • 08 октября 2013 г.
  • Поэтому я и написал, что не понял что как делать.

    Если бы Вы подсказали как делать для "Блок" (show_block)

    Уже бы по аналогии разбирались.

    Большое спасибо всем кто отреагирует на просьбу
  • 10 октября 2013 г.
  • Нашел функцию public function show_block

    Взял код:
    $row["comments"] = DB::query_result("SELECT COUNT(*) FROM {comments} WHERE module_name='shop' AND element_id=%d AND trash='0'", $row["id"]);

    Начал искать место где получается название, описание итд.
    Похоже я не понял что нужно сделать, так как не получилось ничего
    • 11 октября 2013 г.
    • 1. Включаете режим разработчика и отключаете кеширование.
      2. В модельке берете функцию, например, id() для карточки.
      3. Разбираете структуру функции, видите там запрос в БД, формирование массива result для передачи во вьюху. И вот рядом с формированием названия, текста товара и пр., и перед передачей result суете этот код.
      • 11 октября 2013 г.
      • Код
        foreach ($rands as $rand)
        {
        $row["comments"] = DB::query_result("SELECT COUNT(*) FROM {comments} WHERE module_name='shop' AND element_id=%d AND trash='0'", $row["id"]);
        $result = DB::query("SELECT e.id, e.[name], e.[anons], e.cat_id, e.comments, e.timeedit, e.site_id, e.no_buy, e.article,
        e.hit, e.new, e.action, e.is_file".($sort == "sale" ? ", COUNT(g.id) AS count_sale" : "")."
        FROM {shop} AS e"
        . ($sort == "sale" ? " INNER JOIN {shop_order_goods} AS g ON g.good_id=e.id AND g.trash='0'" : '')
        . ($sort == "price" ? " INNER JOIN {shop_price} AS pr ON pr.good_id=e.id AND pr.trash='0'"
        ." AND pr.date_start<=".time()." AND (pr.date_start=0 OR pr.date_finish>=".time().")"
        ." AND pr.currency_id=0"
        ." AND pr.role_id".($this->diafan->_user->role_id ? " IN (0,".$this->diafan->_user->role_id.")" : "=0")
        ." AND (pr.person='0'".($this->person_discount_ids ? " OR pr.discount_id IN(".implode(",", $this->person_discount_ids).")" : "").")"
        : '')
        .$inner
        . ($this->diafan->_user->role_id ? " LEFT JOIN {access} AS a ON a.element_id=e.id AND a.module_name='shop'" : "")
        . " WHERE e.[act]='1' AND e.trash='0'"
        .($this->diafan->module == 'shop' && $this->diafan->show ? " AND e.id<>".$this->diafan->show : '')
        . ($hits_only ? " AND e.hit='1' " : "")
        . ($action_only ? " AND e.action='1' " : "")
        . ($new_only ? " AND e.new='1' " : "")
        . $where
        ." AND e.date_start<=%d AND (e.date_finish=0 OR e.date_finish>=%d)"
        . " AND (e.access='0'"
        . ($this->diafan->_user->role_id ? " OR e.access='1' AND a.role_id=".$this->diafan->_user->role_id : '')
        . ")"
        . " GROUP BY e.id"
        . $order
        . ' LIMIT '
        . ($sort == "rand" ? $rand : 0).', '
        . ($sort == "rand" ? 1 : $count), $values);
        $rows = $this->get_elements($result, 'block', array("count" => $images, "variation" => $images_variation));
        $this->result["rows"] = array_merge($this->result["rows"], $rows);
        }


        Сделал так, но не работает.
        • 11 октября 2013 г.
        • Это не id(), это похоже на show_block()
          • 11 октября 2013 г.
          • Это во-первых. Во-вторых, когда Вы получите переменную в модельке, ее затем надо вывести во вьюхе. Не просто же код сунули в модельку и все
  • 13 октября 2013 г.
  • Да это show_block()
    Я только не понял код верный?
    Во вьюху вставляю так
    $row ["comments"];
    • 14 октября 2013 г.
    • Денис, какая версия у Вас?
      • 14 октября 2013 г.
      • 5.3
        • 15 октября 2013 г. , редакция: 15 октября 2013 г.
        • Ох, Денис, Денис.
          Вы говорите, что выводите товары на главную, значит через show_block.
          Следите за мыслью:
          1. В параметрах сайта отрубаем кеширование и включаем режим разработки.
          2. Идем в /modules/shop/shop.model.php и находим там public function show_block. Видим, что функция собирает параметры в сборный запрос, формирует большой сложный SELECT и затем вызывает
          Код
          $rows = $this->get_elements(...);

          Понимаем, что массив $rows с товарами формирует функция get_elements, которая находится здесь же, в этом файле.
          3. Находим ниже функцию public function get_elements, видим, что значения товаров для списка набиваются в массив $row, где как раз и сидят имена товаров, картинки, всякие прочие параметры и все это в цикле. В конце цикла формируется массив $rows, который каждым своим значением имеет массив отдельного товара. Ну не суть. В общем, это строка
          Код
          $rows[$i] = $row;
          То есть, поля каждого отдельного товара заполнились и засунулись в массив $rows.
          А в самом конце функции массив $rows возвращается.
          Код
          return $rows;

          Так вот! Перед тем, как переменные массива $row (а это отдельные поля отдельного товара) добавляются в массив $rows, нам надо добавить туда еще одну переменную $row, в которой будет сидеть количество комментариев к этому отдельному товару! Понимаете?
          То есть, перед
          Код
          $rows[$i] = $row;

          Добавляем наш код!
          Код
          $row["comments"] = DB::query_result("SELECT COUNT(*) FROM {comments} WHERE module_name='shop' AND element_id=%d AND trash='0'", $row["id"]);
          $rows[$i] = $row;

          Все! Переменная в количеством комментариев сидит у нас в модельке у каждого товара в массиве row с ключем comments.
          4. На всякий случай убеждаемся, что не только show_block, но и show_block_rel и прочие функции также используют get_elements для получения списка товаров, так что comment теперь будет сидеть у нас везде!
          5. Осталась мелочь! Идем в /modules/shop/views/shop.view.show_block.php и выводим количество комментариев где нам надо. Например, так:
          Код
          //название и ссылка товара
          echo '<div class="shop_name"><a href="' . BASE_PATH_HREF . $row["link"] . '">' . $row["name"] . '</a> (комментариев: '.$row["comments"].')</div>';

          6. В каждой остальной вьюхе так же.
          • 15 октября 2013 г.
          • Разобрался, большое спасибо
            • 16 октября 2013 г. , редакция: 16 октября 2013 г.
            • Надо такие вещи в отдельный раздел собирать, чтобы потом легче искать и просвещаться :)
              Для меня, лично, модельки - темный лес.
              • 16 октября 2013 г.
              • Согласен, а то приходиться самому у себя держать раздел, типа "Примеры"
  • 13 октября 2013 г.
  • Вот что получается, если делать как я выше написал.
    Что там не так..
    http://uloader.ru/YWQeSU
    http://uloader.ru/kSIYih
  • 16 октября 2013 г.
  • Когда добавляю это все для того что бы вывести кол-во комментариев в карточке товара - не работает.
  • 18 октября 2013 г.
  • Делаю получаю ошибку http://uloader.ru/AAaNzs
    http://uloader.ru/FEXwar

    • 18 октября 2013 г.
    • A модели shop.model.php в функции function id() не определена или неверно определена переменная, в которой вся нужная информация. Сделай в начале shop.view.id.php команду print_r($result) и посмотри какой массив с какими переменными приходит на страничку товара, есть ли там нужная переменная, и в каком она месте. Если есть - смотри как выводишь, если нет
      копайся в модели
      • 20 октября 2013 г.
      • Переменной не вижу, в модельке копаюсь 3 дня.
        Толку нет.
        Помогите пожалуйста разобраться.
        В php навыки минимальные.

        Большое спасибо
        • 20 октября 2013 г.
        • Денис оставьте в личке координаты лучше всего skype,постараюсь помочь

        • 21 октября 2013 г.
        • Откуда ж переменная во вьюхе возьмется, если ее в модельке не завести?
  • 21 октября 2013 г.
  • Выражаю огромное спасибо за помощь Сергей (ZergeZ)

    Вывели так файл shop.model.php строка 1022

    $this->result["comments_cnt"] = DB::query_result("SELECT COUNT(id) FROM {comments} WHERE module_name='shop' AND element_id=%d AND trash='0'", $row["id"]);

    В файле shop.view.id.php выводим так $result["comments_cnt"] в нужном месте

    Просьба к diafan выведите этот пример в документации, практические примеры.

    Всем огромное спасибо за помощь!!!
    • 21 октября 2013 г.
    • Цитата
      строка 1022
      Строка тут не особо важна.
      Принцип тот же, что я описывал.
      Идем в /modules/shop/shop.model.php ищем там функцию id()
      И там где-нибудь среди прочих формируемых переменных $this->result[] прибавляем свою любую, названную как угодно, например $this->result["comments_cnt"].
      Затем ловим ее во вьюхе /modules/shop/shop.id.php как $result["comments_cnt"]
  • 22 октября 2013 г.
  • Я указа ориентировочный номер строки где копать.
    И что потом и как вставлять.
    Возможно кому то пригодится

Новости

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

Форум