Добрый день, коллеги.
Уже который час мучаюсь, не могу понять в чем причина.
В общем есть плагин GeoIp для приложения магазин.
Я его скопировал для приложения сайт и блог. Для сайта работает отлично, а вот с блогом проблема.
При инициализации город верно определяется, но когда хочу посмотреть полный список городов - для этого нужно послать аякс запрос к экшену плагина - то выдается ошибка:
404. Empty module and/or action after parsing the URL "/blog/geoip/popup/" (frontend/popup).
Not found classes: blogFrontendPopupController, blogFrontendPopupAction, blogFrontendActions
Чтобы не было недоразумений, и лишний предирок к тому что я уже сделал:
1. в /wa-config/apps/blog/plugins.php добавил 'geoip' => true
2. в /wa-apps/blog/plugins/geoip/lib/ переименовал в blogGeoip.plugin.php, в самом плагине изменил название класса и расширяемого класса на: class blogGeoipPlugin extends blogPlugin
3. в /wa-apps/blog/plugins/geoip/lib/config/plugin.php стоит: 'frontend' => true, 'handlers' => array('frontend_header' => 'frontendHeader')
4. в /wa-apps/blog/plugins/geoip/lib/config/routing.php
return array(
'geoip/popup/' => 'frontend/popup',
'geoip/setregion/' => 'frontend/setregion',
);5. в /wa-apps/blog/plugins/geoip/lib/actions/frontend переименовал экшн на blogGeoipPluginFrontendPopup.action.php, в нем же изменил название класса на: class blogGeoipPluginFrontendPopupAction extends waViewAction
6. в /wa-apps/blog/plugins/geoip/lib/actions/frontend переименовал контроллер на blogGeoipPluginFrontendSetregion.controller.php, в нем же изменил название класса на: название класса на: class blogGeoipPluginFrontendSetregionController extends waJsonController
Вопрос:
почему при запросе к экшену, выдается 404 ошибка и как это исправить?
Оно не может найти blogFrontendPopupAction. А у вас это называется blogGeoipPluginFrontendPopupAction. С этим надо что-то делать. Либо роутинг исправить, либо класс переименовать. Думаю первое.
Пробовал переименовать - и название класса, и сам файл и по отдельности и вместе - не помогает
По поводу роутинга - что именно менять?
А не проще было не дублировать плагин, а просто вызывать в шаблоне класс из приложения магазин?
Разобрались?
Не знаю баг или так задумано, но при сборе маршрутов из конфигураций плагинов в методе blogConfig->getRouting() не заполняется параметр plugin для маршрутов.
При этом plugin заполняется в приложении site - siteConfig->getRouting():
и аналогично в приложении shop - shopConfig->getRouting:
/wa-apps/shop/lib/config/shopConfig.class.php:135 if (!array_key_exists('plugin', $route)) { $route['plugin'] = $plugin; }Получается для приложения blog во frontend основной контроллер waFrontController в методе execute() выполняет поиск класса экшна или контроллера только с использованием $module и $action.
Это ответ на вопрос "Почему?"
Можно обойти сие странное различие в конфигурации приложений, указав plugin явно в routing.php для плагина:
'geoip/popup/' => array( 'module' => 'frontend', 'action' => 'popup', 'plugin' => 'geoip', )Тогда все будет работать аналогично shop и site.