Модернизация профиля. Часть 2. Облако интересов

Буквально на прошлой неделе доделал облако интересов.
Суть облака интересов, показывать теги, в которых пользователь заинтересован. То есть, либо теги, которыми он маркирует свои посты (ну а кто из вас пишет о неинтересном? :)), либо теги постов, который пользователь добавляет в «избранное».

Для первого в LS уже существует практически все, нужно лишь немного модифицировать файл
classes/actions/ActionProfile.class.php
ищем
/**
		 * Вызов хуков
		 */
		$this->Hook_Run('profile_whois_show',array("oUserProfile"=>$this->oUserProfile));	
		/**
		 * Загружаем переменные в шаблон
		 */

после этого вставляем
		 $aTagsUser=$this->Topic_GetTopicTagsByUserId($this->oUserProfile->getId(),  100);
		if ($aTagsUser) {
			$iMinSize=1; // минимальный размер шрифта
			$iMaxSize=10; // максимальный размер шрифта
			$iSizeRange=$iMaxSize-$iMinSize;
			
			$iMin=10000;
			$iMax=0;
			foreach ($aTagsUser as $oTag) {
				if ($iMax<$oTag->getCount()) {
					$iMax=$oTag->getCount();
				}
				if ($iMin>$oTag->getCount()) {
					$iMin=$oTag->getCount();
				}
			}			
			
			$iMinCount=log($iMin+1);
			$iMaxCount=log($iMax+1);
			$iCountRange=$iMaxCount-$iMinCount;
			if ($iCountRange==0) {
				$iCountRange=1;
			}
			foreach ($aTagsUser as $oTag) {
				$iTagSize=$iMinSize+(log($oTag->getCount()+1)-$iMinCount)*($iSizeRange/$iCountRange);
				$oTag->setSize(round($iTagSize)); // результирующий размер шрифта для тега
			}
			/**
		 	* Устанавливаем шаблон вывода
		 	*/
			$this->Viewer_Assign("aTagsUser",$aTagsUser);
}

и в файл whois.tpl добавляем
{if $aTagsUser}
<h2>Облако интересов:</h2>
	<ul class="cloud">						
		{foreach from=$aTagsUser item=oTag}
			<li><a class="w{$oTag->getSize()}" rel="tag" href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_TAG}/{$oTag->getText()|escape:'html'}/">{$oTag->getText()|escape:'html'}</a></li>	
		{/foreach}
	</ul>
	{/if}


Для того, чтобы объединить это с «избранным» немного усложним наработку.
Проделываем предыдущее, а дальше, в файл classes/modules/topic/mapper/Topic.mapper.class.php
в самый конец вставляем
	public function GetTopicFavouriteTagsByUserId($sUserId,$sUserId) {		

	/*Запрос писал сам, потому сильно не бейте, если что*/
	$sql = "
SELECT temp.topic_tag_text,
COUNT( temp.topic_tag_text ) AS count
FROM(
	SELECT 
			topic_tag_text
		 
			FROM 
				".DB_TABLE_TOPIC_TAG."	
			WHERE
				user_id = ?			

UNION ALL
	SELECT
            tt.topic_tag_text 
  
            FROM ".DB_TABLE_TOPIC_TAG." tt 
			join ".DB_TABLE_FAVOURITE_TOPIC." ft on (ft.topic_id=tt.topic_id and ft.topic_publish=1)
WHERE ft.user_id = ?) as temp
GROUP BY temp.topic_tag_text
LIMIT 100



	";	
		$aReturn=array();
		if ($aRows=$this->oDb->select($sql,$sUserId,$sUserId)) {
			foreach ($aRows as $aRow) {
				$aReturn[]=new TopicEntity_TopicTag($aRow);
			}
		}
		return $aReturn;
	}


