При очередном рестайлинге сайта и переводе его на платформу Joomla 3 (с 2.5) возник вопрос о переносе данных с сохранением всей информации (в том числе алиасов и внутренних идентификаторов). Воспользовался компонентом jUpgradePRO. И тут понеслось...

Предисловие

Не сохраняются метки в материалах Joomla 3jUpgradePRO оказалась просто находкой! Казалось, что проблема переноса данных решена целиком и полностью. Выбрал элементы, указал базу и нажал кнопку - все! На выходе получаешь и структуру меню, и каталоги, и самое главное - материалы. Но косяков оказалось столько, что я до сих пор не смог определить границы между овчинкой и выделкой, сколько материалов должно быть на сайте чтобы время, затраченное на ручной перенос, было меньше, чем время на перенос автоматический (плюс исправление всех багов после переноса). Думаю, это повод для еще одной статьи.

Нетерпеливым рекомендую сразу обратиться к заключительному разделу материала по устранению проблемы и не читать то, что я называю "поделиться опытом".

Описание проблемы

Не сохраняются метки Joomla 3Проблема проявилась, когда я решил испытать ранее не исследованный родной компонент Joomla 3 для создания тегов (здесь меток). Функционал показался достаточным и удобным, и я решил присвоить статьям пару меток, чтобы построить облако тегов и вывести список статей по метке, ну, обычное дело.

Первый и самый очевидный способ - указать метку в статье - не сработал. Я, как пользователь, предположил, что неплохо бы указать метки в статье и они автоматически создались бы в как элементы. Но не сработало: метка не создалась в справочнике и не сохранилась в статье. Я создал метку вручную и попытался присвоить ее статье. С удовлетворением отметил, что при наборе метки вылезают подсказки об имеющихся метках. Но как только сохранил материал - метка пропала из него.

Второй способ - пакетное присвоение меток статьям. Для первоначального быстрого присвоения меток и лучше ничего не придумаешь. Этот прием сработал - метки присвоились. Попробовал удалить метку - метка восстановилась после сохранения материала и удалить ее не получилось.

Очевидно, меня не устраивал такой расклад и я решил начать разбираться. Еще на этом этапе я не мог представить, сколько раз ошибусь в своих предположениях и действиях. Но обо всем по порядку. В конце концов, не хочу показать насколько я глуп, а хочу предостеречь вас от моих ошибок и показать логику моих поисков, возможно, кому-то это будет полезно, а не само решение.

Поиск проблемы

Исходя их других косяков переноса я предположил, что этот косяк не самой системы, а компонента jUpgradePRO. Чтобы подтвердить мои предположения я опробовал работу с метками на абсолютно чистом сайте. Результат удовлетворил мои ожидания, так как все работает на интуитивно-понятном уровне - метки создаются и сохраняются прямо из материала. Чтобы на всякий случай отмести косяки других компонентов (сторонних) я восстановил архив до переноса данных и тоже попробовал поработать с метками. Все нормально - значит проблема исключительно в работе jUpgradePRO.

Следующим шагом было бесконечно-долгое исследование базы данных с целью найти где и как сохраняются метки, чтобы ручками их назначить. Многие проблемы переноса выплыли именно в некорректных записях в базе данных и, зная это, я начал искать узкое место именно тут. Это первая моя ошибка. Не скажу, что она бесполезная, ведь я понял, как устроена структура таблиц базы данных, относящаяся к хранению меток.

Не найдя проблему в базе данных, я решил отмести вероятность искажения кода самой CMS и ее модулей. Для этого я сделал бэкап глючной системы (регулярно делайте бэкапы!) и на ее место развернул систему до обновления, оставив при этом имеющеюся базу данных. Надо понимать, что по сути перенос происходит из одной базы данных в другую без изменения системы, просто изменяется структура таблиц БД под новую Joomla.

Мои ожидания были удовлетворены - работа с метками была без ошибок. Это однозначно сузило границы поиска до границ каталога с сайтом. Надо заметить, что можно было бы закончить на этом, ведь проблема решена, но мое любопытство не дало бы мне спокойного сна. Продолжаем испытания, я возвращаю глючную систему на место.

