Ris

Ris

+657
Репутация
3771
Рейтинг
#1 Программистам: получение данных из контроллеров, шаблонов и т.д. 17 октября 2017 в 14:30

1. Получение данных из чужого контроллера. Например: как получить название или картинку из шаблона profile.tpl.php для, скажем, Maps. Другими словами как правильно сформировать запрос в Maps, чтобы отобразить какие-либо данные в профиле с привязкой к пользователю

iDrevniy
В шаблоне данных нет, данные хранятся в базе. Извлекаются оттуда при помощи модели компонента.
Если нужно получить какие-то данные пользователя, нужно обратиться к модели компонента users, посмотреть файл \system\controllers\users\model.php и какие там есть методы. Например получение всех данных пользователя:
  1. $user = cmsCore::getModel('users')->getUser($id); // $id - номер нужного пользователя
потом можно получить его аватар, никнейм или что угодно:
  1. $user_avatar = $user['avatar'];
  2. $user_nickname = $user['nickname'];
#2 [ЕСТЬ РЕШЕНИЕ] Неизвестный столбец 'i.target_controller' в 'where clause' 17 октября 2017 в 13:21
arianfinist,
Как-то Вы неровно обновились.
Добавьте колонку target_controller вручную.
  1. ALTER TABLE `cms_content_relations` ADD `target_controller` VARCHAR(32) NOT NULL DEFAULT 'content' AFTER `ordering`;
  2. ALTER TABLE `cms_content_relations` ADD INDEX(`target_controller`);
#3 Редактирование страницы 15 октября 2017 в 02:03

Остановился на словах "вступает в группу" и "регистрируется. Приветствуем!" в ленте активности. Где они находятся ?

@Ronex
В базе. Таблица cms_activity_types
#4 Принцип работы шаблона для мобильных устройств 12 октября 2017 в 08:22

Как можно сделать что бы через мобильные устройства шаблон и виджеты изменялись ?

Нико
На ПК показывать один виджет с одними настройками, а на мобильном — другой такой же виджет, но с другими настройками.
#5 [ЕСТЬ РЕШЕНИЕ] Тестирование компонента Форум 9 октября 2017 в 23:04
Денис Васильевич,


ru.icons8.com/icon/set/topic/all
joke
#6 Миграция с Wordpress на InstantCMS 2 9 октября 2017 в 18:23

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

alkokrolik
А зачем из них квадратные делать?
Пропишите в стилях вписывание картинки в рамку.
background-size: cover;
#7 Как убрать или добавить выпадающее меню в топ меню? 9 октября 2017 в 17:30

Проще говоря, у ребенка присвоен active класс, как его присвоить родителю, но так что бы только 1 родителю, а не всем у кого есть дети.

@RootGammer
Это легче на jquery сделать
$('.active').parent().addClass('active_ul');
#8 Не удаляются уведомления Админа 9 октября 2017 в 11:33
Не удаляются уведомления в которых есть экшн.
То есть если в уведомлении есть кнопка с надписью "Показать" или "Закрыть" — оно не удалится групповым удалением.
  1. public function deleteUserNotices($user_id){
  2.  
  3. $this->filterIsNull('actions')->filterEqual('user_id', $user_id);
  4.  
  5. return $this->deleteFiltered('cms_users_notices');
#9 Добавить сортировку по дате изменения контента 9 октября 2017 в 10:37

Хорошо бы, чтоб в выпадающем списке наборов добавилось.

Argus
В списке наборов галку "Публикация" поставьте.
#10 [ЕСТЬ РЕШЕНИЕ] Как добавить ещё задачи для ленты активности пользователя? 9 октября 2017 в 00:10
Нико,
А в таблицу cms_activity_types Вы ваши новые типы активности добавили?
#11 Как скрыть новости определенной категории из общей ленты новостей? 8 октября 2017 в 19:12
valenzetti,
Посмотрел:
Панель управления — Типы контента — свойства — Категория — Доступ.
Но там только права на добавление контента в эту категорию.
Я бы не глядя сделал хук с добавлением фильтра.
Но сначала посмотрим, может кто чего получше предложит. laugh
#12 Типо поля "список" с живым фильтром 7 октября 2017 в 17:05
@sleepery,
Панель управления — Компоненты — Капча reCAPTCHA — убрать галку активность.
#13 Типо поля "список" с живым фильтром 7 октября 2017 в 15:25

как найти именно код который отвечает за этот блок

@Sh4maH
Правой кнопкой в элемент — посмотреть код (исследовать элемент) .
Смотрите, какой класс у элемента и поиском по тексту находите в файлах шаблона.
Например ссылки на контент пользователя — блок с классом content_counts
Ищем тоталкомандером и находим файл \templates\default\controllers\users\profile_view.tpl.php
#14 Добавить сортировку по дате изменения контента 7 октября 2017 в 14:00

В поле sorting date_pub поменять на date_last_modified и сохранить

Fuze
Да, в данном случае так намного проще.
Но мне приходилось сортировать контент по связанным таблицам, а там так просто не выходит.
#15 Добавить сортировку по дате изменения контента 7 октября 2017 в 13:48

Жаль, я не умею делать хуки.

Argus
Это не беда. Сейчас расскажу.
Итак, во-первых решаем, что нам нужно сделать с контентом. В вашем случае нужно просто добавить в модель сортировку по определенному полю.
Смотрим, где в модели компонента контент есть вызов подходящего события. Открываем файл \system\controllers\content\frontend.php и поиском ищем слово hook. Там хуков семь штук. Нас интересуют хуки, которые отправляют на обработку модель компонента. Находим два подходящих:
  1. list($ctype, $this->model) = cmsEventsManager::hook('content_list_filter', array($ctype, $this->model));
  2. list($ctype, $this->model) = cmsEventsManager::hook("content_{$ctype['name']}_list_filter", array($ctype, $this->model));
Вот это вот $this->model как раз и есть то, куда нам надо добавить сортировку.
Теперь создаем пустой файлик content_list_filter.php (или content_posts_list_filter.php, если достаточно сортировки только в одном типе контента) и помещаем его в \system\controllers\content\hooks\.
В файле \system\controllers\content\manifest.php в конец дописываем имя нашего хука:
  1. <?php
  2.  
  3. return array(
  4.  
  5. 'hooks' => array(
  6. 'fulltext_search',
  7. 'admin_dashboard_chart',
  8. 'menu_content',
  9. 'user_delete',
  10. 'user_tab_info',
  11. 'user_tab_show',
  12. 'user_privacy_types',
  13. 'sitemap_sources',
  14. 'rss_feed_list',
  15. 'rss_content_controller_form',
  16. 'rss_content_controller_after_update',
  17. 'frontpage',
  18. 'frontpage_types',
  19. 'ctype_relation_childs',
  20. 'admin_content_dataset_fields_list',
  21. 'content_list_filter'
  22. )
  23.  
  24. );
  25.  
В файле content_list_filter.php пишем что-нибудь типа этого:
  1. <?php
  2.  
  3. class abcdefg extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. return $data;
  8.  
  9. }
  10.  
  11. }
