Блок с данными автора на странице топика

Помнится еще в начале своего прибывания на Хабре долго не мог понять, почему чтоб отметить автора необходимо сделать столько движений? Как не нравилось мне это — так и не нравится. Что собственно и стало причиной доработки, которой с вами делюсь. По ходу пьессы буду комментировать, что и к чему в итоге привело.

Задача: вывести при просмотре топика блок с информацией об авторе топика в сайдбаре справа следующего вида:



Итак начнем. Отправной точкой был пост Руководство: как убрать, добавить блоки. Дополнительно понадобились куски кода из menu.profile.tpl и много терпения постараться понять то, что нигде не описано. (помнится еще в сентябре ort обещал описание переменных в шаблонах..) Плюсом еще неумение программировать, но обошлось практически одним копипастом.

Для начала подготовим все необходимые файлы и вызов блока.

1) создаем файл шаблона block.cabinet.tpl в папке скина habra.
2) создаем файл обработчик шаблона BlockCabinet.class.php в /classes/blocks/

class BlockCabinet extends Block {
    public function Exec() {
    }
}
?>


3) назначаем вывод блока в файле /classes/actions/ActionBlog.class.php в функции init()

$this->Viewer_AddBlocks('right',array('cabinet','comments','blogs','tags'));


В принципе это все, осталось только заполнить шаблон и добиться правильного вывода в нужном месте.

Какие проблемы пришлось решить?

1) Отображение блока только на странице топика и только для зарегистрированного пользователя.

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

{if $oUserCurrent}
код шаблона
{/if}


… то с первым требованием не выходило. Блок показывался на всех страницах имеющих вид site.ru/blog/… В итоге где-то было вычитано, что переменная $oTopic появляется как раз при просмотре топика и содержит топик как объект (хз как это правильно). Что привело к дополнению конструкции:

{if $oUserCurrent}{if $oTopic}
код шаблона
{/if}{/if}


2) Получить данные о авторе топика в шаблоне блока.

Это было самой большой проблемой. Файл обработчик блока оказался бесполезным, в нем недоступен объект $oTopic, который доступен в шаблоне блока. Почему так — для меня тайна. Попытки получить необходимые данные и обработать их в самом шаблоне тоже не увенчались успехом. Потом мне подсказали, что переменные передающиеся в шаблон топика доступны и в шаблоне блока на этой странице. Из чего получилось следующее. В файле ActionBlog.class.php есть функции показа топика из коллективного и личного блогов. Там все данные и были подготовлены. Т.е. ищем функцию EventShowTopic() для коллективных блогов и EventShowTopicPersonal() для персональных и перед

/**
* Загружаем переменные в шаблон
*/


вставляем

$myUser=$this->User_getUserById($oTopic->getUserId());
$this->Viewer_Assign('myUser',$myUser);


и в итоге имеем в шаблоне блока доступную переменную $myUser содержащую юзера-автора топика. Остается только заменить в выдранных из menu.profile.tpl кусках кода $oUserCurrent на нашего $myUser и вставить в шаблон блока. Только не везде, т.к. для проверки возможности голосовать все же кое где нужна сверка ID текущего пользователя сайта и ID автора топика.

Вот собственно и все. В планах прицепить в блок последние посты автора и может что еще, что пока не придумал ;) Но тут уже больших сложностей быть не должно, принцип стал понятен.

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

С удовольствием отвечу на те вопросы, на которые хватит знаний.

зы: Пример рабочего блока на techfuture.ru Там же можно кинуть в копилку, если мои опыты вам в чем-то помогли ;)

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