в конец сlasses/modules/topic/Topic.class.php вставляем
public function GetTopicFavouriteTagsByUserId($sUserId,$sUserId) {
                if (false === ($data = $this->Cache_Get("tag_user_{$sUserId}_{$sUserId}"))) {                   
                        $data = $this->oMapperTopic->GetTopicFavouriteTagsByUserId($sUserId,$sUserId);
                        $this->Cache_Set($data, "tag_user_{$sUserId}_{$sUserId}", array("topic_update_user_{$sUserId}","topic_new_user_{$sUserId}"), 60*15);
                }
				return $data;		
	}

ну а теперь, немного поменяем то, что мы вставили в classes/actions/ActionProfile.class.php
строку
$aTagsUser=$this->Topic_GetTopicTagsByUserId($this->oUserProfile->getId(),  100);

меняем на
$aTagsUser=$this->Topic_GetTopicFavouriteTagsByUserId($this->oUserProfile->getId(), $this->oUserProfile->getId());

в итоге получается примерно так


PS знаю, что код кривой, сильно не бейте :) лучше помогите оптимизировать)
PPS код для css
.cloud { text-align: center; }
.cloud li { display: inline; margin-right: 5px; line-height: 28px; }
.cloud li a { color: #333; text-decoration: none; font-size: 18px; }
.cloud li a:hover { background: #333; color: #fff; }
.cloud li a.w1 { font-size: 11px; }
.cloud li a.w2 { font-size: 12px; }
.cloud li a.w3 { font-size: 14px; }
.cloud li a.w4 { font-size: 16px; }
.cloud li a.w5 { font-size: 18px; }
.cloud li a.w6 { font-size: 20px; }
.cloud li a.w7 { font-size: 22px; }
.cloud li a.w8 { font-size: 24px; }
.cloud li a.w9 { font-size: 26px; }
.cloud li a.w10 { font-size: 28px; }


ну и в общем то, всё в камментарии
Зачастую маркетологи с целью экономии бюджета прибегают к нестандартным решениям, использование QR кодов один из таких оригинальных и современных способов. Зашифровать ссылку на сайт в QR код проще всего с помощью специализированного сервиса.

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

avatar
Дай инвайт на ithint пжл :)
avatar
только сегодня рега на ithint.ru/ свободна :D
avatar
издеваешься значит?
avatar
эмм… даже не знаю, как на это ответить…
ithint.ru/registration/
avatar
Разобрался… на звездочку жать надобно )
avatar
да кстати, там существует проблема с почтовиком, так что, если что, попробуй посмотреть активационное письмо в спаме. ^^
avatar
а мне что-то никуда не пришло!
avatar
попробуй с gmail-почтой зарегаться. на нее нормально доодит
avatar
Текст и форма прилипли к левому краю экрана. Дайте воздуха, сделайте отступ.
avatar
там сломан ксс файл. да и верстка еще практически не начата :))) так что все будет :)
avatar
письмо об активации пришло, но попало в спам. Значит тот сервер где ваш сайт размещается попал в немилось почтовикам.
avatar
знаю, не могу gmail.com настроить нормально :) но на будущее, давайте вопросы об ИТ Хинте в личку плз. Те, кто знает, как все таки подружить с гмайлом, будьте добры, тоже напишите в личку :))
avatar
Не обязательно. Возможно, адрес почтового сервера согласно MX-записям отличается от адреса, откуда скрипт рассылает сообщения.

У меня не получилось проверить:
ns1.valuehost.ru did not respond with MX records for 'ithint.ru'
Это, кстати, тоже может быть причиной попадания под фильтр.
avatar
Дополню — это даже не может быть, а скорее всего причина попадания под фильтр.

Так же причиной попадания под фильтр может быть то, что используется почтовик хостера, а большинство крупных почтовых сервисов это не жалует.
avatar
понятно… я уже начал как раз это и подозревать :)) спасибо за рахъяснение
avatar
Не знаю, у меня не выходит, на последнем шаге

меняем
$aTagsUser=$this->Topic_GetTopicFavouriteTagsByUserId($this->oUserProfile->getId(), $this->oUserProfile->getId());


