Перейти к публикации
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.

Изменения/оптимизация виджета 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/

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

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

Сейчас на странице 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.