Налагодження незрозумілих помилок у Magento
Напевно, кожен розробник модулів для Magento потрапляв у ситуацію, коли начебто все зроблено правильно, але не працює. Особливо це стосується характерних ситуацій: створив роутер, а видає 404 старницю, створив лейaут, а контент не виводиться, створив темплейт, а сторінка, як і раніше, порожня. Відмінною рисою таких ситуація є те, що, як правило, Magento ніяк на них не реагує (не видається помилок, логи залишаються порожніми). Саме про налагодження таких помилок і йтиметься у цій статті.
Вдосталь намучившись з подібними ситуаціями, я зібрав невелику колекцію порад із розробки та методів налагодження модулів, які дозволяють швидко справлятися з подібними неприємностями. Особливо корисні вони будуть новачкам, але досвідчені розробники можуть знайти для себе щось нове.
Я створив роутер та контролер для нього, але Magento показує 404 сторінку
Чому так відбувається:
Швидше за все, неправильно названий файл, у якому лежить клас контролера, шлях не відповідає назві класу, неправильна назва класу та подібні помилки. Можливо, це просто помилка через неуважність, але може статися, що ви не до кінця розумієте, як Magento перетворює запит у frontName, controllerName і actionName. У цьому випадку рекомендую прочитати статтю Alan'a Strom'a щодо визначення імені контролера.
Як налагоджувати:
Отже, ви добре розібралися з тим, як визначається ім'я контролера, але бачите 404 сторінку. Якщо це трапилося, то швидше за все ви поклали файл з контролером не в ту папку або неправильно назвали сам файл. Найпростіший спосіб це перевірити – це вивести шлях до контролера, який шукає Magento. Для цього йдемо в клас Mage_Core_Controller_Varien_Router_Standard та шукаємо там метод _validateControllerClassName(). Уцей метод ми отримуємо повний шлях до нашого контролера, залишилося тільки вивести його і звірити з нашим.
Ось відповідний код:
Тепер замість 404 сторінки Magento видасть шлях нашому контролеру. Виправляємо та радіємо.
Якщо шлях містить Mage/Core/… замість вашого Namespace/ModuleName, ви не визначили роутер в config.xml або зробили це неправильно. Про те, як це зробити правильно, читаємо все в тій же статті Alan'a Strom'a.
Далі нас може очікувати ще кілька помилок, що відображаються: а саме Controller file was loaded but class does not exist, яка означає, що ми невірно надрукували назву контролера у файлі або Fatal error: Call to undefined method NameSpace_TestModule_IndexController::hasAction(), яка нам про те, що ми забули успадкувати базовий контролер Mage_Core_Controller_Front_Action для фронтенду та Mage_Adminhtml_Controller_Action для бекенда.
Я створив роутер, контролер та метод, але отримую сторінку Whoops, our bad.
Чому так відбувається:
Дуже рідкісна та проста у виправленні помилка. Вона означає, що наш контролер не містить методу, який ви просите.
Як налагоджувати:
Перевірте назву вашого методу, швидше за все, він названий невірно, можливо ви забули дописати Action після назви методу.
Мені здається, що не вантажиться якийсь із xml-файлів або я хочу подивитися, які файли завантажуються
Чому так відбувається:
Причин, чому може не підвантажувати XML-файл досить багато і розглядати їх у даному топіку не має сенсу. Рішення для всіх випадків одне й те саме, тому перейдемо відразу до нього.
Як налагоджувати:
Найпростіший спосіб перевірити чи вантажиться якийсь конкретний xml-файл — це зробити його невалідним. Скажімо додатизайву одиницю у файл:
Тепер, коли ви заходите на сторінку, ви побачите повідомлення про помилку завантаження xml-файлу. Якщо цього повідомлення немає, файл дійсно не підвантажується. Які xml-файли і чому можуть не завантажуватись — це тема окремої статті і тут розглядатися не буде.
Друга частина нашого питання - це дізнатися, які XML-файли все-таки підвантажуються. Один із способів це зробити – це дописати кілька рядків у файл lib/Varien/Simplexml/Config.php. Шукаємо метод loadFile, який відповідає за завантаження всіх XML-файлів і дописуємо туди кілька рядків:
Не забудьте вписати ваш шлях від кореня сервера до каталогу із встановленою Magento. А також створити файл xml.log, вказаним шляхом. Тепер список усіх xml-файлів, завантажених при запиті сторінки, буде записаний у вказаний log-файл.
Я підключив файл з layout'ом, додав хендл з блоком, але сторінка, як і раніше, залишається порожньою
Для початку я наведу трохи коду:
Тут ми підключаємо файл із layout'ом. Ось сам цей файл:
Цей файл містить кілька частих помилок, але ми обговоримо їх трохи пізніше. Поки що припустимо, що у цьому файлі все написано правильно. Також створимо файл із шаблоном:
Отже, тепер причини цієї чистої сторінки та їх вирішення:
-
Ви забули вказати у методі контролера, що потрібно підвантажити layout. Контролер повинен містити такі рядки коду:
Не завантажується файл із layout'ом. Як перевірити цю версію ви вже знаєте із попереднього пункту.
Неправильна назва хендла у файлі з layout'ом. Це одна з помилок, яких було допущено в нашому прикладі. У прикладі, це просто друкарська помилка, необхідно виправити testmodale на testmodule, але іноді так буває, що ви неправильно визначили хендл для якоїсь сторінки.Найпростіше рішення вивести всі хендли, вміст яких Magento завантажить для поточної сторінки. Для цього додаємо до методу контролера наступний рядок коду:
Для нашого прикладу одним з хендлів буде testmodule_index_index, який ми вказали.