Добавляем количество просмотров топику

Многие хотели, но не знали как доковырять, показываю на простом примере.

Открываем файл Topic.class.php
И добавляем перед закрытием класса функцию
/**
	 * Обновляем топик без всяких примочек
	 *
	 * @param TopicEntity_Topic $oTopic
	 * @return unknown
	 */
	// 
	public function SetTopicCountRead(TopicEntity_Topic $oTopic) {		
		$this->oMapperTopic->UpdateTopic($oTopic);
		$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_update',"topic_update_{$oTopic->getId()}"));
	}

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

Теперь открываем ActionBlog.class.php, и в функции EventShowTopic ищем «Выставляем SEO данные»
/**
* Выставляем SEO данные
*/

и перед вставляем

/**
* Ставим количество прочтенных топиков.
*/		
$iCountRead = $oTopic->getCountRead();
$oTopic->setCountRead($iCountRead+1);
$this->Topic_SetTopicCountRead($oTopic);

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

Нужно добавить в шаблоны отображение вывод количества просмотров.
Делаем на примере topic.tpl
Ищем
<li class="author"><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_PROFILE}/{$oTopic->getUserLogin()}/">{$oTopic->getUserLogin()}</a></li>

после добавляем строку
<li class="total">Просмотров: {$oTopic->getCountRead()}</li>

И теперь при заходе в топик будет отображаться количество просмотров.

P.S> Возможно что то упустил, дополняем, не стесняемся =)

66 комментариев

avatar
Все сделал по мануалу — у меня пока что показывает: Просмотров: 1
и счетчик никак не обновляеться, как бы я не заходил, и жал F5
avatar
Странно… у меня все ок, думаю может кэши чистить топиков, только тогда значение кэша слетает напрочь…
avatar
Нашел странный глюк, может быть он только у меня, но когда я голосую, то вместо ПРОСМОТРОВ: 5 появляется просто рейтинг топика. Допустим +10
И цвет соотвествующий, гость видит — серый цвет Просмоторов: 5
а зарегистрированный пользователь видит Просмотров: 5 — зеленого цвета ил красного если топик заминусован.

Но самое обидное, что при голосовании — количество просмоторов исчезает и появляется рейтинг. Это насколько я понимаю только у пользователя, который сам проголосовал и он лишается возможности посмотреть Просмотры, вместо этого н видит рейтинг. Решается путем обновления страницы или повторного захода.
avatar
1.У меня скромный вопрос: как сделать доступным количество просмотров только зарегистрированным юзерам?
2. Как можно сделать доступным только после Голосования за топик?

Было бы просто умопомрачительно круто!
avatar
gran Умница!
спасибо
avatar
спасибо, очень удивился, когда не обнаружил этой функции в движке
avatar
Под 3.1 работает?
  • Sky
  • 0
avatar
вроде и просто, а круто. Спасиб.
avatar
Работает! Слава и почёт автору!
avatar
Парни отпишите пожалуйста, работает ли под 3.1? Очень важно.
  • Sky
  • 0
avatar
Работает, извините.
avatar
Все получилось, спасибо!
avatar
а у меня почему то не обновляет, 3.1
в чем может быть дело? пробую на локалке
avatar
не считает то есть, всегда ноль
avatar
Все работает, прошу прощения
Надо внимательней смотреть для какой функции делаешь
avatar
скажите, есть у кого-нить проблемы с обновлением кол-ва просмотров в личных блогах? у меня почему-то Просмотров 0, хотя несколько раз обновлял страницу. В колективных всё работает…
  • F-5
  • 0
avatar
Читайте внимательней:
теперь количество просмотров будет считаться, для коллективных блогов, чтобы считалось для персональных надо теже действия сделать в функции EventShowTopicPersonal.


Я тоже сначала пропустил.
avatar
не заметил! спасибо))
avatar
Как сделать на 0.4.1?
avatar
Catchable fatal error: Argument 1 passed to ModuleTopic::SetTopicCountRead() must be an instance of TopicEntity_Topic, instance of ModuleTopic_EntityTopic given in /usr/home/nohch126/public_html/classes/modules/topic/Topic.class.php on line 1404

Сама ошибка
avatar
после добавления
**
* Ставим количество прочтенных топиков.
*/              
$iCountRead = $oTopic->getCountRead();
$oTopic->setCountRead($iCountRead+1);
$this->Topic_SetTopicCountRead($oTopic);
avatar
Потому что имена сущностей поменялись нужно заменить TopicEntity_Topic на ModuleTopic_EntityTopic в описании функции SetTopicCountRead.
avatar
Автор отзовись, очень прошу, это очень важная вещь для меня.
avatar
реализация подсчета есть в плагине «Wordpress»
avatar
Это?
public function RegisterHook() {
        $this->AddHook('topic_show','TopicShow');
    }

public function TopicShow($aParams) {
    	$oTopic=$aParams['oTopic'];
    	$oTopic->setCountRead($oTopic->getCountRead()+1);
    	$this->Topic_UpdateTopic($oTopic);
    }
