Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

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

 

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

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

 

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>

 

Вот и все. Спасибо и всем Удачи!

 

Изменено пользователем DarAmal
Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Изменено пользователем DarAmal
Ссылка на сообщение
Поделиться на другие сайты

 

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

 

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

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

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

Изменено пользователем Kors
Ссылка на сообщение
Поделиться на другие сайты

а я просто вывожу :

{$comments|count}

в функции продукта.

Дело в том, что в Каталоге и на Главной это не работает

Ссылка на сообщение
Поделиться на другие сайты

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;
}
Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

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

 

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


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

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

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

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

 

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

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

Изменено пользователем Kors
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Я так понял возраст (в контексте скилл + занудство в хорошем смысле), хороший специалист, но, блин, дорогой

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...

 

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

Ссылка на сообщение
Поделиться на другие сайты

Не работает. Белый экран либо в каталоге (если убрать в функции _only) либо белый экран в админке

 

включите вывод ошибок. что выдает

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...