Хак "Аватар блога в топиках"

Живой пример такого хака: open-life.org
Скрин:


Установка:
1а.В файле /classes/modules/topic/mapper/Topic.mapper.class.php найти функцию GetTopicById, GetTopicsByArrayId, GetTopicsByTag и GetTopicsFavouriteByUserId
Найти во всех этих функциях

					u.user_login as user_login,
					b.blog_type as blog_type,	
					b.blog_url as blog_url,
					b.blog_title as blog_title,
					b.user_owner_id as blog_owner_id,

Заменить на

					u.user_login as user_login,
					u.user_profile_avatar as user_profile_avatar,
					u.user_profile_avatar_type as user_profile_avatar_type,
					b.blog_type as blog_type,	
					b.blog_url as blog_url,
					b.blog_title as blog_title,
					b.user_owner_id as blog_owner_id,
					b.blog_avatar as blog_avatar,
					b.blog_avatar_type as blog_avatar_type,


1b.В файле /classes/modules/topic/mapper/Topic.mapper.class.php найти функции GetTopics и GetTopicsRatingByDate
Найти в функцях

					u.user_login as user_login,
					IF(tv.topic_id IS NULL,0,1) as user_is_vote,

Заменить на

					u.user_login as user_login,
					u.user_profile_avatar as user_profile_avatar,
					u.user_profile_avatar_type as user_profile_avatar_type,
					IF(tv.topic_id IS NULL,0,1) as user_is_vote,

Найти в функциях

						b.blog_title as blog_title,
						b.blog_type as blog_type,
						b.blog_url as blog_url,
						b.user_owner_id as blog_owner_id

Заменить на

						b.blog_title as blog_title,
						b.blog_type as blog_type,
						b.blog_url as blog_url,
						b.user_owner_id as blog_owner_id,
						b.blog_avatar as blog_avatar,
						b.blog_avatar_type as blog_avatar_type


2.В файле /classes/modules/topic/entity/Topic.entity.class.php
Найти

    public function getBlogOwnerId() {
        return $this->_aData['blog_owner_id'];
    }

Добавить после

	public function getBlogAvatar() {
		return $this->_aData['blog_avatar'];
	}
	public function getBlogAvatarType() {
		return $this->_aData['blog_avatar_type'];
	}
	public function getUserAvatar() {
		return $this->_aData['user_profile_avatar'];
	}
	public function getUserAvatarType() {
		return $this->_aData['user_profile_avatar_type'];
	}
	public function getAvatarPath($iSize=24,$bShowNoIcon=false,$bShowNoUserIcon=true) {
		if ($this->getBlogType()==open) {
			if ($this->getBlogAvatar()) { 	
				return DIR_WEB_ROOT.DIR_UPLOADS_IMAGES.'/'.$this->getBlogOwnerId()."/avatar_blog_{$this->getBlogUrl()}_".$iSize.'x'.$iSize.'.'.$this->getBlogAvatarType();
			} 
			else {
				if ($bShowNoIcon) {
					return DIR_STATIC_SKIN.'/images/avatar_blog_'.$iSize.'x'.$iSize.'.gif';
				}
				else {
					return false;
				}
			}
		}
		//Аналог if (getBlogType()==personal)
		else {
			if ($this->getUserAvatar()) { 	
				return DIR_WEB_ROOT.DIR_UPLOADS_IMAGES.'/'.$this->getUserId()."/avatar_".$iSize.'x'.$iSize.'.'.$this->getUserAvatarType();
			} 
			else {
				if ($bShowNoUserIcon) {
					return DIR_STATIC_SKIN.'/images/avatar_'.$iSize.'x'.$iSize.'.jpg';
				}
				else {
					return false;
				}
			}
		}
	}


3d.Только если у вас скин Developer. В файлах /templates/skin/developer/topic.tpl и /templates/skin/developer/topic_list.tpl
Найти

		<a href="{$oTopic->getBlogUrlFull()}" class="blog-title">{$oTopic->getBlogTitle()|escape:'html'}</a><span> /</span>

Добавить перед этим

		{if $oTopic->getAvatarPath()}<img src="{$oTopic->getAvatarPath()}" title="Иконка блога {$oTopic->getBlogTitle()}" alt="Иконка блога {$oTopic->getBlogTitle()}" />{/if}


