Как работает getReciprocalItems()? - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

СвернутьПрикрепленные теги

Теги не найдены

Страница 1 из 1

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

#1 Пользователь не на сайте   vinegredz ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 17-Январь 14
  • Репутация: 3
  • IPB version:3.4.x
 

Отправлено 23 Январь 2019 - 12:17

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

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

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

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

#2 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 9 446
  • Регистрация: 20-Март 09
  • Репутация: 2 545
  • IPB version:3.1.x
 

Отправлено 23 Январь 2019 - 15:09

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

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

0

#3 Пользователь не на сайте   vinegredz ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 17-Январь 14
  • Репутация: 3
  • IPB version:3.4.x
 

Отправлено 23 Январь 2019 - 15:13

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

#4 Пользователь не на сайте   vinegredz ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 204
  • Регистрация: 17-Январь 14
  • Репутация: 3
  • IPB version:3.4.x
 

Отправлено 23 Январь 2019 - 17:31

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

#5 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 815
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 489
  • IPB version:I have no IPB
 

Отправлено 24 Январь 2019 - 09:36

Просмотреть сообщениеvinegredz сказал(а):

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


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

Сообщить об этой теме:


Страница 1 из 1


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2019 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна