1. Получение данных из чужого контроллера. Например: как получить название или картинку из шаблона profile.tpl.php для, скажем, Maps. Другими словами как правильно сформировать запрос в Maps, чтобы отобразить какие-либо данные в профиле с привязкой к пользователю
В шаблоне данных нет, данные хранятся в базе. Извлекаются оттуда при помощи модели компонента.
Если нужно получить какие-то данные пользователя, нужно обратиться к модели компонента users, посмотреть файл \system\controllers\users\model.php и какие там есть методы. Например получение всех данных пользователя:
$user= cmsCore::getModel('users')->getUser($id);// $id - номер нужного пользователя
потом можно получить его аватар, никнейм или что угодно:
Не удаляются уведомления в которых есть экшн.
То есть если в уведомлении есть кнопка с надписью "Показать" или "Закрыть" — оно не удалится групповым удалением.
valenzetti,
Посмотрел:
Панель управления — Типы контента — свойства — Категория — Доступ.
Но там только права на добавление контента в эту категорию.
Я бы не глядя сделал хук с добавлением фильтра.
Но сначала посмотрим, может кто чего получше предложит.
как найти именно код который отвечает за этот блок
Правой кнопкой в элемент — посмотреть код (исследовать элемент) .
Смотрите, какой класс у элемента и поиском по тексту находите в файлах шаблона.
Например ссылки на контент пользователя — блок с классом content_counts
Ищем тоталкомандером и находим файл \templates\default\controllers\users\profile_view.tpl.php
Это не беда. Сейчас расскажу.
Итак, во-первых решаем, что нам нужно сделать с контентом. В вашем случае нужно просто добавить в модель сортировку по определенному полю.
Смотрим, где в модели компонента контент есть вызов подходящего события. Открываем файл \system\controllers\content\frontend.php и поиском ищем слово hook. Там хуков семь штук. Нас интересуют хуки, которые отправляют на обработку модель компонента. Находим два подходящих:
Вот это вот $this->model как раз и есть то, куда нам надо добавить сортировку.
Теперь создаем пустой файлик content_list_filter.php (или content_posts_list_filter.php, если достаточно сортировки только в одном типе контента) и помещаем его в \system\controllers\content\hooks\.
В файле \system\controllers\content\manifest.php в конец дописываем имя нашего хука:
В файле content_list_filter.php пишем что-нибудь типа этого:
<?php
class abcdefg extends cmsAction {
publicfunction run($data){
return$data;
}
}
Потом идем в админку — компоненты — управление событиями и видим, что доступны новые события. Обновить события в базе данных.
Возвращаемся на сайт и сразу видим ошибку:
Fatal error: Class 'onContentContentListFilter' not found in D:\OSPanel\domains\DEF821.tes\system\core\controller.php on line 519
Копируем onContentContentListFilter и вставляем имя класса вместо галиматьи abcdefg, что написали в начале (можно было, конечно подумать и написать правильное имя класса сразу, но мне так проще). Получается что-то типа этого:
<?php
class onContentContentListFilter extends cmsAction {
publicfunction run($data){
return$data;
}
}
Обновляем страницу, ошибка пропала. Что в хук прилетело ($data), то и улетело. Пока наш хук ничего не меняет.
Теперь надо добраться до модели, чтобы её дополнить сортировкой. Разворачиваем входящий архив:
list($ctype,$model)=$data;// Разворачиваем массив входящих данных
Теперь добавляем туда нужную сортировку:
$model->orderBy('i.date_last_modified','desc');// Добавляем сортировку по дате изменения в обратном порядке
Смотрим в отладке, что оно там выбирает:
SELECT i.*, u.nickname AS user_nickname, f.title AS folder_title
FROM cms_con_posts i
FORCE INDEXFORORDERBY(date_pub)
INNERJOIN cms_users AS u FORCE INDEX(PRIMARY)ON u.id = i.user_id
LEFTJOIN cms_content_folders AS f ON f.id = i.folder_id
Всё здорово! Есть сортировка по дате модификации:
ORDER BY i.date_last_modified desc
Но теперь таким образом будет отсортирован весь контент, а нам это не нужно.
Идем в админку и создаем набор с системным именем например modified.
Теперь в хуке все действия оборачиваем в условие
if(strpos($_SERVER['REQUEST_URI'],'modified')){// Если в ответе сервера есть индекс modified
И теперь наша сортировка будет добавляться только в наборе.
Вот получившийся файл content_list_filter.php :
<?php
class onContentContentListFilter extends cmsAction {
publicfunction run($data){
list($ctype,$model)=$data;// Разворачиваем массив входящих данных
if(strpos($_SERVER['REQUEST_URI'],'modified')){// Если в ответе сервера есть индекс modified
$model->orderBy('i.date_last_modified','desc');// Добавляем сортировку по дате изменения в обратном порядке