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

#1 26 октября 2021 в 12:57

Приветствую! Столкнулся с проблемой как тут, но в теме нужного мне решения не было. Суть вопроса заключается в том, что у меня есть виджет, который отображается в списке типа контента, в этом типе контента есть несколько категорий и записи. Каждая запись состоит в той или иной категории. Как получить, ну допустим переменную, содержащую категорию записи? 

#2 26 октября 2021 в 13:32

Примерно так

  1. <?php if($item['category_id'] > 1){ ?>
  2. <a href="<?php echo href_to($ctype['name'], $item['cat_slug']); ?>"><?php html($item['cat_title']); ?></a>
  3. <?php } ?>
#3 26 октября 2021 в 14:24

Приветствую! Столкнулся с проблемой как тут, но в теме нужного мне решения не было. Суть вопроса заключается в том, что у меня есть виджет, который отображается в списке типа контента, в этом типе контента есть несколько категорий и записи. Каждая запись состоит в той или иной категории. Как получить, ну допустим переменную, содержащую категорию записи? 

Panda58dev

Надо бы внятнее писать. Таки не понятно, где вы хотите категорию вывести: в  списке записей типа контента или в виджете, "который отображается в списке типа контента", или и там и там?

… подобную путаницу вы уже создавали в этой теме
… в итоге, вместо решения, пошли за костылями

 

#4 26 октября 2021 в 16:40

Таки не понятно, где вы хотите категорию вывести: в  списке записей типа контента или в виджете, "который отображается в списке типа контента"

Олег Васильевич я

А есть разница? Прошу прощения, я просто ещё плохо вник в структуру данной CMS и доселе с чужим кодом почти не работал.Нужно данную информацию вывести в виджете.

#5 26 октября 2021 в 17:49

А есть разница?

Panda58dev

А есть))

Снова предполагаем (в моём случае — ради вас в последний раз):

1. Версия системы, которую вы используете — 2.14.3 (пожалуйста, указывайте при создании новой «проблемы»)

2. Виджет, в котором вам нужно вывести категорию — «Список контента» (см. просьбу в п.1)

3. Вам достаточно вывода основной категории записи (запись может находиться и в дополнительных при соответствующих настройках ТК)

------------------------------

Варианты развития:

1. Вам не важно, где появится категория, лишь бы она появилась

Ответ: никакие переменные вам не нужны; кодить тоже не нужно. Внимательно пройдитесь по опциям — вывод категории в инфобаре уже есть

2. Вам таки хочется повесить себе на шею файл при последующих обновлениях и вы не нашли лучшего способа, чем вывести категорию в другом месте

Ответ: редактируете соответствующий файл из лежащих в папке templates\modern\controllers\content\widgets\list\ или создаёте его клон и назначаете его виджету для вывода. В этом файле используете конструкцию, подобную той, что выше предлагал г-н Make Возможны варианты кода, но воспользуемся предложенным г-ном Маке:

  1. <?php
  2. /* Формируем ссылку на категорию либо на ТК, если запись находится в корневой категории */
  3. if($item['category_id'] > 1){ ?>
  4. <a href="<?php echo href_to($ctype['name'], $item['cat_slug']); ?>"><?php html($item['cat_title']); ?></a>
  5. <?php } else { ?>
  6. <a href="<?php echo href_to($ctype['name']); ?>"><?php html($ctype['title']); ?></a>
  7. <?php } ?>

Код можно существенно сократить (даже нужно, если будет использоваться несколько раз в одном файле), но в таком виде будет нагляднее.

 

#6 26 октября 2021 в 19:27

(в моём случае — ради вас в последний раз)

Олег Васильевич я