все пропадает
avatar
И размеры шрифта тегов тоже не работают
Делал по мануалу, в паре мест недосчитался закрывающих }
avatar
спасибо. сегодня, в течении дня проверю код… но вроде должно быть все нормально :)
avatar
Да это вам спасибо, интересное дополнение.
Но что то у меня не вышло как задумано, буду ждать вердикта.
avatar
а первый вариант прокатывает?
avatar
Теги, которые юзер вводит при написании топика?
У меня исправно работает, только не работает почему то выбор размера шрифта.

Я вот тут подумал, может второй вариант вообще исключительно правильный?
То что пользователь добавил в избранное, это 110% ему интересно.
Нельзя это отдельно реализовать?
avatar
так. вроде поправил топик
сlasses/modules/topic/Topic.class.php и classes/actions/ActionProfile.class.php
вроде больше косяков я не вижу. Проверьте пожалуйста
а насчет только избранного все очень просто. делаем по второму варианту, но SQL запрос будет такой (писал навскидку, могу ошибиться)
SELECT topic_tag_text,
COUNT( topic_tag_text ) AS count
FROM ".DB_TABLE_TOPIC_TAG."  
WHERE topic_id=(SELECT
topic_id
FROM ".DB_TABLE_FAVOURITE_TOPIC."
WHERE user_id = ?)
GROUP BY topic_tag_text
LIMIT 100
avatar
Теперь вроде все работает, кроме величины шрифта, что на это может влиять? Количество тегов?
Щас попробую отдельно второй вариант.
avatar
можно ссылку на проект. я посмотрю. такое ощущение, что count в ActionProfile не отрабатывает
avatar
эмм… локалка
рад бы O_o
avatar
добавьте в ксс
.cloud { text-align: center; }
.cloud li { display: inline; margin-right: 5px; line-height: 28px; }
.cloud li a { color: #333; text-decoration: none; font-size: 18px; }
.cloud li a:hover { background: #333; color: #fff; }
.cloud li a.w1 { font-size: 11px; }
.cloud li a.w2 { font-size: 12px; }
.cloud li a.w3 { font-size: 14px; }
.cloud li a.w4 { font-size: 16px; }
.cloud li a.w5 { font-size: 18px; }
.cloud li a.w6 { font-size: 20px; }
.cloud li a.w7 { font-size: 22px; }
.cloud li a.w8 { font-size: 24px; }
.cloud li a.w9 { font-size: 26px; }
.cloud li a.w10 { font-size: 28px; }

точно должно помочь. постоянно про ксс забываю((((
avatar
Да действительно, все нормально теперь :)

А я со своей стороны почему то решил что стандартный .block.tags ul.cloud li должен сработать, с чего бы.

ps только избранное пока не заработало
avatar
ps только избранное пока не заработало

не понял. всмысле?)))
avatar
Хм… про избранное
Пока в избранном был один топик, все работало. Как только напихал еще топиков:

SQL Error: Subquery returns more than 1 row at S:\home\localhost\www\classes\modules\topic\mapper\Topic.mapper.class.php line 1144
Array ( [code] => 1242 [message] => Subquery returns more than 1 row [query] => SELECT topic_tag_text, COUNT( topic_tag_text ) AS count FROM prefix_topic_tag WHERE topic_id=(SELECT topic_id FROM prefix_favourite_topic WHERE user_id = '1') GROUP BY topic_tag_text LIMIT 100 [context] => S:\home\localhost\www\classes\modules\topic\mapper\Topic.mapper.class.php line 1144 ) 
avatar
SELECT tt.topic_tag_text,
COUNT( tt.topic_tag_text ) AS count
FROM ".DB_TABLE_TOPIC_TAG." tt 
join ".DB_TABLE_FAVOURITE_TOPIC." ft on (ft.topic_id=tt.topic_id and ft.topic_publish=1)
WHERE ft.user_id = ?
GROUP BY tt.topic_tag_text
LIMIT 100

тогда что-то вроде этого. но придется работать еще и с остальными файлами
avatar
Да нет, вроде заработало. ))
Большое спасибо, имхо нужно все в шапку, по вариантам, кому что ближе.
Еще раз спасибо, жаль плюсануть не могу, не дорос.
avatar
у меня пишет Parse error: syntax error, unexpected T_PUBLIC
avatar
простите, вечером, как доберусь до нормального компа без прокси, проверю код :) Делал параллельно с подготовкой к вступительным экзаменам, потому мог в описании и накосячить :)
avatar
обновил пост. проверяйте :)
avatar
Норма!
avatar
у меня пишет Parse error: syntax error, unexpected T_PUBLIC
avatar
все равно тоже самое? проверьте еще раз код. я вечером внес изменения.
и да, это полный текст ошибки? подозреваю, что нет
avatar
я вот не понимаю, можно ли просто копировать код из перовго поста или там нужно вместо пробелов ставить табы?
avatar
не понял. где именно?
avatar
Parse error: syntax error, unexpected T_PUBLIC in /bhome/part3/03/zzz/zzz/www/classes/modules/topic/Topic.class.php on line 767

