Jump to content

Количество отзывов в каталоге и на главной. Решение


Recommended Posts

Приветствую всех!

 

Скорее всего данная тема была уже обсуждена тут, но на всякие пожарные добавлю решение вопроса о выводе количество отзывов/комментариев в каталоге, а также на Главную страницу.

Будет полезно для новичков (сам не асс) :)

 

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 by DarAmal
Link to post
Share on other sites

Это годится как хороший пример того, как НЕ надо делать.

По ходу делать вызываются из базы ВСЕ данные по отзывам для всех товаров на странице. А используется из них только count. То есть для серьезных сайтов с большим числом отзывов имеем немалый риск тормозов.

 

Представьте себе, что Ваш ребенок жалуется - каждый день перед началом занятий его и других заставляют при любой погоде стоять ровными рядами  несколько минут на школьном дворе. Вы идете в школу разбираться и выясняете, что директор хочет, чтобы  каждый день все ученики были посчитаны. Вот и предложенное решение - из той же оперы...

 

И это при том, что есть готовая функция count_comments()...

Link to post
Share on other sites

Дорогой, Корс!

 

Спасибо за коммент. Если не сложно, выложите, пожалуйста правильное решение.

 

Буду Вам очень признателен!

Edited by DarAmal
Link to post
Share on other sites

 

foreach($products as &$product) {
...
$product->comments_count = $this->comments->count_comments( array('object_id'=>$product->id) );
...
}

 

mishanya, спасибо, никак не ожидал, что так быстро появится второй пример того, как НЕ надо делать.

При таком методе вместо для каждого отдельного товара будет проводиться отдельный  запроса к базе - это ж безобразие ужасное.

Такие ляпы простительны новичкам, то никак не специалистам...

Edited by Kors
Link to post
Share on other sites

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 by mishanya
Link to post
Share on other sites

Спасибо, это решение уже намного лучше предыдущего.
Остаются  мелкие недостаточки:
1. Непонятно, что в новой функции делает $this->settings->date_format.
2. Непонятно, что в новой функции делает $filter['keyword']
3. Новая функция далеко не всегда правильно считает количество...

 

вы бы вместо того чтобы набивать посты себе и кричать как все плохо, привели рабочее решение. не удивлюсь если сейчас будет ссылка на платную доработку от Корса.


Напрасно Вы сердитесь, потому что:
1. Мои замечания уже привели к тому, что Вы значительно улучшили свое решение.
2. Поскольку Вы быстро написали новое решение, стало быть, признали найденные мою недостатки.
3. Каждый занимается тем, что ему проще и ближе. Мне нравится анализировать чужие решения и находить ошибки.

Во-первых, это полезно для разработчика.
Во-вторых, это полезно многих пользователей.
В-третьих, это совсем не так просто, как Вы себе представляете. Если считаете, что найти ошибку - это пустячок, попробуйте впредь перед публикацией своих решений их анализировать на наличие ошибок и публиковать СРАЗУ БЕЗ ОШИБОК.

4. Обычно разработчики благодарят за найденную ошибку, так как понимают, что это в итоге улучшит качество их работы, имидж в глазах потребителей и принесет прочие плюсы.

5. Как говорится в одном старом фильме - "А вместе делаем общее дело: я по-своему, а ты по-своему".
 

 

Если Вам интересно, то есть и платная разработка, но работающая на совсем иных принципах:

http://simpla-tuning.com/count-comments-for-products

Edited by Kors
Link to post
Share on other sites

Если Вам интересно, то есть и платная разработка, но работающая на совсем иных принципах:

http://simpla-tuning.com/count-comments-for-products

и не сомневался почему-то.

 

 

Новая функция далеко не всегда правильно считает количество

 

убрал не нужные фильры, это как не всегда? объясните

Link to post
Share on other sites

Элементарно. Ваш вызов новой функции выглядит так

$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)

Link to post
Share on other sites

Элементарно. Ваш вызов новой функции выглядит так

$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)

 

Офигеть) мозг

Link to post
Share on other sites

Офигеть) мозг

 К Корсу отношусь двояко - с одной стороны дорогие дополнения  к Симпле, а с другой стороны грамотный прогер. И сколько бы тут не лили на него грязи (нохтер, та еще сволочь и завистник), Корс это Корс

Link to post
Share on other sites

К Корсу отношусь двояко - с одной стороны дорогие дополнения  к Симпле, а с другой стороны грамотный прогер. И сколько бы тут не лили на него грязи (нохтер, та еще сволочь и завистник), Корс это Корс

Ты мудак хренов закрой свою пасть и не говни повсюду, от тебя только один мусор да срач на форуме.

Мне не кому завидовать абсолютно, все умею делать сам и делаю даже лучше некоторых :D.

Link to post
Share on other sites
  • 2 weeks later...

 

я описал как можно получить количество постов с помощью ф-и 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) либо белый экран в админке

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...