Перейти к содержимому
Русский язык для Invision Community 5

Простой способ вывода записей с фильтром по кастомному полю

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

 

Ранее интересовался как выводить связанные записи. Выяснилось, что этот способ не подойдет, потому что для ранее созданных записей (до внесения настроек) нужно создавать заново заново, а у меня их очень много.

 

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

 

Ситуация такая же:

 

1. База данных Актеры (1) и поле типа "Database Relationship" с названием Films.

2. База данных Фильмы (2) и поле типа "Database Relationship" с названием Actor.

3. Знаю как вывести ID записи {$record->_id} в шаблоне record

 

Теперь нужно вывести на странице Актера фильмы в которых он участвовал. Логика такая:

 

1. Получить список записей (фильмов) из базы данных 2

2. Отсортировать те, у которых value в поле Actor содержит _id записи актера

3. Вывести результаты через шаблон record_row

 

Пытался адаптировать шаблон RecordFeed, но он сложнее те знаний, что у меня есть. Напрямую его перенести в шаблон record не получится.

Пытался адаптировать конструкцию, которая вывод количество записей в конкретной базе данных:

 

{expression="\IPS\Db::i()->select( 'COUNT(*)', 'cms_custom_database_2', array( 'record_future_date=? and record_approved=?', 0, 1 ) )->first()"}

 

Но методом тыка не получилось, а найти описание зачем нужный каждый элемент не получилось.

 

Шаманил с шаблоном:

 

{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}

 

Но понял, что в шаблоне record просто нет самой главной переменной $table, а как ее объявить не разобрался.

 

Кто может подсказать универсальную конструкцию, которая позволит вывести записи из базы данных CMS с фильтром с понятной мне логикой работы if/else в любом месте сайта, без привязке к объявляемым переменным.

 

IPB 4.3.6

 

Спасибо за любые подсказки, которые сэкономят время)

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

Допустим поле field_3, в таблице фильмов (cms_custom_database_2) у Вас содержит ID актёров, через запятую. Тогда можно сделать так:

{{$films = \IPS\Db::i()->select( '*', 'cms_custom_database_2', "FIND_IN_SET( {$record->_id}, field_3 )" );}}

{{if count( $films )}}
<ol class='ipsDataList ipsDataList_zebra ipsClear'>
{{foreach $films as $film}}
<li class='ipsDataItem'>
	{$film['field_1']}
</li>
{{endforeach}}
</ol>
{{endif}}

  • Автор

Спасибо это работает и на страницу действительно выводится часть информации из записи об Актере.

 

Далее я хочу подключить шаблон recordRow, который используется у меня в базе данных Актеров. Вот мой порядок размышлений:

 

// Записываем в переменную $faces массив, внутри которого ID актеров из поля ID7
{{$faces = \IPS\Db::i()->select( '*', 'cms_custom_database_2', "FIND_IN_SET( {$record->_id}, field_7 )" );}}

// Если поле ID7 не пустое, то...
{{if count( $faces )}}

 <ol class='faceMasonry'>
  // Запускаем цикл, который перебирает массив. Источник $faces. Ключ записи в $fieldId, значения в $items
  {{foreach $faces as $fieldId => $items}}
  // Подключаем шаблон и добавляем туда источник данных $items
  {template="recordRow" group="face_listing" location="database" app="cms" themeClass="IPS\cms\Theme" params="null, null, $items"}
  {{endforeach}}
</ol>

{{else}} // Если поле ID7 пустое, то...

{{endif}}

 

Я так же понимаю, что не просто так мы обращаемся к данным не через customFieldDisplayByKey('platform_id'), а $items['field_34'], но почему?

 

Такое ощущение, что в массиве $faces хранятся только данные из поля ID7, а не все внутренности записи.

Далее я хочу подключить шаблон recordRow,

Смотрим параметры шаблона

$table, $headers, $rows

При этом $rows - массив объектов

 

{{$faces = iterator_to_array(new \IPS\Patterns\ActiveRecordIterator(\IPS\Db::i()->select( '*', 'cms_custom_database_2', "FIND_IN_SET( $record->_id, field_7 )" ), 'IPS\cms\Records2'));}}
{{if count( $faces )}}
 <ol class='faceMasonry'>
  {template="recordRow" group="face_listing" location="database" app="cms" themeClass="IPS\cms\Theme" params="null, null, $faces"}
</ol>
{{else}} // Если поле ID7 пустое, то...

{{endif}}

  • Автор

Видимо только $faces не хватает.

 

Какие-то записи выгружается, но:

 

1. Во всех записях нет информации из полей (даже _title)

2. Кажется выводится записей больше, чем есть на самом деле записей с нужным id в field_7, проверить не могу, так как см. п.1

3. Гости видят даже те записи, что на модерации

 

Еще пытался создать пагинацию, для которой нужна $table (эта переменная также нужна и для recordRow). Как ее объявить? Из всего кода, что есть в стандартном шаблоне темы (не шаблон базы данных, а именно темы), я не нашел примера, как эту переменную объявить. Подразумевается, что она уже просто есть.

1. Во всех записях нет информации из полей (даже _title)

2. Кажется выводится записей больше, чем есть на самом деле записей с нужным id в field_7, проверить не могу, так как см. п.1

Поправил пост

3. Гости видят даже те записи, что на модерации
Какие даны данные в "where", такие записи и выводятся.

Еще пытался создать пагинацию, для которой нужна $table

Пагинация не зависит от таблицы

(эта переменная также нужна и для recordRow)

Зачем? В указанном шаблоне она используется в 2 местах и особой роли не играет.

  • Автор

Пагинация нужна, потому что предоставленный вам пример кода (который работает!) я использую в шаблоне record. Там нет пагинации. А если на странице 100 записей, то все виснуть страшно начинает.

Пагинация нужна

Нужна, делайте. В IPS4 это не очень сложно - есть универсальный шаблон, есть куча образцов для создания запроса к базе с указанием смещения и лимита... И есть у меня ощущение, что Вы сейчас не подсказок хотите, а готовый, не самый простой блок, на халяву выпрашиваете.

  • Автор

Обычно с newbie работаю, но он сейчас занят. Вот и ищу поддержки здесь)

 

Dmitriy427 помогли значительно, благодарю.

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

 

{{$table = new \IPS\Helpers\Table\Content('IPS\cms\Records2', $record->url(), array(array(\IPS\Db::i()->findInSet('field_7', array($record->_id)))));}}
{{$table->rowsTemplate = array(\IPS\cms\Theme::i()->getTemplate('face_listing', 'cms', 'database'), 'recordRow');}}
{$table|raw}

  • 2 недели спустя...
  • Автор

Спасибо за готовый код. Таблица действительно формируется и фильтрация действительно корректная, но не работает пагинация (хотя она тоже выводится). Жмешь на любую страницу кроме первой и загружается всё равно первая страница. На другие перейти не возможно.

Используйте другое значение для paginationKey

{{$table = new \IPS\Helpers\Table\Content('IPS\cms\Records2', $record->url(), array(array(\IPS\Db::i()->findInSet('field_7', array($record->_id)))));}}
{{$table->rowsTemplate = array(\IPS\cms\Theme::i()->getTemplate('face_listing', 'cms', 'database'), 'recordRow');}}
{{$table->paginationKey = 'fpage';}}
{$table|raw}

  • Автор

Теперь страницы переключаются, но все, кроме первой, пустые.

Если обновить 2-ю страницу (F5), записи есть?

  • Автор

Нет, записи не появляются.

В шаблоне никаких условий нет?

Можете дать ссылку на страницу?

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.