Некорректный вывод ссылок в виджетах при установленном типе контента по-умолчанию

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X

баг

#1 14 марта 2018 в 22:06
Установил тип контента по умолчанию на Статьи и ожидал увидеть ссылки в виджетах типа Список контента в соответствующем виде. Вместо
test.tdl/articles/war/33-trydtsat-tri-bogatyrya.html
такое
test.tdl/war/33-trydtsat-tri-bogatyrya.html
И… не дождался. Стал разбираться и выяснил следующее.
В виджетах ссылка на контент формируется в функции href_to определённая в system/libs/html.helper.php
  1. function href_to($controller, $action = '', $params = false){
  2.  
  3. $lang_href = cmsCore::getLanguageHrefPrefix();
  4.  
  5. return cmsConfig::get('root') .($lang_href ? $lang_href.'/' : ''). href_to_rel($controller, $action, $params);
  6.  
  7. }
  8.  
  9. function href_to_rel($controller, $action = '', $params = false){
  10.  
  11. // лишнее покоцано
  12. //....
  13.  
  14. $ctype_default = cmsConfig::get('ctype_default');
  15.  
  16. if ($ctype_default && $ctype_default == $controller){
  17. if (preg_match('/([a-z0-9\-\/{}]+)(.html|\/view\-[a-z0-9\-_]+)$/i', $action)){
  18. $controller = '';
  19. }
  20. }
  21. // лишнее покоцано
  22. //....
  23. }
  24.  
  25. return trim($href, '/');
  26.  
  27. }
Смотрим код и видим попытку очистить $controller если он совпадает с установленным типом контента по умолчанию. Но этого не происходит.
Оказалось, что в href_to должна попадать ссылка с префиксом .html, что следует из регулярного выражения (в регулярке маленькая неточность, которая вообщем-то не влияет на результат). Например: war/33-trydtsat-tri-bogatyrya.html
Но в href_to попадает такая строка war/33-trydtsat-tri-bogatyrya и… регулярка не срабатывает и очистки контролёра $controller не происходит.

В результате виджеты выводят ссылки на контент без учёта настройки типа контента по умолчанию. А что — всё работает по прежнему )))

Как оказалось, в файлах шаблонов в папке templates/default/controllers/content/widgets/list/*.* есть строки, которые неверно передают параметры:
  1. // файл templates/default/controllers/content/widgets/list/list_basic.tpl.php (строка 7)
  2. $url = href_to($ctype['name'], $item['slug']) . '.html';
именно здесь передаётся параметр в $item['slug'] например war/33-trydtsat-tri-bogatyrya, тогда как должен был передать war/33-trydtsat-tri-bogatyrya.html
Префикс .html в самом буквальном смысле этого слова остаётся за скобками laugh
Исправляется перемещением скобки вправо:
  1. // файл templates/default/controllers/content/widgets/list/list_basic.tpl.php (строка 7)
  2. $url = href_to($ctype['name'], $item['slug'] . '.html');
После чего регулярка правильно отрабатывает. Ну и устраните неточность в регулярке функции href_to_rel в файле system/libs/html.helper.php
  1. // Так будет правильно
  2. if (preg_match('/([a-z0-9\-\/{}]+)(\.html|\/view\-[a-z0-9\-_]+)$/i', $action)){
  3. $controller = '';
  4. }
Движок: InstantsCms 2.9.0
#3 21 мая 2018 в 10:45
Приветствую уважаемые форумчане!
Тоже этим вопросом озадачен давно и хотел уже создать тему, но нашел ее уже созданной)))
У меня такая же проблема, что когда переходишь с виджета, добавляется системное имя, когда переходишь со списка, системного имени типа контента нет.
Не знаю, проблема ли это, но скорее всего да и кто-нибудь еще сталкивался с подобным?
Версия 2.10
#4 24 июня 2018 в 16:07


Приветствую уважаемые форумчане!
Тоже этим вопросом озадачен давно и хотел уже создать тему, но нашел ее уже созданной)))
У меня такая же проблема, что когда переходишь с виджета, добавляется системное имя, когда переходишь со списка, системного имени типа контента нет.
Не знаю, проблема ли это, но скорее всего да и кто-нибудь еще сталкивался с подобным?
Версия 2.10

skewes

Кстати, в версии 2.10 все эти неточности остались без изменений.
#5 24 июня 2018 в 16:48
Создавайте тикет на гите, смысл в свалке форума писать о таких проблемах?
#6 7 июля 2018 в 01:47
О, в релизе 2.10.1 пишут, что этот косяк исправлен.
#7 7 июля 2018 в 01:47
Проблема решена, закрываю тему.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.