Уже давно наблюдал на ожном из сайтов, под управлением Joomla 3.x ошибку в одном из модулей, ответственных за вывод изображений в модальном окне. Несмотря на то, что превью, созданные вручную, отображались нормально, автоматически генерируемые превью отображались с ошибкой. Так же возникала ошибка при клике на превью, при открытии модального окна с полным изображением и описанием.
После просмотра выяснилось, что какой-то из компонентов, ответственных за маршрутизацию URL и корректное их отображение либо не работает, либо работает неправильно.
Чтобы было понятно, поясню.
У вас есть категория с алиасом, например, articles, в которой находятся ваши статьи. Доступ к статьям осуществляется по адресу {имя сайта}/articles/ или {имя сайта}/articles.html (в зависимости от параметров SEO в настройках Joomla.
Соответственно, ссылка на статью в этой категории выглядит следующим образом:
- {имя сайта}/articles/page.html
- {имя сайта}/articles/page
Изображения и превью к ним к этой статье находятся в папке
- images/articles/page/
Но почему-то при нормальном выводе превью ссылка на модальное окно выглядела таким образом:
- articles/images/articles/page/
То есть к ссылке на полное изображение добавлялся алиас категории, в котором находится материал. Жирным выделена лишняя часть.
Изначально грешил на компонент SEF-Wizard, который был установлен на этом сайте еще до момента появления в Joomlaновой маршрутизации URL. После обновлений и перехода на такой способ SEO, и с учетом ставшего платным, компонента, от последнего решил отказаться. Какой-то время он просто болтался в плагинах, отключенный, но не удаленный. И вот, при переезде на новый сервер в прошлом году, в процессе оптимизации, часть компонентов была деинсталирована. Но ошибка, о которой я написал, была замечена гораздо позже, после нескольких обновлений ядра, других компонентов, в том числе компонента, ответственного за вывод изображений в модальном окне.
Логично предположить, что компонент, выводящий изображение, конфликтует с последней версией Joomla. Но на другом сайте этот же компонент работает без проблем и ошибок.
Первая мысль – сделать все с помощью htaccessи 301 редирект. Но увы, костыль не помог. Наверное старею, мозгов не хватает правильно использовать синтаксис. Пошел иным путем
Выгрузил копию сайта в локальный сервер и начал сначала по очереди деинсталировать компоненты, и устанавливать их заново. Не помогло. Следующий шаг – развернул чистую версию Joomla, установил набор плагинов и компонентов, аналогичных интернет-сайту. Все работает, ошибок нет.
Третий этап – начал поочередно брать дамп таблиц и интернет-версии и загружать их вместо имеющихся в локальную копию. Естественно, процесс не быстрый, и порядком утомил, а результат так и не появился. Уже начала постепенно зреть уверенность, что проще сделать новую сборку, и на нее «накатить» дампы материалов, меню и некоторых других таблиц с интернет-сайта. Но начатый процесс показал, что времени это займет много.
Начал более пристально искать в таблицах все, что имеет в своем значении буквы «SEF» (search engines friendly). И через некоторое время нашел.
Как оказалось, по какой-то причине, в одной из таблиц отсутствовало значение и ссылка на встроенный в Joomla плагин SEF-оптимизации. Сам плагин находится в папке plugins\system\sef\ .
Таблица, ответственная за корректную работу этого плагина называется _extensions (перед прочерком – префикс вашей БД). И из-за отсутствия одной строки и возникли все эти проблемы. Нет строки – нет ссылки на плагин, который, соответственно, не обрабатывает должным образом ссылки, и по этой причине в них добавляется дополнительный каталог – раздел, в котором расположены статьи на сайте.
В общем, если вдруг возникнет такая ошибка, проверьте наличие строки в БД с указанием plg_system_sef в поле name и наличием значения в остальных полях. Если такой строки нет, ее можно добавить в два клика.
Оригинал можно взять из чистой версии базы данных Joomla или использовать следующий запрос в MySQL:
INSERT INTO `PREF_extensions` (`extension_id`, `package_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, `custom_data`, `system_data`, `checked_out`, `checked_out_time`, `ordering`, `state`) VALUES ('0', '0', 'plg_system_sef', 'plugin', 'sef', 'system', '0', '1', '1', '0', '{\"name\":\"plg_system_sef\",\"type\":\"plugin\",\"creationDate\":\"December 2007\",\"author\":\"Joomla! Project\",\"copyright\":\"Copyright (C) 2005 - 2020 Open Source Matters. All rights reserved.\",\"authorEmail\":\"Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. \",\"authorUrl\":\"www.joomla.org\",\"version\":\"3.0.0\",\"description\":\"PLG_SEF_XML_DESCRIPTION\",\"group\":\"\",\"filename\":\"sef\"}', '', '', '', '0', '0000-00-00 00:00:00', '8', '0');
Не забудьте добавить префикс таблиц вашей БД. Где добавлять – выделего жирным.
После добавления отсутствующей строки все заработало корректно, ошибки исчезли, фотографии стали появляться в модальном окне. Ну а кто виновен в удалении этого параметра, разбираться уже бессмысленно – у меня еще один компонент выдает ошибки при переходе на PHP 7.2. Буду искать ему замену, ибо виновник уже давно не обновляется, и заточен еще под PHP 5,6
В общем, вдруг кому совет пригодится.