Инструкция по выявлению ошибок при кастомизации и обновлении

Достаточно широкой проблемой, которая вызывает множество вопросов, обращений в тех.поддержку и тем на форуме, является обновление, а именно ошибки, с ним связанные. Корни проблем, возникающих при этом, совершенно различны, но наиболее часто причина в кастомизации. И хоть определение это слишком широкое, всё же процедура выявления проблемы вполне стандартизована и проста. Об этом и пойдёт речь в статье.

В статье я поэтапно разберу все действия, которые нужно произвести для выявления проблемы. С высокой долей вероятности во время возникновения ошибки на сайте будет включено кэширование, а также будет иметься кэш браузера. Эти файлы не позволят в должной мере проследить изменения, поскольку система и браузер будут показывать сохранённые архивные файлы, которые они загрузили для проблемного сайта ранее. От этого нужно избавиться.

Создание резервной копии

Перед любыми действиями следует создать резервную копию файлов и базы данных. Вместе с кешем и временными файлами. Поскольку кеш в системе запросто может храниться несколько месяцев, он может по факту своего наличия скрывать и отсрочивать появление проблем, которые возникли месяц назад. В системе файлы уже новые и между ними и файлами в пользовательской теме есть потенциальный конфликт, который приведёт к ошибке. Но пока система использует кэшированные (старые) файлы этой ошибки не будет. Она появится только когда сбросится кеш. В итоге пытаясь выяснить причину возникновения одной ошибки можно в процессе получить несколько других и не уловить того, что они не взаимосвязаны. Поэтому создание резервной копии строго обязательно и идёт первым пунктом.

Сброс кеша

Для того, чтобы полностью сбросить кэш просматриваемой страницы, достаточно нажать комбинацию клавиш Ctrl+F5. Эта комбинация перезагрузит вкладку без использования ранее сохранённой информации. Но этот приём срабатывает не всегда. Надёжнее открыть сайт, на котором выявляется проблема, в режиме приватного просмотра. Этот режим не загружает никакие файлы, хранящиеся в кеше, игнорируя его. В разных программах он включается по-разному.

просмотр в инкогнито

Далее надо в админ-панели в разделе "Параметры сайта" отключить и сбросить кеш и включить режим разработчика.

Отключение кеша

Если ошибка блокирует доступ к админ-панели, следует подключиться с каталогу сайта по FTP, создать в подкаталоге /custom новую папку и переместить в неё все папки с темами, находящиеся там. Если тем одна или две, можно папки просто переименовать. Также можно отключать темы в разделе админ-панели "Темы и дизайн".

Я предпочитаю работать через FTP, так всё понятнее и нагляднее. Да и дальше всё-равно придётся истользовать FTP.

Отключение тем

Затем нужно перейти в подкаталог /cache и удалить там все папки с кешем и все файлы, кроме файла .htaccess. Этот файл удалять нельзя категорически, он отвечает за безопасность.

Удаление кеша

Если эти действия не помогли получить доступ к админ-панели, значит у Вас частный случай, более сложный и данное руководство Вам не поможет. Следует обратиться в тех.поддержку. Если доступ к админ-панели был изначально или восстановился после вышеописанных действий и кеш в настройках был отключён и сброшен, следует проверить папку /cache и если там всё же есть файлы и папки с кэшем - удалить их. Изредка сброс кеша в настройках удаляет файлы кеша не до конца.

Если после этого ошибка осталась, следует перейти в раздел "Темы и дизайн" и сгенерировать тему оформления. Возможно, были изменены системные файлы.

Генерация темы

Генерация темы

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

Следующим шагом к устранению ошибки, если предыдущие действия не возымели успеха, является восстановление базы данных. При установке дополнений, например, в неё могут вноситься изменения. Нужно запустить процесс восстановления в разделе "Модули и БД".

Восстановление БД

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

Откат и замена обновлений

Как известно, не ошибается тот, кто ничего не делает. Проблема может не только в Вашей теме, но и в одном из установленных обновлений. Чаще всего в последнем. Всё работало, обновились - перестало. Подобные проблемы решаются либо откатом к предыдущему обновлению в разделе "Обновление CMS", либо исправляются в следующем обновлении (патч).

Откат обновления

Также причиной может быть скачивание битого архива. Или некорректная сборка. Такое редко, но случается, т.к. процесс сборки дистрибутива автоматический. В этом случае можно произвести откат на предыдущую версию в админ-панели, затем удалить в папке /return архив с последней сборкой (на скриншоте ниже - 2548)

сборки в папке return