avatar
мне как гостю его не видно
avatar
Да, так и должно быть. Блок видно только зарегистрированным пользователям. О чем в частности и шла речь выше. Если нет желания регаться ради посмотреть — вон картинка есть.
avatar
а ну тогда окей. Сделайте пожалуйста блок «Топ Авторов» на сайте, помоему он был бы гораздо полезней
avatar
Полезнее в плане мотивировки авторов?
avatar
Убрал это ограничение. Подумал, а зачем оно?)
avatar
ну вот и баги полезли, лента новостей ушла под блок :). Гостевой вход иногда полезен ;) В начале нужно допилить до стабл а затем ограничивать в чём-то ;)
avatar
Да действительно лента ушла под блок, причем в FF и Google Chrome все нормально отображается, а вот в opera и IE все перекорежило.
avatar
Ну, на счет верстки я предупреждал, вы ведь читали да?)) Хотя у меня в Лисе3 все в порядке. Будем разбираться.
avatar
Хорошая идея, но не очень!
avatar
Мне понравилось, но не совсем!
avatar
Понравилось, если есть умельцы выложите плз сверстанные файлы. Обязательно себе поставлю, автору респект.
avatar
Файл перезалил, как оказалось в одном месте не хватало «>». В лисе, опере норм теперь. А вот в ИЕ есть небольшой косяк. Пока не разобрался в чем дело, но уже только завтра видимо.

зы: Кто-то может помочь? А то вроде все правильно, а в одном браузере черти что.
avatar

Прикольно, молодец BorisBritva, мне понравилось. Небольшая проблемка, если аватара у автора не типа jpg, а например gif или png то соответственно отображается пустой квадратик. Это определено в строке <A href="{$DIR_WEB_ROOT}/profile/{$oTopic->getUserLogin()}/"><IMG align="left" class=img_border aheight=64 alt="" src="{$DIR_WEB_ROOT}/uploads/images/{$oTopic->getUserId()}/avatar_64x64.gif" style="margin: 0 10px 0 0;" width=64 border=0></A> файла block.cabinet.tpl. Как сделать чтобы автоматом определялся тип картинки и вывод ее в этом блоке? Буду очень благодарен если кто поможет.
avatar

заменить адрес картинки на {$myUser->getProfileAvatarPath(64)}

<A href="{$DIR_WEB_ROOT}/profile/{$oTopic->getUserLogin()}/"><IMG align="left" class=img_border aheight=64 alt="" src="{$myUser->getProfileAvatarPath(64)}" style="margin: 0 10px 0 0;" width=64 border=0></A>
avatar
Благодарить в карму ;) А вообще отметил для себя, что плюсики ставить народ не очень любит.
avatar
Все работает отлично, плюсанул, спасибо!
avatar
Остается вопрос правильности верстки. Все равно на данный момент в IE блок расползается в ширину ;(
avatar
В ие я заметил на многих проектах проблемы с версткой, зато в Опере всегда все корректно отображается.
но к сожалению например пользователи моего сайта больше всего пользуются эксплорером: 34,71 %, а при любой верстке неопытного верстальщика IE теряется в отображении.
avatar
Вопрос такой: насколько актуальна эта модификация для последней версии LS 3.0?
Спасибо
avatar
Не думаю, что актуальна. Теперь это скорее справочный материал для примера. Под новую версию не переводил и не планирую.
avatar
У меня почему то пропали остальные блоги при открывания топика. И еще не показывает рейтинг и силу… что не так?
avatar
не получается скачать исходные файлы, обновите ссылку пожалуйста! :)
avatar
Поддерживаю, обновите плиз
avatar
К сожалению ни сайт тот уже не существует, да и решение не поддерживается. Но все же просто — не получается или не пробовал сам?)
avatar
Я хотел код шаблона блока взять)))
avatar
КТО_НИБУДЬ ПОДЕЛИТЕСЬ КОДОМ БЛОКА — очень нужно — думаю не одному мне. очень срочно нужно)
avatar
будте добры, закиньте еще раз архив cabinet.rar
avatar
Поддержу. Плюсовать не могу (срок истек)
avatar
Зайдите на последнюю ссылку — это же черт знает что такое!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.