Jump to content

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


vinegredz
 Share

Recommended Posts

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

 

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

 

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

 

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

 

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

 

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

Link to comment
Share on other sites

Допустим поле 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}}

  • Upvote 1
Link to comment
Share on other sites

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

 

Далее я хочу подключить шаблон 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, а не все внутренности записи.

Link to comment
Share on other sites

Далее я хочу подключить шаблон 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}}

Link to comment
Share on other sites

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

 

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

 

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

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

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

 

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

  • Upvote 1
Link to comment
Share on other sites

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

 

{{$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}

  • Upvote 1
Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
Share on other sites

Используйте другое значение для 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}

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...