Пытаюсь аналогичным образом вызвать userSmallPhoto для recentPosts.
Код у recentPosts получается вот такой:
<if test="hasRecentPosts:|:is_array($recentPosts) && count($recentPosts)">
<div class='ipsSideBlock clearfix'>
<h3>{$this->lang->words['recentposts_title']}</h3>
<ul class='ipsList_withminiphoto'>
<foreach loop="posts:$recentPosts as $post"> //цикл
<li class='clearfix' style='word-break: break-word;'>
{parse template="userSmallPhoto" group="global" params="$post"}
//....
//То, что дальше не пишу, остальное там корректно отрабатывает
Получается следующее:
Аватар игнорируется, выводится дефолтный, ссылка на профиль не создается.
В userSmallPhoto алгоритм уходит в else {IPSMember::buildNoPhoto(0, 'mini' )} и дальше не идет.
Решил после этого попробовать скопировать код из userSmallPhoto и вставить его в recentPosts с некоторыми модификациями в переменных. $member был заменен на $post, member_id на last_poster_id.
Есть IPB 3.4.5 и шаблон Velvet. В этом шаблоне сообщения отображаются с выводом миниатюр аватара ответившего.
Устанавливаю хук recentPosts (Sidebar). Сам хук в прикреплении.
hookRecentPostsSidebar_2203.xml
Сам хук работает, все отлично. Но он не подразумевает вывод миниатюры.
Поэтому первым же делом решаю воспользоваться текущим решением имеющегося хука Recent Topics.
В шаблоне hookRecentTopics имеется следующий код:
<if test="recenttopics:|:is_array( $topics ) && count( $topics )"> <div class='ipsSideBlock clearfix'> <h3>{$this->lang->words['recently_added_topics']}</h3> <div class='_sbcollapsable'> <ul class='ipsList_withminiphoto'> <foreach loop="topics_hook:$topics as $r"> <li class='clearfix'> {parse template="userSmallPhoto" group="global" params="$r"} <div class='list_content'> <strong><a href="{parse url="showtopic={$r['tid']}" base="public" template="showtopic" seotitle="{$r['title_seo']}"}" rel='bookmark' class='ipsType_small' title='{parse expression="strip_tags($r['topic_title'])"} {$this->lang->words['topic_started_on']} {parse date="$r['start_date']" format="LONG"}'>{$r['topic_title']}</a></strong> <p class='desc ipsType_smaller'> <if test="$r['members_display_name']">{parse template="userHoverCard" group="global" params="$r"}<else />{$this->settings['guest_name_pre']}{$r['starter_name']}{$this->settings['guest_name_suf']}</if> - {parse date="$r['start_date']" format="short"} </p> </div> </li> </foreach> </ul> </div> </div> </if><foreach loop="topics_hook:$topics as $r"> запускает цикл, как я понимаю, и передает его параметры в $r для запуска userSmallPhoto.
{parse template="userSmallPhoto" group="global" params="$r"}
userSmallPhoto рисует саму картинку и делает ссылку на профиль. Имеет следующий код:
<if test="linkAvatarOpen:|:$member['member_id'] && ( $this->memberData['g_is_supmod'] || ($this->memberData['g_mem_info'] && ! IPSMember::isInactive($member) ) )"> <a href='{parse url="showuser={$member['member_id']}" template="showuser" seotitle="{$member['members_seo_name']}" base="public"}' class='ipsUserPhotoLink left'> <else /> <div class='left'> </if> <if test="hasphoto:|:$member['member_id']"> <img src='{$member['pp_small_photo']}' alt='<if test="hasAlt:|:$member['alt']">{$member['alt']}<else />{$this->lang->words['photo']}</if>' class='ipsUserPhoto <if test="hasCustomClass:|:empty($member['_customClass'])">ipsUserPhoto_mini<else />{$member['_customClass']}</if>' /> <else /> {IPSMember::buildNoPhoto(0, 'mini' )} </if> <if test="linkAvatarClose:|:$member['member_id'] && ( $this->memberData['g_is_supmod'] || ($this->memberData['g_mem_info'] && ! IPSMember::isInactive($member) ) )"> </a> <else /> </div> </if>Пытаюсь аналогичным образом вызвать userSmallPhoto для recentPosts.
Код у recentPosts получается вот такой:
<if test="hasRecentPosts:|:is_array($recentPosts) && count($recentPosts)"> <div class='ipsSideBlock clearfix'> <h3>{$this->lang->words['recentposts_title']}</h3> <ul class='ipsList_withminiphoto'> <foreach loop="posts:$recentPosts as $post"> //цикл <li class='clearfix' style='word-break: break-word;'> {parse template="userSmallPhoto" group="global" params="$post"} //.... //То, что дальше не пишу, остальное там корректно отрабатываетПолучается следующее:
Аватар игнорируется, выводится дефолтный, ссылка на профиль не создается.
В userSmallPhoto алгоритм уходит в else {IPSMember::buildNoPhoto(0, 'mini' )} и дальше не идет.
Решил после этого попробовать скопировать код из userSmallPhoto и вставить его в recentPosts с некоторыми модификациями в переменных. $member был заменен на $post, member_id на last_poster_id.
Получилось следующее:
<if test="hasRecentPosts:|:is_array($recentPosts) && count($recentPosts)"> <div class='ipsSideBlock clearfix'> <h3>{$this->lang->words['recentposts_title']}</h3> <ul class='ipsList_withminiphoto'> <foreach loop="posts:$recentPosts as $post"> <li class='clearfix' style='word-break: break-word;'> <if test="linkAvatarOpen:|:$post['last_poster_id'] && ( $this->memberData['g_is_supmod'] || ($this->memberData['g_mem_info'] && ! IPSMember::isInactive($post) ) )"> <a href='{parse url="showuser={$post['last_poster_id']}" template="showuser" base="public"}' class='ipsUserPhotoLink left'> <else /> <div class='left'> </if> <if test="hasphoto:|:$post['last_poster_id']"> <img src='{$post['pp_small_photo']}' alt='<if test="hasAlt:|:$post['alt']">{$post['alt']}<else />{$this->lang->words['photo']}</if>' class='ipsUserPhoto <if test="hasCustomClass:|:empty($post['_customClass'])">ipsUserPhoto_mini<else />{$post['_customClass']}</if>' /> <else /> {IPSMember::buildNoPhoto(0, 'mini' )} </if> <if test="linkAvatarClose:|:$post['last_poster_id'] && ( $this->memberData['g_is_supmod'] || ($this->memberData['g_mem_info'] && ! IPSMember::isInactive($post) ) )"> </a> <else /> </div> </if>На этот раз ссылка на профиль создалась и скрипт прошел условный блок дальше. Но img src="" и картинка не грузится.
Очевидно, что $post['pp_small_photo'] нельзя вот так подставлять. Но как сделать не знаю, не получается.
Мне нужно, чтобы подставлялась pp_small_photo последнего ответившего в теме пользователя last_poster_id.
Надеюсь понятно объяснил суть проблемы :)