vinegredz Posted January 23, 2019 Share Posted January 23, 2019 Здравствуйте. Есть такой загадочный для меня блок в шаблоне 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 More sharing options...
siv1987 Posted January 23, 2019 Share Posted January 23, 2019 Вот сама функция, как работает можете посмотреть своими глазами. Принцип работы примерно такой как вы описали. 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 More sharing options...
vinegredz Posted January 23, 2019 Author Share Posted January 23, 2019 ага, значит это все таки отдельная таблица cms_database_fields_reciprocal_map. Спасибо! Link to comment Share on other sites More sharing options...
vinegredz Posted January 23, 2019 Author Share Posted January 23, 2019 Ковырял исходники 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 More sharing options...
newbie Posted January 24, 2019 Share Posted January 24, 2019 Нашел там код, который может создавать запись в базе данных. Это всё чудом работает. Прикладываю как решение для тех, кто пойдет после меня: Подобный код выполняется при создании/редактировании статьи Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now