Magento: переписанный контроллер не может перенаправить на страницу входа после истечения времени сеанса

Мы приобрели встроенное расширение ERP для Magento. Мы настроили его и переписали несколько контроллеров. вот фрагмент из моего файла config.xml

   <admin>
    <routers>
        <mdn_extended>
            <!-- should be set to "admin" when overloading admin stuff (?) -->
            <use>admin</use>
            <args>
                <module>MDN_Extended</module>
                <!-- This is used when "catching" the rewrite above -->
                <frontName>mdn_extended</frontName>
            </args>
        </mdn_extended>
    </routers>

</admin>

  <global>
   <rewrite>
        <mdn_extended_advancedstock_warehouse>
            <from><![CDATA[#^/AdvancedStock/Warehouse/#]]>
            </from>
            <to>/mdn_extended/AdvancedStock_Warehouse/</to>  <!-- THIS IS AJAX CASE  -->
         </mdn_extended_advancedstock_warehouse>

        <mdn_extended_advancedstock_stockmovement>
            <from><![CDATA[#^/AdvancedStock/StockMovement/#]]></from>
            <to>/mdn_extended/AdvancedStock_StockMovement/</to> <!-- this is page REFRESH CASE   -->
        </mdn_extended_advancedstock_stockmovement>
    </rewrite>
 </global>

Теперь у нас есть интересная проблема здесь. в первом случае перезаписи, если вы делаете какие-либо действия, такие как сортировка / фильтрация в сетке. Он посылает и вызов ajax. В обычном случае, если сеанс пропал, сервер вернул отклоненный json, как в следующем формате

{"ajaxExpired":1,"ajaxRedirect":"http:\/\/upgrade.magento.com\/index.php\/admin\/index\/login\/key\/90d3e0a32ecc2cb8e4183ecde51a0d54\/"}

Но в первом случае, отказанный JSON приходит в следующем формате, URL меняется

{"ajaxExpired":1,"ajaxRedirect":"http:\/\/upgrade.magento.com\/index.php\/AdvancedStock\/index\/login\/key\/2e96b02d545ee3fddaea963ae6ec5d35\/"}

Благодаря этому пользователь переходит на страницу 404.

Теперь рассмотрим второе правило перезаписи.

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

В нормальном случае, если название маршрута module/controller/action тогда magento загружает дескриптор макета<module_controller_action> из xml файла также загружается <admin_index_login>

благодаря этому наконец <admin_index_login> оказано. В случае второй перезаписи magento не загружается <admin_index_login> обрабатывать поэтому он показывает фатальную ошибку.

Буду признателен за любую подсказку или помощь в этом направлении. Если вам, ребята, нужна какая-то другая информация, я буду рад предоставить вам. Спасибо вам большое!

1 ответ

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

protected function _construct() {
    Mage::getSingleton('core/session', array('name'=>'adminhtml'));
    if (!Mage::getSingleton('admin/session')->isLoggedIn()) {
        $this->_forward('adminhtml/index/login');
        return;
    } else {
       parent::_construct();
    }
}

Хотя это решает проблему, основная проблема, кажется, с классом Mage_Adminhtml_Controller_Action где отказано в действиях вызывает $this->_redirect('*/index/login'); который в основном перенаправляет, в вашем случае, на mdn_extended/index/login, На самом деле это может привести к некоторым рискам безопасности, поэтому я советую вам всегда перезаписывать контроллер таким образом или изменять основной класс для перенаправления на adminhtml/index/login,

Другие вопросы по тегам