Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
vinegredz

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

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

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

 

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

 

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

 

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

 

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

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

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

 

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

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Обычно с 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}

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

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

×
×
  • Создать...