Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
avgaz

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

 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение
а какой при этом функционал урезан?

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

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

×
×
  • Создать...