daramal Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 (изменено) Приветствую всех! Скорее всего данная тема была уже обсуждена тут, но на всякие пожарные добавлю решение вопроса о выводе количество отзывов/комментариев в каталоге, а также на Главную страницу.Будет полезно для новичков (сам не асс) 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> Вот и все. Спасибо и всем Удачи! Изменено 20 августа, 2015 пользователем DarAmal Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 Это годится как хороший пример того, как НЕ надо делать.По ходу делать вызываются из базы ВСЕ данные по отзывам для всех товаров на странице. А используется из них только count. То есть для серьезных сайтов с большим числом отзывов имеем немалый риск тормозов. Представьте себе, что Ваш ребенок жалуется - каждый день перед началом занятий его и других заставляют при любой погоде стоять ровными рядами несколько минут на школьном дворе. Вы идете в школу разбираться и выясняете, что директор хочет, чтобы каждый день все ученики были посчитаны. Вот и предложенное решение - из той же оперы... И это при том, что есть готовая функция count_comments()... Цитата Ссылка на сообщение Поделиться на другие сайты
daramal Опубликовано 20 августа, 2015 Автор Жалоба Поделиться Опубликовано 20 августа, 2015 (изменено) Дорогой, Корс! Спасибо за коммент. Если не сложно, выложите, пожалуйста правильное решение. Буду Вам очень признателен! Изменено 20 августа, 2015 пользователем DarAmal Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 foreach($products as &$product) { ... $product->comments_count = $this->comments->count_comments( array('object_id'=>$product->id) ); ... } Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 (изменено) foreach($products as &$product) { ... $product->comments_count = $this->comments->count_comments( array('object_id'=>$product->id) ); ... } mishanya, спасибо, никак не ожидал, что так быстро появится второй пример того, как НЕ надо делать.При таком методе вместо для каждого отдельного товара будет проводиться отдельный запроса к базе - это ж безобразие ужасное.Такие ляпы простительны новичкам, то никак не специалистам... Изменено 20 августа, 2015 пользователем Kors Цитата Ссылка на сообщение Поделиться на другие сайты
trainracing Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 а я просто вывожу : {$comments|count} в функции продукта. Цитата Ссылка на сообщение Поделиться на другие сайты
daramal Опубликовано 20 августа, 2015 Автор Жалоба Поделиться Опубликовано 20 августа, 2015 а я просто вывожу : {$comments|count} в функции продукта.Дело в том, что в Каталоге и на Главной это не работает Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 (изменено) 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; } Изменено 20 августа, 2015 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 (изменено) Спасибо, это решение уже намного лучше предыдущего.Остаются мелкие недостаточки:1. Непонятно, что в новой функции делает $this->settings->date_format.2. Непонятно, что в новой функции делает $filter['keyword']3. Новая функция далеко не всегда правильно считает количество... вы бы вместо того чтобы набивать посты себе и кричать как все плохо, привели рабочее решение. не удивлюсь если сейчас будет ссылка на платную доработку от Корса.Напрасно Вы сердитесь, потому что:1. Мои замечания уже привели к тому, что Вы значительно улучшили свое решение.2. Поскольку Вы быстро написали новое решение, стало быть, признали найденные мою недостатки.3. Каждый занимается тем, что ему проще и ближе. Мне нравится анализировать чужие решения и находить ошибки.Во-первых, это полезно для разработчика.Во-вторых, это полезно многих пользователей.В-третьих, это совсем не так просто, как Вы себе представляете. Если считаете, что найти ошибку - это пустячок, попробуйте впредь перед публикацией своих решений их анализировать на наличие ошибок и публиковать СРАЗУ БЕЗ ОШИБОК.4. Обычно разработчики благодарят за найденную ошибку, так как понимают, что это в итоге улучшит качество их работы, имидж в глазах потребителей и принесет прочие плюсы.5. Как говорится в одном старом фильме - "А вместе делаем общее дело: я по-своему, а ты по-своему". Если Вам интересно, то есть и платная разработка, но работающая на совсем иных принципах:http://simpla-tuning.com/count-comments-for-products Изменено 20 августа, 2015 пользователем Kors Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 Если Вам интересно, то есть и платная разработка, но работающая на совсем иных принципах:http://simpla-tuning.com/count-comments-for-productsи не сомневался почему-то. Новая функция далеко не всегда правильно считает количество убрал не нужные фильры, это как не всегда? объясните Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 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) Цитата Ссылка на сообщение Поделиться на другие сайты
trainracing Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 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) Офигеть) мозг Цитата Ссылка на сообщение Поделиться на другие сайты
Konan Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 Офигеть) мозг К Корсу отношусь двояко - с одной стороны дорогие дополнения к Симпле, а с другой стороны грамотный прогер. И сколько бы тут не лили на него грязи (нохтер, та еще сволочь и завистник), Корс это Корс Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 20 августа, 2015 Жалоба Поделиться Опубликовано 20 августа, 2015 К Корсу отношусь двояко - с одной стороны дорогие дополнения к Симпле, а с другой стороны грамотный прогер. И сколько бы тут не лили на него грязи (нохтер, та еще сволочь и завистник), Корс это КорсТы мудак хренов закрой свою пасть и не говни повсюду, от тебя только один мусор да срач на форуме. Мне не кому завидовать абсолютно, все умею делать сам и делаю даже лучше некоторых . Цитата Ссылка на сообщение Поделиться на другие сайты
Maksclub Опубликовано 21 августа, 2015 Жалоба Поделиться Опубликовано 21 августа, 2015 Офигеть) мозгЯ так понял возраст (в контексте скилл + занудство в хорошем смысле), хороший специалист, но, блин, дорогой Цитата Ссылка на сообщение Поделиться на другие сайты
trainracing Опубликовано 4 сентября, 2015 Жалоба Поделиться Опубликовано 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) либо белый экран в админке Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 4 сентября, 2015 Жалоба Поделиться Опубликовано 4 сентября, 2015 Не работает. Белый экран либо в каталоге (если убрать в функции _only) либо белый экран в админке включите вывод ошибок. что выдает Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.