Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

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

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

Изменения/оптимизация виджета relatedContent

Добрый день, появилась необходимость воспользоваться виджетом похожий контент(relatedContent) включив его, был просто в шоке виджет создает на 5 тем порядка 15 дополнительных запросов в БД, что по моему через чур много в ipb3 это было всего 3 запроса в БД.

Думаю как его оптимизировать и убрать лишние не нужные запросы

например убрав из шаблона relatedContent описание контента то есть вот это

{{if $content = $item->truncated()}}
				<div class='ipsType_richText ipsType_normal' data-ipsTruncate data-ipsTruncate-type="remove" data-ipsTruncate-size="2 lines">
					{$content|raw}
				</div>
			{{endif}}

Запросов уже становится не 15, а 10, далее убрав ссылку на автора $item->author() остается всего 5 запросов в БД, но соответственно только ссылка на похожую тему, тут возникает вопрос, как можно получить того же автора пусть без ссылки на профиль просто имя и например количество постов в теме и просмотров, раздел и тд вроде как переменная в шаблоне $similar в массиве должна содержать эти данные т.к они вроде как передаются из /system/Content/Controller.php из функции public function getSimilarContent

но вот как воспользоваться этими данными в шаблоне? или в целом как оптимизировать этот виджет?

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

  • Автор

вроде вот так вот получается всего 6 запросов в БД

<h3 class='ipsType_reset ipsWidget_title'>{lang="block_relatedContent"}</h3>
<div class='ipsPad_half ipsWidget_inner'>
<ul class='ipsDataList ipsDataList_reducedSpacing'>
{{foreach $similar as $item}}
	<li class='ipsDataItem'>
		<div class='ipsDataItem_icon'>
			<i class="fa fa-arrow-right ipsType_large"></i>
		</div>
		<div class='ipsDataItem_main'>
			<div class='ipsType_break ipsContained'><a href="{$item->url()}" title='{lang="view_this" sprintf="$item->mapped('title')"}' class='ipsTruncate ipsTruncate_line'>{$item->mapped('title')}</a></div>
			<span class='ipsType_light ipsType_medium'>От {template="userLinkFromData" group="global" app="core" params="$item->starter_id, $item->starter_name, $item->seo_last_name, TRUE"} , {datetime="$item->start_date"}</span><br>

		</div>
	</li>
{{endforeach}}
</ul>
</div>

 

можно ещё как то оптимизировать? и можно как то вывести фотку автора без доп запросов?

можно ещё как то оптимизировать?

Вряд ли. Ищется ведь весь похожий контент (темы, события календарей, изображения галереи) и проверяются права.

и можно как то вывести фотку автора без доп запросов?

Есть шаблон userPhotoFromData

  • Автор

Вряд ли. Ищется ведь весь похожий контент (темы, события календарей, изображения галереи) и проверяются права.

 

А если как то отключить и оставить только темы?

  • Автор

Есть шаблон userPhotoFromData

Дак туда нужно передать ссылку на фотку, а как я понял её нет в массиве $similar ??

Нужно смотреть что есть в этом массиве, если только ид автора - запросить данные одним запросом для всех.

А если как то отключить и оставить только темы?

			$where = array(
			array( '(' . \IPS\Db::i()->in( 'tag_text', $tags ) . ')' ),
			array( '!(tag_meta_app=? and tag_meta_area=? and tag_meta_id=?)', $class::$application, $class::$module, \IPS\Request::i()->id ),
			array( '(' . \IPS\Db::i()->findInSet( 'tag_perm_text', \IPS\Member::loggedIn()->groups ) . ' OR ' . 'tag_perm_text=? )', '*' ),
			array( 'tag_perm_visible=1' )
		);

заменить на

			$where = array(
			array( 'tag_meta_app=? and tag_meta_area=?', $class::$application, $class::$module ),
			array( '(' . \IPS\Db::i()->in( 'tag_text', $tags ) . ')' ),
			array( '!(tag_meta_app=? and tag_meta_area=? and tag_meta_id=?)', $class::$application, $class::$module, \IPS\Request::i()->id ),
			array( '(' . \IPS\Db::i()->findInSet( 'tag_perm_text', \IPS\Member::loggedIn()->groups ) . ' OR ' . 'tag_perm_text=? )', '*' ),
			array( 'tag_perm_visible=1' )
		);

