Перейти к содержанию

список записей категории в записи


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

Как вывести внутри самой записи список записей из категории другой базы?

Почти похожее можно организовать блоком, выбрав там в плагинах Страница->Лента записи, и там дается выбор из какой категории выводить или из всех. Соответственно если применить такой метод то мне нужно будет уже внутри записи применять к этому блоку категорию из которой нужно вывести записи, что не возможно сделать, так как ни у кода {block='key'} нету дополнительных параметров, ни в шаблоне блока нельзя применять категорию. Как быть?

Хочу что-то типа:

Новость "Ccc" из категории "C1" находится в базе "C1", в ней нужно вывести список записей из категории "C2" базы "C2" и т.д. задать значение из какой категории будут выводиться эти записи нужно как-то кодом, внутри шаблона 'record', так как записей много метод вставки блока не подходит.

Думал что-то типа такого: $categories[$cat_name]->records ($cat_name задать из доп. поля записи) и через foreach клипать записи, но не знаю даже как вызвать массив с категориями базы 😅

Ссылка на комментарий
Поделиться на другие сайты

Подозреваю, что должна помочь конструкция вида:

{{$cats = \IPS\cms\Categories1::roots();}}

Но это не точно 🙂

Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, Respected сказал:

Подозреваю, что должна помочь конструкция вида:


{{$cats = \IPS\cms\Categories1::roots();}}

Но это не точно 🙂

не очень помогла конструкция, в ней вроде как только категории\субкатегории и кол-ва записей. Нужно просто вывести из заданной в переменной $cats категории список последних 5-10 записей

Ссылка на комментарий
Поделиться на другие сайты

Где находится код блока "Страница->Лента записи", в базе где-то или где?

Ссылка на комментарий
Поделиться на другие сайты

То есть имеется 3 категории:
- игры (id 1)

-обзоры (id 2)

-новости (id 3)

Надо вывести в категории ИГРЫ блок с новостями из категории ОБЗОРЫ, в категории ОБЗОРЫ вывести блок с новостями из категории НОВОСТИ
Так?

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, andros0789 сказал:

То есть имеется 3 категории:
- игры (id 1)

-обзоры (id 2)

-новости (id 3)

Надо вывести в категории ИГРЫ блок с новостями из категории ОБЗОРЫ, в категории ОБЗОРЫ вывести блок с новостями из категории НОВОСТИ
Так?

Исходя из твоего примера у меня так: База (Новости) имеет категорию (Новости игры мафия), База (Игры) имеет категорию (Игры) и в ней записи, например запись "Мафия" и уже в этой записи отображается список с записями из базы (Новости) из категории (Новости игры мафия)

Ссылка на комментарий
Поделиться на другие сайты

Не понял почему  $record->container()->_title нельзя ни с чем сравнить? {{if $record->container()->_title == '2'}} даже если $record->container()->_title будет равен 2 то все равно покажет if скажет что значения разные? wtf?

Ссылка на комментарий
Поделиться на другие сайты

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

Все работает внутри созданного шаблона блока "Лента записей" с пометкой "все категории" для базы из которой будем брать записи:

<!-- Проверяем есть ли записи - пустая ли переменная $records -->
{{if !empty( $records ) }}
<h3 class='ipsWidget_title ipsType_reset'>{$title}</h3>
<div class='ipsPad_half ipsWidget_inner'>
<ul class='ipsDataList ipsDataList_reducedSpacing ipsContained_container'>
<!-- Записываем путь до записи используя ID открытой базы -->
{{$me_lastnews = '\IPS\cms\Records'.\IPS\cms\Databases\Dispatcher::i()->databaseId;}}
<!-- Загружаем запись используя ID открытой записи-->
{{$me_lastnews = $me_lastnews::load(\IPS\cms\Databases\Dispatcher::i()->recordId);}}
<!-- В моем случае я получаю первое значение "Заголовок записи" из массива загруженной записи, по нему и буду искать категории нужных записей -->
{{$first = current($me_lastnews);}}
<!-- Перебираем массив всех записей -->
{{foreach $records as $record}}
<!-- Так как я не смог использовать имя категории записи на прямую (возможно из-за того, что используется protected класса), получаем доступ ко всем свойствам объектов массива со всеми записями -->
	{{$recordz = (array) $record;}}