и заново запустить процесс проверки и скачивания обновлений с последующим его применением.

Это тоже в ряде случаев может помочь. Но как показывает практика, в 90% случаев ошибка исчезает, что прямо указывает на конфликт файлов системы и пользовательской кастомизации. Если ошибка исчезла - идём дальше.

Поиск проблемной темы или дополнения

Проблемная тема ищется путём включения/перемещения/переименования (т.е. обратного процесса) каждой темы последовательно. Начинать нужно с активной темы оформления, отвечающей за дизайн (в случае с Diafan.Cloud это тема "my").

Затем сгенерированная тема (если таковая была) и затем уже темы с дополнениями. Если проблема в теме с дополнением, следует обратиться к его автору. Если автор Diafan - в тех.поддержку. Если проблема возникает при переносе/переименовании темы оформления, то следует искать проблемный файл/код внутри неё.

Поиск проблемного кода

Итак, проблемная тема найдена и активна. Ошибка выводится. Теперь следует работать с этой темой через FTP. Файл ищется путём переименования сначала вложенных каталогов по очереди, а затем, когда вложенные каталоги закончатся, переименованием файлов. Начинать следует с папки /modules в теме.

Если её переименование устраняет ошибку, далее переименовываются каталоги модулей. Начинать следует с модулей /cart и /shop. Проблема чаще всего там. Вот как это выглядит:

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

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

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

В этом случае нужно сравнить системный файл, который был загружен с последним обновлением и кастомизированный. Заниматься этим должен специалист. "Метод тыка" может привести к ошибкам в работе, в т.ч. скрытым, о которых узнаете случайно или не узнаете вовсе (перестанут скидки или купоны работать, например). Так что лучше обратиться к специалисту, он возьмёт обновлённый файл, добавит Ваши изменения туда и отладит его работу.

Сравнение файлов

Если всё же хочется самостоятельно разобраться в вопросе и резервная копия сделана и под рукой, то могу посоветовать пару программ для сравнения файлов.

  • Meld (кроссплатформенная)
  • WinMerge (Windows)

Если брать в качестве примера скриншоты выше, файлы для сравнения будут такие:

/custom/design/modules/cart/js/cart.form0.js

/modules/cart/js/cart.form.js

В Meld сравнение файлов выглядит следующим образом:

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

Синие выделения - это смещения строк в файле. Зелёные - различия. Вот по различиям и нужно отслеживать причину возникновения ошибки.

Частичная кастомизация

Очень важным моментом, влияющим на работу пользовательских тем, является бездумная кастомизация файлов. Под этим я подразумеваю перенос системных файлов модулей в папку тем по любому поводу:

кастомизация системных файлов

При последующем обновлении такой кастомизированный модуль с высокой долей вероятности перестанет работать. Поэтому очень важно использовать кастомизацию системных файлов модулей и самой системы грамотно и осторожно. Для этого существует частичная кастомизация.

Например, чтобы добавить несколько шаблонов модуля корзины в обработчик action, достаточно создать в папке модуля в теме файл cart.action.custom.php со следующим содержимым:

class Cart_action extends Action{
    after public function recalc(){
        $this->result["data"] = array(
            ".cart-products" => $this->diafan->_tpl->get('products', 'cart', $form),
            ".cart-products-result" => $this->diafan->_tpl->get('price_total', 'cart', $form),
        );
    }
}

При пересчёте корзины данные в этих шаблонах обновятся.

Часто этим пренебрегают и переносят в кастомную тему файл cart.action.php целиком, добавляя аналогичные строки в него. И файл потом не участвует в обновлении. Понять стороннему специалисту что там было исправлено или добавлено сходу сложно. Требуется сравнивать файл в теме с тем, что находится в корне сайта.

Проблема усугубляется тем, что файл в корне (системный) при обновлениях может заменяться и тот файл, который скопировали в кастомную тему уже сам по себе другой версии. Допустим, установили CMS версии 6.0.11.1. Перенесли файл в кастомную тему и внесли в него изменения.

Затем обновили систему до 6.0.11.4. С обновлением пришёл свежий файл cart.action.php. Он уже чем-то отличается от того исходного, который переносили в кастом. Даже там, где код программист не трогал. И специалисту придётся потратить дополнительно время на выяснение этих моментов. Поэтому бездумная кастомизация вредит обновлению CMS и усложняет (порой на порядок) поддержку и доработку сайта в будущем.

Обратите внимание на скриншот ниже:

частичная кастомизация

Пример под №1 не самый запущенный, бывает и хуже. Однако, даже полная кастомизация одного файла целиком может доставить проблем. А папок с модулями там, как видите, очень много.