Исправлюсь, обещаю! 
Версия 2.14.3, но виджет на самом деле «Адреса». Проблема как раз заключается в том, что в этом модуле контент, который нужно выводить записан в переменную, в эту же переменную я хотел вставить название категории, но из примера Make я понял что (теоретически), это название можно получить из html($item['cat_title']), но на деле ничего не вышло. Пробовал кое-как адаптировать весь код — либо страница просто не загружается, либо вывода названия категории нет :(

#7 26 октября 2021 в 19:48

но виджет на самом деле «Адреса»

Panda58dev

нет такого виджета. Есть такое поле. Есть виджет Яндекс.карта, и там данные о точках получаются с помощью метода getContentItems github.com/instantsoft/icms2/blob/0695ea57e195b7a61a290dd7fa3e6e44e9483962/system/controllers/content/model.php#L1682

И в нем среди полученных данных нет имени категории.

#8 26 октября 2021 в 20:21

нет такого виджета. Есть такое поле.

Zau4man

А, прошу прощения, перепутал. Ну ладно, нет и нет, чего бубнить то. 

#9 26 октября 2021 в 23:27

Исправлюсь, обещаю! 

Panda58dev

Верю в светлое будущее, спасибо!

Судя по следующему предложению, путь к исправлению будет тернистым:

виджет на самом деле «Адреса». Проблема как раз заключается в том, что в этом модуле

Panda58dev

Говорим — "виджет", подразумеваем — "модуль", предлагаем догадаться, что речь о поле. 😀

#10 27 октября 2021 в 17:55

Говорим — "виджет", подразумеваем — "модуль", предлагаем догадаться, что речь о поле.

Олег Васильевич я

Как я понял, для работы виджета нужно поле (или наоборот), поэтому я в них и путаюсь.
Проштудировав отечественную поисковую систему, нашёл метод getCategory($ctype_name, $item['category_id']), который вроде как должен название категории давать, осталось додуматься как сделать вызов, что бы всё работало. 

#11 27 октября 2021 в 19:15

метод getCategory($ctype_name, $item['category_id'])

Panda58dev

это даст +1 запрос к базе на каждый маркер. При нескольких десятках маркеров будет большая нагрузка. Нужно join'ить таблицу категорий к запросу получения списка маркеров.

#12 27 октября 2021 в 22:19

Нужно join'ить таблицу категорий к запросу получения списка маркеров.

Zau4man

Прошу прощения, а можно подробнее и с примерами кода, если возможно? Просто я и так кодер не шипко хороший, а в работе CMS и подавно сам вряд ли разберусь! 

#13 3 ноября 2021 в 11:51

Ну что, джентльмены, я более-менее освоился в терминологии, доволен как слон :)
По поводу вопроса — на ум приходит одно решение, сделать в коде (или в настройках виджета) что-то вроде алиасов для id категорий, но это как-то… Не универсально что-ли? У кого-нибудь ещё есть предложения?
Из информации, которую имею:
Массив $items формируется посредством метода:

  1. $content_model->filterNotNull($pole)->getContentItems($ctype_name);

$content_model в свою очередь формируется через статику:

  1. cmsCore::getModel('content');

Может быть эта информация даст что-то 🤷‍♂️

Добавлено спустя 19 часов

Ну я нагуглил, по идеи, то что мне нужно может делать метод cmsModel->getCategoriesTree(), он делает такой запрос к БД:

  1. SELECT i.*
  2. FROM inst_con_news_cats i
  3. WHERE (i.is_hidden IS NULL) AND (i.parent_id > '0')
  4. ORDER BY i.ns_left
  5. LIMIT 1000

Но так же есть метод cmsModel->getCategory(), она, как я понял, принимает два параметра и что-то отдаёт, а что — не ясно.

 Олег Васильевич я, можете как то описать эти методы? 

Добавлено спустя 18 часов

Проблема решена, всё решалось одной строчкой: 

  1. $category = $content_model->getCategory($ctype_name, $item['category_id']);

$ctype_name в свою очередь получается так:

  1. $ctype_name = $this->request->get('ctype_name');

Благодарю всех за помощь! 

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.