Простой способ вывода записей с фильтром по кастомному полю - Дизайн и модификация Invision Power Board

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

 

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

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

  • 2 Страниц +
  • 1
  • 2

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

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

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

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

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

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

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

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

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

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

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

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Specialist
  • Сообщений: 688
  • Регистрация: 15-Октябрь 11
  • Репутация: 197
  • Откуда:Россия, Тула
  • IPB version:I have no IPB
 

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

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

1

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

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

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

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

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

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

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

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

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

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

0

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

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

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

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

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

1. Во всех записях нет информации из полей (даже _title)
2. Кажется выводится записей больше, чем есть на самом деле записей с нужным id в field_7, проверить не могу, так как см. п.1
3. Гости видят даже те записи, что на модерации

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Specialist
  • Сообщений: 688
  • Регистрация: 15-Октябрь 11
  • Репутация: 197
  • Откуда:Россия, Тула
  • IPB version:I have no IPB
 

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

Цитата

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

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

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

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

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

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

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

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

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

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

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

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

1

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

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

Отправлено 06 Февраль 2019 - 06:47

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

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

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

Отправлено 06 Февраль 2019 - 11:15

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

0

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

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

Отправлено 06 Февраль 2019 - 12:15

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

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

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

Отправлено 06 Февраль 2019 - 12:38

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

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

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

Отправлено 06 Февраль 2019 - 13:03

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

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


  • 2 Страниц +
  • 1
  • 2


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

  

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
При копировании материалов с сайта
прямая ссылка на источник обязательна