<!-- Перебираем новый массив -->
		{{foreach $recordz as $recordzz}}
<!-- Ищем и выводим только те записи, которые имеют соответствие с $first - Заголовком открытой записи -->
		{{if $recordzz->name == $first.','}}
					<li class='ipsDataItem'>
						<div class='ipsDataItem_icon ipsPos_top'>
							{template="userPhoto" group="global" app="core" params="$record->author(), 'tiny'"}
						</div>
						<div class='ipsDataItem_main cWidgetComments'>
							<div class="ipsCommentCount ipsPos_right {{if ( $record->record_comments ) === 0}}ipsFaded{{endif}}" data-ipsTooltip title='{lang="num_replies" pluralize="$record->record_comments"}'>{expression="$record->record_comments"}</div>
							<div class='ipsType_break ipsContained'>
								<a href="{$record->url()->setQueryString( 'do', 'getLastComment' )}" title='{lang="view_this_cmsrecord" sprintf="\IPS\Member::loggedIn()->language()->addToStack( 'content_db_lang_sl_' . $record::$customDatabaseId, FALSE ), $record->_title"}' class='ipsDataItem_title'>{$record->_title}</a>
							</div>
							<p class='ipsType_reset ipsType_medium ipsType_blendLinks'>
								<span>{lang="byline_nodate" htmlsprintf="$record->author()->link()"}</span><br>
								<span class="ipsType_light">{datetime="$record->mapped('date')"}</span>
							</p>
						</div>
					</li>
		{{else}}
<!-- Если нет совпадений, записываем 0 в переменную -->
		{{$error = 0;}}
		{{endif}}
		{{endforeach}}
{{endforeach}}
<!-- Если в переменной 0 выводим текст -->
		{{if $error == 0}}<p>Новостей по записи {$first} не найдено</p>{{endif}}
{{endif}}

 

Таким образом блок выводит заданное кол-во записей из категории равной заголовку открытой записи. Можно искать и не только по заголовку, но у меня уже голова болит 😅

Приму и ваши варианты)

Ссылка на комментарий
Поделиться на другие сайты

{{$records = \IPS\cms\Records1::load( 1 );}}

Загружает 1 запись из базы данных, как загрузить все записи из базы данных?

И как узнать название текущей категории в которой я нахожусь? Думал про \IPS\Request::i(); но максимум что от туда можно взять это url на котором я нахожусь

Ссылка на комментарий
Поделиться на другие сайты

Немного поняв механику понял, что блок ограничивает количество заранее загруженных записей полем "Количество для отображения", т.е. он загружает столько записей в массив, сколько указано в этом поле.
Так же можно выполнить загрузку записей кодом {{$records = \IPS\cms\Records1::load( $id );}} - где $id - ид записи.
Получается для того, чтобы найти нужную мне запись придется осуществить цикл for который будет перебирать этот $id до тех пор, пока не будет найдена нужная запись, а сам цикл будет перебирать записи заданное количество раз, например равное количеству записей имеющихся в базе.
Так вот у меня теперь вопрос, если у меня в базе 100 или 1000 записей - не страшно. А если у меня в базе 100.000 записей, не повиснет ли страница от выполнения цикла 100.000 раз?

Ссылка на комментарий
Поделиться на другие сайты

Как выглядит URL адрес необходимой записи?

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Respected сказал:

Как выглядит URL адрес необходимой записи?

В одном варианте я ищу только 1 запись, URL имеет вид http://site.ru/films/all_films/nazvanie-filma-r100/ - для вывода в базе новостей,  что-то по типу "по этой категории новостей найден фильм такой-то" и вывожу найденную запись.

