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

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

Recommended Posts

Добрый день, появилась необходимость воспользоваться виджетом похожий контент(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

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

Share this post


Link to post

вроде вот так вот получается всего 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>

 

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

Share this post


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

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

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

Есть шаблон userPhotoFromData

Share this post


Link to post

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

 

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

Share this post


Link to post

Есть шаблон userPhotoFromData

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

Share this post


Link to post

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

Share this post


Link to post

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

			$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. Но такого св-ва нет у тем.

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

Share this post


Link to post

 

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

 

 

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

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

 

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

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

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

Share this post


Link to post

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

 

	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;
	}
}

 

  • Upvote 1

Share this post


Link to post

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

Share this post


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

 

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

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

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

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

Share this post


Link to post

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

Share this post


Link to post

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

Share this post


Link to post

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