Приветствую! Столкнулся с проблемой как тут, но в теме нужного мне решения не было. Суть вопроса заключается в том, что у меня есть виджет, который отображается в списке типа контента, в этом типе контента есть несколько категорий и записи. Каждая запись состоит в той или иной категории. Как получить, ну допустим переменную, содержащую категорию записи?
Примерно так
<?php if($item['category_id'] > 1){ ?> <a href="<?php echo href_to($ctype['name'], $item['cat_slug']); ?>"><?php html($item['cat_title']); ?></a> <?php } ?>
Приветствую! Столкнулся с проблемой как тут, но в теме нужного мне решения не было. Суть вопроса заключается в том, что у меня есть виджет, который отображается в списке типа контента, в этом типе контента есть несколько категорий и записи. Каждая запись состоит в той или иной категории. Как получить, ну допустим переменную, содержащую категорию записи?
Надо бы внятнее писать. Таки не понятно, где вы хотите категорию вывести: в списке записей типа контента или в виджете, "который отображается в списке типа контента", или и там и там?
Таки не понятно, где вы хотите категорию вывести: в списке записей типа контента или в виджете, "который отображается в списке типа контента"
А есть разница? Прошу прощения, я просто ещё плохо вник в структуру данной CMS и доселе с чужим кодом почти не работал.Нужно данную информацию вывести в виджете.
А есть разница?
А есть))
Снова предполагаем (в моём случае — ради вас в последний раз):
1. Версия системы, которую вы используете — 2.14.3 (пожалуйста, указывайте при создании новой «проблемы»)
2. Виджет, в котором вам нужно вывести категорию — «Список контента» (см. просьбу в п.1)
3. Вам достаточно вывода основной категории записи (запись может находиться и в дополнительных при соответствующих настройках ТК)
------------------------------
Варианты развития:
1. Вам не важно, где появится категория, лишь бы она появилась
Ответ: никакие переменные вам не нужны; кодить тоже не нужно. Внимательно пройдитесь по опциям — вывод категории в инфобаре уже есть
2. Вам таки хочется повесить себе на шею файл при последующих обновлениях и вы не нашли лучшего способа, чем вывести категорию в другом месте
Ответ: редактируете соответствующий файл из лежащих в папке templates\modern\controllers\content\widgets\list\ или создаёте его клон и назначаете его виджету для вывода. В этом файле используете конструкцию, подобную той, что выше предлагал г-н Make Возможны варианты кода, но воспользуемся предложенным г-ном Маке:
<?php /* Формируем ссылку на категорию либо на ТК, если запись находится в корневой категории */ if($item['category_id'] > 1){ ?> <a href="<?php echo href_to($ctype['name'], $item['cat_slug']); ?>"><?php html($item['cat_title']); ?></a> <?php } else { ?> <a href="<?php echo href_to($ctype['name']); ?>"><?php html($ctype['title']); ?></a> <?php } ?>
Код можно существенно сократить (даже нужно, если будет использоваться несколько раз в одном файле), но в таком виде будет нагляднее.
(в моём случае — ради вас в последний раз)
Исправлюсь, обещаю!
Версия 2.14.3, но виджет на самом деле «Адреса». Проблема как раз заключается в том, что в этом модуле контент, который нужно выводить записан в переменную, в эту же переменную я хотел вставить название категории, но из примера Make я понял что (теоретически), это название можно получить из html($item['cat_title']), но на деле ничего не вышло. Пробовал кое-как адаптировать весь код — либо страница просто не загружается, либо вывода названия категории нет :(
но виджет на самом деле «Адреса»
нет такого виджета. Есть такое поле. Есть виджет Яндекс.карта, и там данные о точках получаются с помощью метода getContentItems github.com/instantsoft/icms2/blob/0695ea57e195b7a61a290dd7fa3e6e44e9483962/system/controllers/content/model.php#L1682
И в нем среди полученных данных нет имени категории.
нет такого виджета. Есть такое поле.
А, прошу прощения, перепутал. Ну ладно, нет и нет, чего бубнить то.
Исправлюсь, обещаю!
Верю в светлое будущее, спасибо!
Судя по следующему предложению, путь к исправлению будет тернистым:
виджет на самом деле «Адреса». Проблема как раз заключается в том, что в этом модуле
Говорим — "виджет", подразумеваем — "модуль", предлагаем догадаться, что речь о поле. 😀
Говорим — "виджет", подразумеваем — "модуль", предлагаем догадаться, что речь о поле.
Как я понял, для работы виджета нужно поле (или наоборот), поэтому я в них и путаюсь.
Проштудировав отечественную поисковую систему, нашёл метод getCategory($ctype_name, $item['category_id']), который вроде как должен название категории давать, осталось додуматься как сделать вызов, что бы всё работало.
метод getCategory($ctype_name, $item['category_id'])
это даст +1 запрос к базе на каждый маркер. При нескольких десятках маркеров будет большая нагрузка. Нужно join'ить таблицу категорий к запросу получения списка маркеров.
Нужно join'ить таблицу категорий к запросу получения списка маркеров.
Прошу прощения, а можно подробнее и с примерами кода, если возможно? Просто я и так кодер не шипко хороший, а в работе CMS и подавно сам вряд ли разберусь!
Ну что, джентльмены, я более-менее освоился в терминологии, доволен как слон :)
По поводу вопроса — на ум приходит одно решение, сделать в коде (или в настройках виджета) что-то вроде алиасов для id категорий, но это как-то… Не универсально что-ли? У кого-нибудь ещё есть предложения?
Из информации, которую имею:
Массив $items формируется посредством метода:
$content_model->filterNotNull($pole)->getContentItems($ctype_name);
$content_model в свою очередь формируется через статику:
cmsCore::getModel('content');
Может быть эта информация даст что-то 🤷♂️
Ну я нагуглил, по идеи, то что мне нужно может делать метод cmsModel->getCategoriesTree(), он делает такой запрос к БД:
SELECT i.* FROM inst_con_news_cats i WHERE (i.is_hidden IS NULL) AND (i.parent_id > '0') ORDER BY i.ns_left LIMIT 1000
Но так же есть метод cmsModel->getCategory(), она, как я понял, принимает два параметра и что-то отдаёт, а что — не ясно.
Олег Васильевич я, можете как то описать эти методы?
Проблема решена, всё решалось одной строчкой:
$category = $content_model->getCategory($ctype_name, $item['category_id']);
$ctype_name в свою очередь получается так:
$ctype_name = $this->request->get('ctype_name');
Благодарю всех за помощь!