avatar
Я могу добавить этот хук в HookStatisticsPerformance.class.php или создать новый, а дальше?:)
avatar
Когда хук сделаешь останется только вывести количество просмотров
<li class="total">Просмотров: {$oTopic->getCountRead()}</li>
avatar
Да, так даже лучше. Тогда хуков не было.
avatar
аналогично как для topic.tpl нужно/можно для topic_list.tpl вывести инфу о количестве просмотров, смотриться гораздо лучше, когда и там и там есть.
avatar
Пишу полностью что и как.
Открываем файл /classes/hooks/HookStatisticsPerformance.class.php
После
class HookStatisticsPerformance extends Hook {
	public function RegisterHook() {
		$this->AddHook('template_body_end','Statistics',__CLASS__,-1000);


Добавляем
$this->AddHook('topic_show','TopicShow');


Далее, после
public function Statistics() {
		$oEngine=Engine::getInstance();
		
		$iTimeInit=$oEngine->GetTimeInit();
		$iTimeFull=round(microtime(true)-$iTimeInit,3);
		$this->Viewer_Assign('iTimeFullPerformance',$iTimeFull);
		
		$aStats=$oEngine->getStats();
		$aStats['cache']['time']=round($aStats['cache']['time'],5);
		$this->Viewer_Assign('aStatsPerformance',$aStats);
		
		$this->Viewer_Assign('bIsShowStatsPerformance',Router::GetIsShowStats());
		return $this->Viewer_Fetch('statistics_performance.tpl');
	}


Добавляем
public function TopicShow($aParams) {
        $oTopic=$aParams['oTopic'];
        $oTopic->setCountRead($oTopic->getCountRead()+1);
        $this->Topic_UpdateTopic($oTopic);
    }


В шаблоне добавляем в topic.tpl или в topic_list.tpl
{$oTopic->getCountRead()}
avatar
Проверено на LS 0.4.2
Данные записываются в ls_topic в topic_count_read
avatar
спасибо огромное, намного легче чем написано выше
avatar
интересно, база не умрёт от такого кол-ва запросов?
avatar
Надо получение количества просмотров делать отдельным запросом, а то кеширование топика вообще перестанет работать — будет сбрасываться при каждом показе.
avatar
Подскажите, как это делается?
avatar
Спасибо
avatar
на новой версии 0.5 без проблем работает!
avatar
Методом тыка заметил, что при выводе через хук HookStatisticsPerformance.class.php сбивается кеширование при каждом обновлении страницы. Через хук HookCopyright.class.php все работает нормально.
avatar
на всех релизах делал именно так и все работало. Даже на ls 1.0
Но сегодня обновился ls 1.01 и парсер ругнувшись на функцию $ oTopic отказался загружать весь сайт…

Кто может помочь моему горю?

По любому решение проблемы на поверхности…
avatar
Как сделать чтобы просмотры автором топика не учитывались, а считались только просмотры другими пользователями сайта, либо не зарегистрированными пользователями?
avatar
Хук должен выглядеть так:
public function TopicShow($aParams)
{
	$oTopic=$aParams['oTopic'];
	
	// Проверяем авторизован ли юзер, если нет - обновляем статистику
	$do_count_visits=(!$this->User_IsAuthorization());
	if (!$do_count_visits)
	{
		// Если авторизован, проверяем не он ли стартер топика
		$oUser=$this->User_GetUserCurrent();
		$do_count_visits=$oUser->getId()!=$oTopic->getUserId();
	}

	if ($do_count_visits)
	{
		$oTopic->setCountRead($oTopic->getCountRead()+1);
		$this->Topic_UpdateTopic($oTopic);

	}
}


Единственное, тут ни где не учитывается посещение сайта поисковыми машинами, но, в принципе, этим можно пренебречь при большом количестве посещений :)
avatar
Спасибо!
avatar
Спасибо
avatar
а если поменять заголовок header то статистику можно будет накрутить :(
avatar
При использовании такого способа подсчета кол-ва просмотров поста сбивается кеширование. Есть идеи как это исправить?
avatar
Создать отдельную табличку для количества просмотров и подключать ее к топикам (по типу AdditionalData)
avatar
Вот чтобы не париться есть плагин, который написал мой знакомый, на основе данного поста :) скачать можете здесь, работает без проблем на 1.0 и 1.0.1 проверял лично, и стоит на моем сайта realpeople.kz
  • Rix
  • 0
avatar
Спасибо реальное!!! Выручили
А почему не в официальном сайте среди других полезных плагинов?
Хотя вопрос риторический, от этого я менее благодарным не стал ;)

p/s/ Мог бы плюсануть наплусал сколько смог бы.
avatar
Да как то не знаю) все свои плагины я размещаю у меня тут в блоге.
avatar
А у меня что-то не хочет подсчитывать количество просмотров… всегда 0
avatar
А как Вы проверяете, свои топики открываете? Попробуйте чужие…
avatar
мне очень понравилось как организована главная страница realpeople.kz/
а как такое можно реализовать?
avatar
а где хранятся числа просмотров?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.