Во втором варианте я на странице записи этого фильма http://site.ru/films/all_films/nazvanie-filma-r100/ вывожу блок "последние новости фильма" где нужно перебрать все записи из базы новостей и найти нужные, там новости имеют и категории и под категории например: /news/horror/alt/nazvanie-novosti-r13/

Ссылка на комментарий
Поделиться на другие сайты

У тебя же во всех урлах присутствует ID записи. \IPS\Request::i()->id как раз будет применим для этих целей.

Ссылка на комментарий
Поделиться на другие сайты

8 минут назад, Respected сказал:

У тебя же во всех урлах присутствует ID записи. \IPS\Request::i()->id как раз будет применим для этих целей.

как мне найти нужные записи только по ID? В первом варианте я вывожу запись используя цикл который сравнивает заголовок записи с названием категории где нужно вывести эту запись. Во втором варианте я сравниваю заголовок записи в которой нужно вывести записи "последние новости фильма" с названиями категорий новостей и вывожу найденные записи.

Ссылка на комментарий
Поделиться на другие сайты

{{$id = \IPS\Request::i()->id;}}
{{$data = \IPS\Db::i()->select( '*', 'cms_custom_database_1', "primary_id_field={$id}" )->first();}}

 

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Respected сказал:

{{$id = \IPS\Request::i()->id;}}
{{$data = \IPS\Db::i()->select( '*', 'cms_custom_database_1', "primary_id_field={$id}" )->first();}}

 

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

Ссылка на комментарий
Поделиться на другие сайты

Что более затратно по ресурсам - загрузить 10.000 записей в массив и искать в нем искомую строку, или перебирать циклом 10.000 записей и искать совпадение строки?

Ссылка на комментарий
Поделиться на другие сайты

16 часов назад, Respected сказал:

{{$id = \IPS\Request::i()->id;}}
{{$data = \IPS\Db::i()->select( '*', 'cms_custom_database_1', "primary_id_field={$id}" )->first();}}

 

Как мне осуществить перебор ID которые находятся в primary_id_field?

т.е. получаю ID из primary_id_field первой строки таблицы cms_custom_database_1,  если он мне подходит, оставляю, если нет, получают ID уже из второй строки?

Ссылка на комментарий
Поделиться на другие сайты

Я не понимаю какая стоит задача. Вывести первые несколько записей из категории или что?

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, Respected сказал:

Я не понимаю какая стоит задача. Вывести первые несколько записей из категории или что?

Имеется 2 базы:

1 База - Название: "Фильмы" в этой базе записи с фильмами, у записи заголовок = названию фильма, например запись с заголовком "Titanik" - в этой записи нужно сделать блок внизу записи "Последние новости фильма" в котором вывести 1-5 последних записей из базы 2 нужной категории.

2 База - Название: "Новости" в этой базе находятся записи с новостями фильмов. У категорий этой базы заголовки = названию заголовка записей из базы 1. Например есть категория с заголовком "Titanik" в этой категории записи новостей относятся к фильму "Titanik".

Ссылка на комментарий
Поделиться на другие сайты

Я бы сделал новости без категорий, а выборку новостей делать по тегам. Фильмов существует миллионы, ты же не будешь для каждого фильма делать отдельную категорию.

У записей можно брать url таким образом: $record->record_dynamic_furl

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, Respected сказал:

Я бы сделал новости без категорий, а выборку новостей делать по тегам. Фильмов существует миллионы, ты же не будешь для каждого фильма делать отдельную категорию.

что-то с этими всеми кодами совсем забыл про существование тегов, надо попробовать

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, ZIKURIK сказал:

что-то с этими всеми кодами совсем забыл про существование тегов, надо попробовать

Самый оптимальный вариант в твоём случае.

Ну или создать дополнительное поле - связь с базой данных. И при добавлении новости указывать фильм в поле. Так у новости и фильма появится явная связь. 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...