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

Как работает getReciprocalItems()?

Recommended Posts

Здравствуйте.

 

Есть такой загадочный для меня блок в шаблоне record в любой базе данных приложения CMS:

 

{{if $records = $record->getReciprocalItems()}}

{{foreach $records as $fieldId => $items}}

 

{{endforeach}}

{{endif}}

 

По умолчанию этот блок выводит записи из других баз данных, которые имеют поле типа "Database Relationship". Проблема в том, что в моем случае это срабатывает не всегда.

 

Что у меня есть:

 

1. База данных Актеры и поле типа "Database Relationship" с названием Films.

2. База данных Фильмы и поле типа "Database Relationship" с название Actor.

 

Во всех случаях в настройках полей я включил Cross link records.

 

Дальше я ожидаю, что на странице Актера будут выводиться фильмы из поля Films, а на странице Фильма будут выводиться актеры из поля Actor.

 

Это происходит, но не всегда, а я не могу понять в чем разница.

 

Я искал отличия в MYSQL базе данных между записями, которые отображаются и не отображаются на странице Фильма, но их там.

 

Возможно, информация о связи в другой таблице, но ее я тоже не нашел. Короче, как сделать так, чтобы все работало предсказуемо, а не через раз?

 

Спасибо за объяснения.

Share this post


Link to post
Share on other sites

Вот сама функция, как работает можете посмотреть своими глазами.

Принцип работы примерно такой как вы описали.

 

	public function getReciprocalItems()
{
	/* Check to see if any fields are linking to this database in this easy to use method wot I writted myself */
	if ( \IPS\cms\Databases::hasReciprocalLinking( static::database()->_id ) )
	{
		$return = array();
		/* Oh that's just lovely then. Lets be a good fellow and fetch the items then! */
		foreach( \IPS\Db::i()->select( '*', 'cms_database_fields_reciprocal_map', array( 'map_foreign_database_id=? and map_foreign_item_id=?', static::database()->_id, $this->primary_id_field ) ) as $record )
		{
			try
			{
				$recordClass = 'IPS\cms\Records' . $record['map_origin_database_id'];
				$return[ $record['map_field_id'] ][] = $recordClass::load( $record['map_origin_item_id'] );
			}
			catch ( \Exception $ex ) { }
		}

		/* Has something gone all kinds of wonky? */
		if ( ! count( $return ) )
		{
			return FALSE;
		}

		return $return;
	}

	return FALSE;
}

Share this post


Link to post
Share on other sites

ага, значит это все таки отдельная таблица cms_database_fields_reciprocal_map. Спасибо!

Share this post


Link to post
Share on other sites

Ковырял исходники applications\cms\extensions\core\Queue\RebuildReciprocalMaps.php

 

Нашел там код, который может создавать запись в базе данных. Это всё чудом работает. Прикладываю как решение для тех, кто пойдет после меня:

 

\IPS\Db::i()->insert( 'cms_database_fields_reciprocal_map', array(

'map_origin_database_id' => 2,

'map_foreign_database_id' => 3,

'map_origin_item_id' => $content->_id,

'map_foreign_item_id' => $content->customFieldDisplayByKey('city'),

'map_field_id' => 7

) );

 

Запускал код сразу после создания новой записи.

Share this post


Link to post
Share on other sites

Нашел там код, который может создавать запись в базе данных. Это всё чудом работает. Прикладываю как решение для тех, кто пойдет после меня:

 

Подобный код выполняется при создании/редактировании статьи

Share this post


Link to post
Share on other sites

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