Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Как работает 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

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.