Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

Есть 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.

 

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

Рекомендованные сообщения

Опубликовано:

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

 

По поводу аватара. Если не ошибаюсь (поправьте меня если я не прав, ибо нет возможности проверить) метод 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 запросов.

Опубликовано:
  • Автор

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

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

Опубликовано:

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

Опубликовано:
  • Автор

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

Включено:

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

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

Опубликовано:

$post['starterData']

$post['lastPosterData']

Опубликовано:
  • Автор

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

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

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

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

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

Опубликовано:
  • Автор

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

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

  • 1 год спустя...
Опубликовано:

newbie

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

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.