daramal Posted August 20, 2015 Report Share Posted August 20, 2015 (edited) Приветствую всех! Скорее всего данная тема была уже обсуждена тут, но на всякие пожарные добавлю решение вопроса о выводе количество отзывов/комментариев в каталоге, а также на Главную страницу.Будет полезно для новичков (сам не асс) 1. Выводим количество отзывов в каталог продукции:В файле ProductsView.php, примерно в строке 345 или же там где: foreach($products as &$product) Далее идут фигурные скобки. После закрывающей скобки } добавляем следующий код: /* Выводим количество отзывов в Каталог на каждый товар */ $comments = $this->comments->get_comments(array('object_id'=>$products_ids)); $product->comments = array(); foreach($comments as &$comment) { $products[$comment->object_id]->comments[] = $comment; } 2. Для того, чтобы вывести количество отзывов на Главную страницу, добавляем в файле View.php, примерно в строке 401 или же также ищем: foreach($products as &$product) тоже самое, после фигурных скобок добавляем то что выше привел. И так, еще 2 раза в этом же файле проводим такую манипуляцию )) Таким образом мы выводим для каждого блока (Рекомендуемые, Новинки, Скидки) количество отзывов в товарах. 3. Последний шаг - это добавить в сам шаблон, туда где Вы хотите вывести количество Отзывы: {$product->comments|count} я например добавляю с ссылкой: <a href="products/{$product->url}" title='Просмотреть отзывы о {$product->name|escape}' style="color:#222;">Отзывы: {$product->comments|count}</a> Вот и все. Спасибо и всем Удачи! Edited August 20, 2015 by DarAmal Quote Link to post Share on other sites
Kors Posted August 20, 2015 Report Share Posted August 20, 2015 Это годится как хороший пример того, как НЕ надо делать.По ходу делать вызываются из базы ВСЕ данные по отзывам для всех товаров на странице. А используется из них только count. То есть для серьезных сайтов с большим числом отзывов имеем немалый риск тормозов. Представьте себе, что Ваш ребенок жалуется - каждый день перед началом занятий его и других заставляют при любой погоде стоять ровными рядами несколько минут на школьном дворе. Вы идете в школу разбираться и выясняете, что директор хочет, чтобы каждый день все ученики были посчитаны. Вот и предложенное решение - из той же оперы... И это при том, что есть готовая функция count_comments()... Quote Link to post Share on other sites
daramal Posted August 20, 2015 Author Report Share Posted August 20, 2015 (edited) Дорогой, Корс! Спасибо за коммент. Если не сложно, выложите, пожалуйста правильное решение. Буду Вам очень признателен! Edited August 20, 2015 by DarAmal Quote Link to post Share on other sites
mishanya Posted August 20, 2015 Report Share Posted August 20, 2015 foreach($products as &$product) { ... $product->comments_count = $this->comments->count_comments( array('object_id'=>$product->id) ); ... } Quote Link to post Share on other sites
Kors Posted August 20, 2015 Report Share Posted August 20, 2015 (edited) foreach($products as &$product) { ... $product->comments_count = $this->comments->count_comments( array('object_id'=>$product->id) ); ... } mishanya, спасибо, никак не ожидал, что так быстро появится второй пример того, как НЕ надо делать.При таком методе вместо для каждого отдельного товара будет проводиться отдельный запроса к базе - это ж безобразие ужасное.Такие ляпы простительны новичкам, то никак не специалистам... Edited August 20, 2015 by Kors Quote Link to post Share on other sites
trainracing Posted August 20, 2015 Report Share Posted August 20, 2015 а я просто вывожу : {$comments|count} в функции продукта. Quote Link to post Share on other sites
daramal Posted August 20, 2015 Author Report Share Posted August 20, 2015 а я просто вывожу : {$comments|count} в функции продукта.Дело в том, что в Каталоге и на Главной это не работает Quote Link to post Share on other sites
mishanya Posted August 20, 2015 Report Share Posted August 20, 2015 (edited) mishanya, спасибо, никак не ожидал, что так быстро появится второй пример того, как НЕ надо делать.При таком методе вместо для каждого отдельного товара будет проводиться отдельный запроса к базе - это ж безобразие ужасное.Такие ляпы простительны новичкам, то никак не специалистам... я описал как можно получить количество постов с помощью ф-и count_comments. вы бы вместо того чтобы набивать посты себе и кричать как все плохо, привели рабочее решение. не удивлюсь если сейчас будет ссылка на платную доработку от Корса. для того чтобы использовать 1 запрос можно добавить ф-ю в api/Comments.php // Количество комментариев, удовлетворяющих фильтру public function count_comments_only($filter = array()) { $object_id_filter = ''; $type_filter = ''; $approved_filter = ''; if(!empty($filter['object_id'])) $object_id_filter = $this->db->placehold('AND c.object_id in(?@)', (array)$filter['object_id']); if(!empty($filter['type'])) $type_filter = $this->db->placehold('AND c.type=?', $filter['type']); if(isset($filter['approved'])) $approved_filter = $this->db->placehold('AND c.approved=?', intval($filter['approved'])); $query = $this->db->placehold("SELECT c.object_id, count(distinct c.id) as count FROM __comments c WHERE 1 $object_id_filter $type_filter $approved_filter GROUP BY c.object_id"); $this->db->query($query); $comm = $this->db->results(); $comments = array(); foreach ($comm as $c) { $comments[$c->object_id] = $c->count; } return $comments; } а в view/ProductsView.php написать таким образом $products_ids = array_keys($products); $comments_count = $this->comments->count_comments_only(array('object_id'=>$products_ids, 'approved'=>1,'type'=>'product')); foreach($products as &$product) { $product->variants = array(); $product->images = array(); $product->properties = array(); if(isset($comments_count[$product->id])) $product->comments_count = $comments_count[$product->id]; else $product->comments_count = 0; } Edited August 20, 2015 by mishanya Quote Link to post Share on other sites
Kors Posted August 20, 2015 Report Share Posted August 20, 2015 (edited) Спасибо, это решение уже намного лучше предыдущего.Остаются мелкие недостаточки:1. Непонятно, что в новой функции делает $this->settings->date_format.2. Непонятно, что в новой функции делает $filter['keyword']3. Новая функция далеко не всегда правильно считает количество... вы бы вместо того чтобы набивать посты себе и кричать как все плохо, привели рабочее решение. не удивлюсь если сейчас будет ссылка на платную доработку от Корса.Напрасно Вы сердитесь, потому что:1. Мои замечания уже привели к тому, что Вы значительно улучшили свое решение.2. Поскольку Вы быстро написали новое решение, стало быть, признали найденные мою недостатки.3. Каждый занимается тем, что ему проще и ближе. Мне нравится анализировать чужие решения и находить ошибки.Во-первых, это полезно для разработчика.Во-вторых, это полезно многих пользователей.В-третьих, это совсем не так просто, как Вы себе представляете. Если считаете, что найти ошибку - это пустячок, попробуйте впредь перед публикацией своих решений их анализировать на наличие ошибок и публиковать СРАЗУ БЕЗ ОШИБОК.4. Обычно разработчики благодарят за найденную ошибку, так как понимают, что это в итоге улучшит качество их работы, имидж в глазах потребителей и принесет прочие плюсы.5. Как говорится в одном старом фильме - "А вместе делаем общее дело: я по-своему, а ты по-своему". Если Вам интересно, то есть и платная разработка, но работающая на совсем иных принципах:http://simpla-tuning.com/count-comments-for-products Edited August 20, 2015 by Kors Quote Link to post Share on other sites
mishanya Posted August 20, 2015 Report Share Posted August 20, 2015 Если Вам интересно, то есть и платная разработка, но работающая на совсем иных принципах:http://simpla-tuning.com/count-comments-for-productsи не сомневался почему-то. Новая функция далеко не всегда правильно считает количество убрал не нужные фильры, это как не всегда? объясните Quote Link to post Share on other sites
Kors Posted August 20, 2015 Report Share Posted August 20, 2015 Элементарно. Ваш вызов новой функции выглядит так $comments_count = $this->comments->count_comments_only(array('object_id'=>$products_ids, 'approved'=>1)); А если сравнить с подобным вызовом в view/ProductView.php, то можно легко понять, что у Вас в вызове не хватает параметра 'type'=>'product' что реально дает не число отзывов к товару, например, c ID=7, а совсем неправильную величину (число отзывов к товару c ID=7 + число отзывов к статье блога c ID=7) Quote Link to post Share on other sites
trainracing Posted August 20, 2015 Report Share Posted August 20, 2015 Элементарно. Ваш вызов новой функции выглядит так $comments_count = $this->comments->count_comments_only(array('object_id'=>$products_ids, 'approved'=>1)); А если сравнить с подобным вызовом в view/ProductView.php, то можно легко понять, что у Вас в вызове не хватает параметра 'type'=>'product' что реально дает не число отзывов к товару, например, c ID=7, а совсем неправильную величину (число отзывов к товару c ID=7 + число отзывов к статье блога c ID=7) Офигеть) мозг Quote Link to post Share on other sites
Konan Posted August 20, 2015 Report Share Posted August 20, 2015 Офигеть) мозг К Корсу отношусь двояко - с одной стороны дорогие дополнения к Симпле, а с другой стороны грамотный прогер. И сколько бы тут не лили на него грязи (нохтер, та еще сволочь и завистник), Корс это Корс Quote Link to post Share on other sites
Noxter Posted August 20, 2015 Report Share Posted August 20, 2015 К Корсу отношусь двояко - с одной стороны дорогие дополнения к Симпле, а с другой стороны грамотный прогер. И сколько бы тут не лили на него грязи (нохтер, та еще сволочь и завистник), Корс это КорсТы мудак хренов закрой свою пасть и не говни повсюду, от тебя только один мусор да срач на форуме. Мне не кому завидовать абсолютно, все умею делать сам и делаю даже лучше некоторых . Quote Link to post Share on other sites
Maksclub Posted August 21, 2015 Report Share Posted August 21, 2015 Офигеть) мозгЯ так понял возраст (в контексте скилл + занудство в хорошем смысле), хороший специалист, но, блин, дорогой Quote Link to post Share on other sites
trainracing Posted September 4, 2015 Report Share Posted September 4, 2015 я описал как можно получить количество постов с помощью ф-и count_comments. вы бы вместо того чтобы набивать посты себе и кричать как все плохо, привели рабочее решение. не удивлюсь если сейчас будет ссылка на платную доработку от Корса. для того чтобы использовать 1 запрос можно добавить ф-ю в api/Comments.php // Количество комментариев, удовлетворяющих фильтру public function count_comments_only($filter = array()) { $object_id_filter = ''; $type_filter = ''; $approved_filter = ''; if(!empty($filter['object_id'])) $object_id_filter = $this->db->placehold('AND c.object_id in(?@)', (array)$filter['object_id']); if(!empty($filter['type'])) $type_filter = $this->db->placehold('AND c.type=?', $filter['type']); if(isset($filter['approved'])) $approved_filter = $this->db->placehold('AND c.approved=?', intval($filter['approved'])); $query = $this->db->placehold("SELECT c.object_id, count(distinct c.id) as count FROM __comments c WHERE 1 $object_id_filter $type_filter $approved_filter GROUP BY c.object_id"); $this->db->query($query); $comm = $this->db->results(); $comments = array(); foreach ($comm as $c) { $comments[$c->object_id] = $c->count; } return $comments; } а в view/ProductsView.php написать таким образом $products_ids = array_keys($products); $comments_count = $this->comments->count_comments_only(array('object_id'=>$products_ids, 'approved'=>1,'type'=>'product')); foreach($products as &$product) { $product->variants = array(); $product->images = array(); $product->properties = array(); if(isset($comments_count[$product->id])) $product->comments_count = $comments_count[$product->id]; else $product->comments_count = 0; } Не работает. Белый экран либо в каталоге (если убрать в функции _only) либо белый экран в админке Quote Link to post Share on other sites
mishanya Posted September 4, 2015 Report Share Posted September 4, 2015 Не работает. Белый экран либо в каталоге (если убрать в функции _only) либо белый экран в админке включите вывод ошибок. что выдает Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.