Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
Armankessilon

Модификация recentPosts (добавление миниатюры) - 3.4.5

Recommended Posts

Есть 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"}
//....
//То, что дальше не пишу, остальное там корректно отрабатывает

Получается следующее:

7R1finr.jpg

 

Аватар игнорируется, выводится дефолтный, ссылка на профиль не создается.

В 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>

2Q7BxP4.jpg

На этот раз ссылка на профиль создалась и скрипт прошел условный блок дальше. Но img src="" и картинка не грузится.

Очевидно, что $post['pp_small_photo'] нельзя вот так подставлять. Но как сделать не знаю, не получается.

Мне нужно, чтобы подставлялась pp_small_photo последнего ответившего в теме пользователя last_poster_id.

 

Надеюсь понятно объяснил суть проблемы :)

Share this post


Link to post
Share on other sites

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

 

По поводу аватара. Если не ошибаюсь (поправьте меня если я не прав, ибо нет возможности проверить) метод buildDisplayData как раз генерирует аватар. В хуке имеется такой код

 

        // grab data for avatars
           if($this->settings['hsc_rp_start'])
           {
               $t['starterData'] = IPSMember::buildDisplayData($t['starter_id']);
           }
           if($this->settings['hsc_rp_last'])
           {
               $t['lastPosterData'] = IPSMember::buildDisplayData($t['last_poster_id']);

           }

Т.е. нужно включить соответствующие настройки и использовать ключи lastPosterData или starterData в нужном месте шаблона. Проблема только в том что в данном случае этот метод будет генерировать отдельно запрос в бд для каждого пользователя. Если там пять тем +5 запросов.

Share this post


Link to post
Share on other sites

А можно подробней как именно использовать lastPosterData? Проблема в том, что я не знаю как это сделать правильно :).

Я пытался как-то заюзать этот кусок кода, но у меня не получилось)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Включено:

Отображать Автора

Отображать последнее сообщение.

Share this post


Link to post
Share on other sites

Нет, не получилось.

<img src='{$post['lastPosterData']}' alt='<if test="hasAlt:|:$post['alt']">

В src подставило Array.

Я так понимаю, это массив всех данных по пользователю. И нужно сначала прочитать этот массив и выдернуть из него отдельное поле с линком на картинку.

Не подскажете как это сделать?

Share this post


Link to post
Share on other sites

Спасибо большое, помогло!

Ту тему видел, там все свелось к тому, что надо в сам скрипт добавить строчку. В моей версии скрипта эта команда уже выполняется и добавление этой строчки приводило к дублированию записей. Тему старую не стал поднимать, чтобы не создавать путаницу (в первом сообщении написано одно, я прошу другое :)).

Share this post


Link to post
Share on other sites

newbie

Спасибо большое! Тоже сам не смог сделать, хорошо, что эту тему увидел :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...