Jump to content

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


vinegredz
 Share

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 базе данных между записями, которые отображаются и не отображаются на странице Фильма, но их там.

 

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

 

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

Link to comment
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;
}

Link to comment
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

) );

 

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

Link to comment
Share on other sites

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

 

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

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...