Под №2 идёт более сложный проект, но кастомизация там касается в основном view-шаблонов, CSS и JS файлов модулей. А все сложные функции выполнены в виде аналогичных примеру сверху вставок с использованием префиксов new, replace, before и after. Поэтому работа модулей практически не затрагивается, ориентироваться в изменениях очень просто, т.к. в файлах всего по нескольку строк.

Надеюсь, данное руководство было для Вас полезным! Успехов в устранении ошибок.

Комментарии

  • 27.11.2019
  • Спасибо за подробную статью.
    Для сравнения содержимого могу порекомендовать еще Total Commander. Тоже неплохо справляется с задачей.
    Есть русская версия, что упрощает работу с программой для тех, кто не дружит с иностранными языками.
  • 29.11.2019
  • Спасибо. Возник глупый вопрос, при изменениях, как лучше, копировать изначальный файл, например shop.php , переносить его в кастом и править, или создавать в кастоме shop.custom.php и написать там часть нового кода, который "перекроет" код изначального файла ?
  • 1.12.2019
  • evrokomfort12, вопрос не глупый. Всё зависит от того, какие изменения Вы планируете привнести в код. Если хотите изменить функцию, то тут custom-файл конечно намного лучше применить. Если какой-то код при загрузке модуля нужно выполнить, то опять же лучше использовать before и after в том же custom`е. А если Вы половину файла переписываете, то тут уже по месту надо смотреть.
  • 11.12.2019
  • Я сначала копирую файл в custom делаю правки (так нагляднее) и отлаживать проще. Потом по ситуации либо оставляю файл - либо уже из него делаю xyz.custom.php а оригинал переименовываю _xyz.php потому что держать в голове эти before и after и как они встраиваются в итоговую функцию как-то не получается.
  • 11.12.2019
  • Denis, многое зависит не от того, как файл называется, а от того, что там внутри. В xyz.custom.php можно с таким же успехом запихнуть весь файл xyz.php. Толку от такой кастомизации будет мало. Тем более в xyz.custom.php всё-равно надо что-то использовать из префиксов. Или replace или new. Не вижу причин не использовать тут же before и after.

    Ну и решил дополнить статью этой немаловажной информацией, тем более об этом на конференции спрашивали и просили при случае осветить данный вопрос.
  • 12.12.2019
  • Павел, а подскажите: replace, new, before и after - это фичи php или diafan? У меня Netbeans 10 (моя IDE) в режиме совместимости с php 7.2 ругается на такой синтаксис.. в гугле тоже такого найти не могу :(
  • 12.12.2019
  • cottonhouse.su, это часть документации DIAFAN.CMS. Поэтому и ругается. Также как html-синтаксис ругается на <insert></insert>. Если в редакторе есть настройки лексера (подсветки), то это можно исправить/дописать.
  • 12.12.2019
  • Павел, тогда вы молодцы - очень круто придумали. Я в 1С такой штуке с недавнего времени нарадоваться не могу.
  • 13.12.2019
  • Андрей Левченко, пожалуйста. Рад, что информация идёт на пользу и пользуется спросом.
  • 26.12.2019
  • Иногда после обновления на сайте пропадает полностью или частично всё меню. В данном случае рекомендуется запускать вручную "Восстановление БД" по адресу - http://сайт.ru/admin/service/repair/?repair=1. Иногда это меня спасало.

Новости

  • 01 января, среда
  • Ну что, поднимем бокалы? Уже можно, уже пора :) Год выдался не самый простой, но поработали мы классно. Вы – над своим проектом. Мы – над тем, чтобы сделать DIAFAN.CMS еще удобнее, доступнее и надежнее. Чтобы вы гордились своим сайтом 10 лет назад, сегодня, завтра и через 10 лет. Было круто –  будет еще круче. А пока команда DIAFAN.CMS от всей души поздравляет Вас с Новым Годом! Побольше свободного времени в 2020-ом. Пусть цели достигнутся и мечты сбудутся. Пусть заниматься любимым делом станет еще приятнее и проще!

Блоги

  • 16.11.2019
  • Достаточно широкой проблемой, которая вызывает множество вопросов, обращений в тех.поддержку и тем на форуме, является обновление, а именно ошибки, с ним связанные. Корни проблем, возникающих при этом, совершенно различны, но наиболее часто причина в кастомизации. И хоть определение это слишком широкое, всё же процедура выявления проблемы вполне стандартизована и проста. Об этом и пойдёт речь в статье.

Форум