Как избежать ошибки 404 при установке нового расширения

27

Это очень распространенная ошибка, которая появляется в Magento при установке нового расширения с конфигурацией system.xml :

При переходе на System->Configuration->Extensionвкладку отображается ошибка 404. Вы должны выйти из системы и войти снова, и тогда все в порядке. Но есть ли способ избежать этого?

JohnyFree
источник
Я не верю, что дерево ACL загружается при входе в систему и сохраняется в сеансе пользователя.
Питер О'Каллаган
У меня есть одна идея, но я не знаю, возможно ли это. Вы можете изменить поведение «Magento Connect Manage», чтобы завершить все сеансы администратора после установки расширения. Но это невозможно сделать из области расширения (((. Только из области действия Connect Manager.
Алексей.Сваричевский
2
Ваш вопрос ответил на мой вопрос! Благодарность!
Ян Филлипс
Мне пришлось оставить комментарий, потому что, как сказал Ян: «Ваш вопрос ответил на мой вопрос». Ведение журнала сделал свое дело!
Ханс Вассинк

Ответы:

16

Как сказал @Cags, это (легко) невозможно, поскольку дерево ACL загружается при инициализации сеанса (AKA, когда администратор входит в систему).
Возможный обходной путь - переопределить _isSectionAllowedметод в контроллере конфигурации системы: ( Mage_Adminhtml_System_ConfigController::_isSectionAllowed) и перезагрузить дерево ACL.
Что-то типа:

protected function _isSectionAllowed($section)
{
    $session = Mage::getSingleton('admin/session');
    $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl());//reload the tree
    return parent::_isSectionAllowed($secntion); //all the code from the original method
}

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

Мариус
источник
Возможно, было бы лучше сбросить дерево ACL, только если раздел не разрешен. Честно говоря, я не могу вспомнить, как пытался загрузить раздел, который не был разрешен ACL, кроме как после установки модуля и до повторной регистрации администратора.
pspahn
Просто сумасшедшая идея, так как я никогда не пробовал ее, и я не уверен, доступен ли сеанс в этот момент, но можно ли перезагрузить его из сценария установки? Конечно, это работает только в том случае, если скрипт установки запускается по запросу, в котором вы вошли в систему как администратор, и это не повлияет на других вошедших в бэкэнд пользователей
Fabian Schmengler
2
@fschmengler. Я не пробовал раньше, но думаю, что это может сработать. Честно говоря, я не думаю, что это стоит того.
Мариус
9

Я нашел способ обойти это с очень маленькой настройкой. Что нам нужно это:

  1. Новое действие контроллера, которое перезагружает ACL (без выхода из системы и входа), а затем перенаправляет обратно на предыдущую страницу:

    class SSE_AclReload_Adminhtml_Permissions_AclReloadController extends Mage_Adminhtml_Controller_Action
    {
        public function indexAction()
        {
            $session = Mage::getSingleton('admin/session');
            $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl());
            Mage::getSingleton('adminhtml/session')->addSuccess($this->__('ACL reloaded'));
            $this->_redirectReferer();
        }
    }
  2. Обновление макета для admin_norouteручки. Мы добавим ссылку на это новое действие контроллера прямо на странице администратора 404:

    <layout version="0.1.0">
        <adminhtml_noroute>
            <reference name="content">
                <block type="adminhtml/template" name="content.aclReload" after="content.noRoute" template="sse_aclreload/button.phtml" />
            </reference>
        </adminhtml_noroute>
    </layout>
  3. И шаблон с ссылкой:

    <a href="<?php echo $this->getUrl('adminhtml/permissions_aclReload/index'); ?>">
        <?php echo $this->__('Reload ACL'); ?>
    </a>

Я добавил это в небольшое расширение на Github: SSE_AclReload (добавляет ссылку также в меню Система> Права доступа )

Вы также можете попытаться перезагрузить ACL автоматически, как только будет отправлено действие admin / noroute, но я предпочитаю 1) знать, что происходит, и 2) иметь выбор.

Фабиан Шменглер
источник
1

Если у вас возникли проблемы при установке нового расширения и появлении страницы с ошибкой 404 , вам нужно всего лишь войти в нее System > Permissions > Roles. Просто сохрани роль и не забудь очистить var/cacheи var/seesion твоя проблема была решена.

Hiral Unadkat
источник
"очистить var / session"? Чтобы выйти из всех клиентов и очистить их тележки? Нет.
Фабиан Шменглер
nup, просто очистите сессию, в папке var
Hiral Unadkat
К сожалению это то же самое. За исключением случаев, когда вы не используете файловый обработчик сессии. В этом случае он ничего не делает, потому что нет файлов
Фабиан Шменглер
Затем вам нужно перейти в System> Permissions> Roles и сохранить роль.
Hiral Unadkat
Что приводит нас к другой проблеме с вашим ответом: даже если это работает, это больше усилий, чем выход из системы и возврат, чего ОП хочет избежать.
Фабиан Шменглер
0

Попробуй это:

  1. Зайдите в Админ -> Система -> Управление кешем
  2. Выбрать все типы кэша
  3. Сохраните действие как Обновить и нажмите Подтвердить.
Шефали Сингх
источник