3n1.Только если у вас скин New. В файле/templates/skin/new/topic.tpl
Найти

					{$oTopic->getTitle()|escape:'html'}

Добавить перед

					{if $oTopic->getAvatarPath()}<img src="{$oTopic->getAvatarPath()}" title="Иконка блога {$oTopic->getBlogTitle()}" alt="Иконка блога {$oTopic->getBlogTitle()}" />{/if}


3n2.Только если у вас скин New. В файле/templates/skin/new/topic_list.tpl

					<a href="{if $oTopic->getType()=='link'}{$DIR_WEB_ROOT}/{$ROUTE_PAGE_LINK}/go/{$oTopic->getId()}/{else}{$oTopic->getUrl()}{/if}">{$oTopic->getTitle()|escape:'html'}</a>

Добавить перед

					{if $oTopic->getAvatarPath()}<img src="{$oTopic->getAvatarPath()}" title="Иконка блога {$oTopic->getBlogTitle()}" alt="Иконка блога {$oTopic->getBlogTitle()}" />{/if}


Если у вас другой скин, то нужно в шаблоны topic.tpl и topic_list.tpl впихнуть строку

{if $oTopic->getAvatarPath()}<img src="{$oTopic->getAvatarPath()}" title="Иконка блога {$oTopic->getBlogTitle()}" alt="Иконка блога {$oTopic->getBlogTitle()}" />{/if}

Место выбрать по усмотрению :), функции getAvatarPath() так же можно послать переменные, однако стандартные должны подойти.

Главная функция хака — getAvatarPath($iSize=24,$bShowNoIcon=false,$bShowNoUserIcon=true)
Имеет 3 параметра
$iSize — Размер аватара в пикселях 24,48 или пусто.
$bShowNoIcon — Показывать аватар блога, если своей нет?
$bShowNoUserIcon — Тоже самое, но в случае с персональным блогом. Показываться будет стандартный аватар

P.S.: Дайте рейтинга и перенесу в Tips & tricks

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

avatar
Было бы неплохо чтоб этот хак внесли в след. релиз.
avatar
не-а. это опциональная штука. не каждому она нужна. а с такой инструкцией я думаю нет проблем сделать это себе, если надо
avatar
Я понимаю что опциональный хак. Но! сложновато отслеживать каждые изменения и после АП новым релизом, опять приходится ломать голову. Что делал и что надо восстановить.

Это единственный по мне недостаток движка. Хотя у него все еще впереди!

avatar
это неизбежное зло. так было и будет всегда. или вы используете коробочную версию без изменений и просто перезаливаете все файлы. или модифицируете систему под себя и с каждым новым релизом обновляетесь вручную.

что бы было проще надо вести лог изменений, с подробными комментариями, что где и для чего. Иначе никак.

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

Было бы неплохо это сделать отдельным модулем, а не модификацией.
Тогда и проблем бы меньше было.
avatar
писать отдельный модуль для одного дополнительного запроса в базу и небольших правок в цсс и тпл? увольте. хак тем и отличается от модуля.
avatar
)))
Ну чтож тогда ведем логи ;)
avatar
Какой дополнительный запрос? Там запросов в базу столько же сколько и было. :D
avatar
я образно =) не читал еще вдумчиво ваш код, в избранное кинул на будущее =]
avatar
Я к примеру просто всегда комментирую что вставляю, а потом ищу нужный текст по файлам, это же не сложно)
avatar
В принципе то и не сложно, пока файлов немного.
avatar
Уже наступил на грабли. Обновил стандартный поиск и заново пришлось прописывать хак. )))
avatar
Полезная вещь!

А никто не делал вывод аваторов блогов в правом блоке?
avatar
А вот к правому это наверное будет лишне
avatar
В нужном месте вызывай функцию getAvatarPath()
Если используется другой запрос (для чочо нупь: функция в Topic.mapper.class.php), то с этим запросом следует забирать
blog_avatar
blog_avatar_type
user_profile_avatar
user_profile_avatar_type
avatar
Такое ощущение, что никто не проверяет и не ставит эти хаки…
avatar
thx! классная фича — всё сработало — за 5 минут уложился!
avatar
Если перейти в топ блогов то для коллективного блога не отображалась иконка.
Я попробовал изменить по наитию функцию function getAvatarPath
вот это
return DIR_WEB_ROOT.DIR_UPLOADS_IMAGES.'/'.$this->getBlogOwnerId()."/avatar_blog_{$this->getBlogUrl()}_".$iSize.'x'.$iSize.'.'.$this->getBlogAvatarType();

