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

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

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

 

	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

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

Share this post


Link to post

Ковырял исходники 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 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...