Так получилось, что изначально у меня не родилась мысль сравнить глючную и рабочую систему каким-либо способом. В голове билась одна мысль - сузить еще границы проблемы и я начал сужать тем же способом - это была вторая моя ошибка потери времени. Под подозрение попали три папки: administrator, includes и libraries. Тут надо пояснить: эти папки так или иначе предоставляют функционал всей системе, и именно здесь я решил искать искажение кода. Там, разумеется, несметное количество каталогов и файлов, но меня это не испугало в той мере, чтобы отступиться от затеи.

Не сохраняются метки в материалах Joomla 3Не сохраняются метки в материалах Joomla 3Не сохраняются метки в материалах Joomla 3

Делая резервные копии, восстанавливая чистые каталоги и снова проверяя наличие проблемы, на третий раз мои попытки увенчались успехом. Косячная оказалась папка libraries, точнее что-то из ее содержимого. Дело в том, что если представить все дерево этой папки и фронт работ по поиску проблемы этим незамысловатым способом, то становится очень жалко времени. Но я продолжил, заменяя сразу несколько каталогов и сужая поиск. Третье ошибочное решение, но вскоре мне надоело. Я сумел заползти еще на один уровень глубже и сдался, так как это оказалась папка Joomla, а в ней огромное количество каталогов. Старый добрый способ замены каталогов и проверки работоспособности здесь уже совсем неэффективен.

Кружка крепкого чая (хотелось бы пива, но не было) и возникло еще одно предположение - сравнить размеры каталогов, ведь если я прав и код изменен или файлы удалены/добавлены, то я это увижу. Сравнение при помощи TotalCommander (как я люблю тотал!) выдало мне массово всю подноготную этих каталогов (точный суммарный размер файлов каталога) и позволило сузить поиск всего до одного лишь файла: /libraries/joomla/observer/updater.php. Этот файл отличался парой байт от оригинала. Всего два байта показывались в отличии libraries от оригинальной, то есть можно было сразу найти косяк, сравнив все каталоги joomla с оригиналом.

Решение проблемы

Для поиска этих добавленных двух байт (именно столько нужно, чтобы зашифровать пару символов) я воспользовался онлайн-сервисом сравнения текста - https://www.diffchecker.com/ и мне мгновенно (или почти мгновенно) открылась истина.

Решено: Не сохраняются метки в материалах Joomla 3

Решение проблемы более чем прозаичное - нужно всего лишь разкомментировать строку №104, которая содержит код:

//call_user_func_array($eventListener, $params);

Все, друзья. Спасибо за внимание, но желания разбирать причины изменения кода компонентом jUpgradePRO у меня не было и нет. Если кто-то мне откроет глаза на это в комментариях или личной переписке - буду очень признателен.

Добавить комментарий

Защитный код

Введите код с картинки в текстовое поле

Комментарии   

Noir
0 # Noir 17.03.2016 20:36
Благодарю автора за полезную статью. Сам пару раз перетаскивал старье на новый движок с использованием jUpgradePRO (альтернативы ведь нет, если в меню 500+ пунктов), но на косяки тогда не нарывался. Буду теперь осторожен с этой приблудой. Работа автором проделана колоссальная - снимаю шляпу. Лично я, убедившись, что БД в порядке - сразу плюнул бы на дальнейшие поиски. При переносе кучи материалов и пунктов меню только БД, в итоге, и нужна.
Ответить | Ответить с цитатой | Цитировать
Руслан
0 # Руслан 19.06.2018 10:23
Огромная благодарность автору. Сохранил мне кучу времени, хотя я и так не мало его потратил (неделю) при миграции сайта с Joomla1.7 на Joomla3.8 и с использованием jUpgradePRO и SP Upgrade. Сайт не самый маленький около 5000 статей. Косяков куча была. Описания процесса на пару статей бы хватило :) Никогда бы не подумал что jUpgradePRO ещё какие-то изменения в файлы джумлы вносит. Надеюсь после его удаления он автоматом убирает коммент строки.
P.S. Совет. При миграции используйте в придачу к jUpgradePRO и SP Upgrade компонент ACL Manager. Там есть функционал диагностики и фикса assets table. Что часто помогает исправить косяки в базе, особенно если мигрируете с древней версии Joomla.
Ответить | Ответить с цитатой | Цитировать