Тогда искать будет темы для темы, календарные события для календарного события, изображения галереи для изображения галереи.

 

Дак туда нужно передать ссылку на фотку, а как я понял её нет в массиве $similar ??

Ну да.

У вас кстати используется $item->seo_last_name. Но такого св-ва нет у тем.

К тому же код адаптирован конкретно под темы.

  • Автор

 

Тогда искать будет темы для темы, календарные события для календарного события, изображения галереи для изображения галереи.

 

 

Но в таком случае количество запросов в бд остается прежним (( то есть если я теги не использую в галереи и в календаре смысла нет в вносить изменение?

Можно как то у уменьшить количество ещё, например у меня где используются теги туда есть доступ всем(гостям и тд) в принципе может нет смысла делать проверку прав доступа к этим тема? просто не могу понять как удалить эту проверку ((

 

У вас кстати используется $item->seo_last_name. Но такого св-ва нет у тем.

К тому же код адаптирован конкретно под темы.

Это я взял из массива который возвращает return $items;

Такой вариант посмотрите

 

	public function getSimilarContent( $limit = 5 )
{
	if( !isset( static::$contentModel ) )
	{
		return NULL;
	}

	try
	{
		$class = static::$contentModel;
		$item = $class::loadAndCheckPerms( \IPS\Request::i()->id );

		if( !$item instanceof \IPS\Content\Tags OR ( $item->tags() === NULL AND $item->prefix( FALSE ) === NULL ) )
		{
			return NULL;
		}

		/* Store tags in array, so that we can add a prefix if set */
		$tags = $item->tags() ?: array();
		$tags[] = $item->prefix( FALSE );

		$idColumn = $class::$databaseTable . "." . $class::$databasePrefix . $class::$databaseColumnId;

		/* Build the where clause */
		$where = array(
			array( "{$idColumn} !=?", \IPS\Request::i()->id ),
			array( "(tag_meta_app=? and tag_meta_area=? and tag_meta_id={$idColumn})", $class::$application, $class::$module ),
			array( '(' . \IPS\Db::i()->in( 'tag_text', $tags ) . ')' ),
			array( '(' . \IPS\Db::i()->findInSet( 'tag_perm_text', \IPS\Member::loggedIn()->groups ) . ' OR ' . 'tag_perm_text=? )', '*' ),
			array( 'tag_perm_visible=1' )
		);

		/* Allow the item to manipulate the query if needed */
		if( $item->similarContentFilter() )
		{
			$where = array_merge( $where, $item->similarContentFilter() );
		}

		$joins = array(
			array(
				'from'	=>	'core_tags',
				'where'	=> array( "tag_meta_id={$idColumn}" )
			),
			array(
				'from'	=>	'core_tags_perms',
				'where'	=> array( 'tag_perm_aai_lookup=tag_aai_lookup')
			)
		);			

		return iterator_to_array( $class::getItemsWithPermission( $where, NULL, $limit, 'read', \IPS\Content\Hideable::FILTER_AUTOMATIC, 0, NULL, TRUE, FALSE, FALSE, FALSE, $joins ) );
	}
	catch ( \Exception $e )
	{
		return NULL;
	}
}

 

  • Автор

Спасибо так всего 2 запроса в бд, а какой при этом функционал урезан? и не как нельзя это вынести в файл виджета relatedContent.php или отдельным дополнением, что бы при обновлении каждый раз не править файл Controller.php

а какой при этом функционал урезан?

 

Тогда искать будет темы для темы, календарные события для календарного события, изображения галереи для изображения галереи.

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

и не как нельзя это вынести в файл виджета relatedContent.php или отдельным дополнением, что бы при обновлении каждый раз не править файл Controller.php

Плагин написать

  • Автор

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

  • Автор

Спасибо большое. Объясните плиз для просвещения, этот плагин по сути просто создает хук файла с этой функцией, но почему сам виджет обращается к функции из этого файла? а не функции из Controller.php

  • 3 недели спустя...
  • Автор

на одном сайте увидел интересный виджет "последних тем" и "популярных тем" но в качестве изображение не аватарка пользователя, а изображение из темы www.otovarah.ru/forum/

Как такое реализовать для похожих тем с выводом изображения из темы?

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.