заменил на это
return DIR_WEB_ROOT.DIR_UPLOADS_IMAGES.'/'.$this->getUserId()."/avatar_blog_{$this->getBlogUrl()}_".$iSize.'x'.$iSize.'.'.$this->getBlogAvatarType();

Вроде бы работает.
Поправте если че не так.
avatar
спасибо с изменением $this->getBlogOwnerId() на $this->getUserId() стали отображается
avatar
однако это не решение надо дописать условие что если мы не находимся в топе топиков брать из то брать значение из getBlogOwnerId() иначе getUserId()
avatar
в функциях GetTopicsByTag, GetTopicsFavouriteByUserId и GetTopicsRatingByDate
не нашлось
b.user_owner_id as blog_owner_id,

я его при замене просто пропустил это так и задумывалось? :) вроде работает

да я так и не понял как авотар блогу поставить?
avatar
да я так и не понял как авотар блогу поставить?

чето ступил все работает) спасибо за хак!
avatar
У меня он не хочет работать с функцией getAvatarPath($iSize=24,$bShowNoIcon=false,$bShowNoUserIcon=true)
avatar
делал как оп инструкции, выдал ошибку.
SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF(tv.topic_id IS NULL,0,1) as user_is_vote, tv.vote_delta as user_vote_de' at line 13 at /home/w/welikephot/public_html/classes/modules/topic/mapper/Topic.mapper.class.php line 239
Array ( [code] => 1064 [message] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF(tv.topic_id IS NULL,0,1) as user_is_vote, tv.vote_delta as user_vote_de' at line 13 [query] => SELECT t_fast.*, tc.*, u.user_login as user_login, u.user_profile_avatar as user_profile_avatar, u.user_profile_avatar_type as user_profile_avatar_type, b.blog_type as blog_type, b.blog_url as blog_url, b.blog_title as blog_title, b.user_owner_id as blog_owner_id, b.blog_avatar as blog_avatar, b.blog_avatar_type as blog_avatar_type IF(tv.topic_id IS NULL,0,1) as user_is_vote, tv.vote_delta as user_vote_delta, IF(tqv.topic_id IS NULL,0,1) as user_question_is_vote, bu.is_moderator as user_is_blog_moderator, bu.is_administrator as user_is_blog_administrator FROM ( SELECT t.* FROM prefix_topic as t WHERE t.topic_id = 1 AND ( 1=1 ) ) AS t_fast JOIN prefix_user AS u ON t_fast.user_id=u.user_id JOIN prefix_blog AS b ON t_fast.blog_id=b.blog_id LEFT JOIN ( SELECT topic_id, vote_delta FROM prefix_topic_vote WHERE user_voter_id = 1 ) AS tv ON t_fast.topic_id=tv.topic_id LEFT JOIN ( SELECT is_moderator, is_administrator, blog_id FROM prefix_blog_user WHERE user_id = 1 ) AS bu ON t_fast.blog_id=bu.blog_id LEFT JOIN ( SELECT topic_id FROM prefix_topic_question_vote WHERE user_voter_id = 1 ) AS tqv ON t_fast.topic_id=tqv.topic_id JOIN prefix_topic_content AS tc ON t_fast.topic_id=tc.topic_id [context] => /home/w/welikephot/public_html/classes/modules/topic/mapper/Topic.mapper.class.php line 239 ) 
avatar
Спасибо афтару все поставил))) Работает… Если кто неможет поставить пишите в личку скину все отредактированные файлы…
avatar
На 0.4 работает?
avatar
нет, на 0.4.1 нету таких функций в классах даже)) хреново если честно, ап под 0 4 1 планируется?
avatar
в нужном месте, например где нибудь рядом со ссылкой в topic_list.tpl
{if $oBlog->getAvatarPath()}<img src="{$oBlog->getAvatarPath(24)}" alt="" />{else} <img src="{$oUser->getProfileAvatarPath(24)}" alt="avatar" class="avatar" />{/if}


только вот для персональных блогов показывается дефолтный аватар… не знаю как сделать проверку «персональный или коллективный блог».
avatar
как подобное реализовать на LS 5.0.1?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.