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

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

Рекомендованные сообщения

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

 

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

 

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

 

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

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


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

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

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

 

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

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


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

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

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


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

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

) );

 

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

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


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

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

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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