public function GetTopicFavouriteTagsByUserId($sUserId,$sUserId) { на этой строчке
avatar
проверьте код
public function GetTopicFavouriteTagsByUserId($sUserId,$sUserId) {
                if (false === ($data = $this->Cache_Get("tag_user_{$sUserId}_{$sUserId}"))) {                   
                        $data = $this->oMapperTopic->GetTopicFavouriteTagsByUserId($sUserId,$sUserId);
                        $this->Cache_Set($data, "tag_user_{$sUserId}_{$sUserId}", array("topic_update_user_{$sUserId}","topic_new_user_{$sUserId}"), 60*15);
                }
                                return $data;           
        }
avatar
еще интересует момент (глупо, но все же :D):
в самый конец вставляем

вставлять до "?>" или после?
avatar
«После» будет обрабатываться как HTML код. При этом гробив всю остальную ООП систему. Вывод?
avatar
ну это понятно, у меня не только с этим дополнением проблема. В еще несколких вылазиет T_PUBLIC ошибка на строчке public function. Например, отделение администраторов от пользователей.
avatar
Ошибка при копипасте, что не удивительно, видя подобные вопросы.
avatar
так и не разобрался со второй частью, почитал комменты, тоже не очень понятно где, что менять :(
то, что описано в первом этапе работает без проблем.

Кстати заметил такую штуку, если темы помеченные какими то тегами давно удалены, то в профайле пользователя они все равно выводятся! Каким образом можно их удалять, чтобы не лезть в пхпмайадмин?
avatar
странно у меня все удаленные топики/теги не выводятся в облаке.

а что во второй части не понятно?
avatar
Не знаю, забыл ошибку записать, обратно вернул как было. Сейчас наверное повторю и напишу ошибку.
Листинг classes/modules/topic/mapper/Topic.mapper.class.php в шапке топика он уже исправленный или нет? (в комментариях просто мотрю есть еще какие то рекомендации по правки запросов бд).

Кстати весь код функции вставляешь до:

}
?>


Верно?
avatar
Topic.mapper.class.php исправленный.
Кстати весь код функции вставляешь до:

конечно.
правда насчет последнего } неуверен))) не могу в данный момент посмотреть код
avatar
ну, когда я после выставлял у меня сразу ошибка была, когда перед ошибки не было, а потом вообще все умерло :))) позже напишу подробности ошибки, очень интересно, что там случилось то, вроде бы все внимательно делал.
avatar
тогда если не трудно в личку либо аську)) мне самому интересно
avatar
а под ls 0.4 я так понимаю не покатит?
avatar
нет, не будет, надо переписывать
avatar
я так понимаю переписать нужно только часть запросов к БД
avatar
в принципе да. И упаковать в плагин ^_^
avatar
Было бы круто.
avatar
Получилось?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.