Потом идем в админку — компоненты — управление событиями и видим, что доступны новые события. Обновить события в базе данных.
Возвращаемся на сайт и сразу видим ошибку:
Fatal error: Class 'onContentContentListFilter' not found in D:\OSPanel\domains\DEF821.tes\system\core\controller.php on line 519
Копируем onContentContentListFilter и вставляем имя класса вместо галиматьи abcdefg, что написали в начале (можно было, конечно подумать и написать правильное имя класса сразу, но мне так проще). Получается что-то типа этого:
  1. <?php
  2.  
  3. class onContentContentListFilter extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. return $data;
  8.  
  9. }
  10.  
  11. }
Обновляем страницу, ошибка пропала. Что в хук прилетело ($data), то и улетело. Пока наш хук ничего не меняет.
Теперь надо добраться до модели, чтобы её дополнить сортировкой. Разворачиваем входящий архив:
  1. list($ctype, $model) = $data; // Разворачиваем массив входящих данных
Теперь добавляем туда нужную сортировку:
  1. $model->orderBy('i.date_last_modified', 'desc') ; // Добавляем сортировку по дате изменения в обратном порядке
Смотрим в отладке, что оно там выбирает:
  1. SELECT i.*, u.nickname AS user_nickname, f.title AS folder_title
  2. FROM cms_con_posts i
  3. FORCE INDEX FOR ORDER BY (date_pub)
  4. INNER JOIN cms_users AS u FORCE INDEX (PRIMARY) ON u.id = i.user_id
  5. LEFT JOIN cms_content_folders AS f ON f.id = i.folder_id
  6. WHERE (i.is_parent_hidden IS NULL) AND (i.is_approved = '1') AND (i.is_deleted IS NULL) AND (i.is_pub = '1')
  7. ORDER BY i.date_last_modified DESC
  8. LIMIT 0, 15
  9.  
Всё здорово! Есть сортировка по дате модификации:
ORDER BY i.date_last_modified desc

Но теперь таким образом будет отсортирован весь контент, а нам это не нужно.
Идем в админку и создаем набор с системным именем например modified.
Теперь в хуке все действия оборачиваем в условие
  1. if (strpos($_SERVER['REQUEST_URI'], 'modified')){ // Если в ответе сервера есть индекс modified
И теперь наша сортировка будет добавляться только в наборе.
Вот получившийся файл content_list_filter.php :
  1. <?php
  2.  
  3. class onContentContentListFilter extends cmsAction {
  4.  
  5. public function run($data){
  6.  
  7. list($ctype, $model) = $data; // Разворачиваем массив входящих данных
  8.  
  9. if (strpos($_SERVER['REQUEST_URI'], 'modified')){ // Если в ответе сервера есть индекс modified
  10.  
  11. $model->orderBy('i.date_last_modified', 'desc'); // Добавляем сортировку по дате изменения в обратном порядке
  12.  
  13. }
  14.  
  15. $data = array($ctype, $model);
  16.  
  17. return $data;
  18.  
  19. }
  20.  
  21. }
Удачи в экспериментах! v
🍪Мы используем файлы cookie для работы сайта. Читать подробнее.