Jak uniknąć błędu 404 podczas instalacji nowego rozszerzenia


27

Jest to bardzo częsty błąd, który pojawia się w Magento podczas instalowania nowego rozszerzenia w pliku system.xml config:

Po przejściu do System->Configuration->Extensionzakładki wyświetlany jest błąd 404. Musisz się wylogować i zalogować ponownie, a następnie będzie w porządku. Ale czy jest jakiś sposób, aby tego uniknąć?


Nie sądzę, aby drzewo ACL było ładowane podczas logowania i przechowywane w sesji użytkowników.
Peter O'Callaghan

Mam jeden pomysł, ale nie wiem, czy to możliwe. Możesz zmienić zachowanie „Magento Connect Manage”, aby wygasać wszystkie sesje administratora po zainstalowaniu rozszerzenia. Ale nie można tego zrobić z zakresu rozszerzenia (((tylko z zakresu Connect Managera.
oleksii.svarychevskyi

2
Twoje pytanie odpowiedziało na moje pytanie! Dzięki!
Ian Phillips

Musiałem zostawić komentarz, ponieważ, jak powiedział Ian: „Twoje pytanie odpowiedziało na moje pytanie”. Logowanie załatwiło sprawę!
Hans Wassink,

Odpowiedzi:


16

Jak powiedział @Cags, nie jest to (łatwo) możliwe, ponieważ drzewo ACL jest ładowane podczas inicjowania sesji (AKA, gdy administrator loguje się).
Możliwym obejściem byłoby zastąpienie _isSectionAllowedmetody w kontrolerze konfiguracji systemu: ( Mage_Adminhtml_System_ConfigController::_isSectionAllowed) i ponowne załadowanie drzewa ACL.
Coś jak:

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
}

Ale to oznacza, że ​​drzewo ACL będzie ładowane ponownie za każdym razem, gdy uzyskasz dostęp do sekcji konfiguracji. Nie widzę sensu tego robić.
Nie można również tego zrobić dla jednego konkretnego rozszerzenia. Będziesz musiał przepisać klasę podstawową.


Może lepiej byłoby zresetować drzewo ACL tylko, jeśli sekcja nie jest dozwolona. Szczerze mówiąc, nigdy nie przypominam sobie próby załadowania sekcji, która nie była dozwolona przez ACL, inaczej niż po instalacji modułu i przed ponownym zalogowaniem się administratora.
pspahn

Po prostu szalony pomysł, ponieważ nigdy go nie wypróbowałem i nie jestem pewien, czy sesja jest dostępna w tym momencie, ale czy można przeładować ze skryptu instalacyjnego? Oczywiście działa to tylko wtedy, gdy skrypt instalacyjny zostanie wywołany przez żądanie, w którym jesteś zalogowany jako administrator i nie wpłynie to na innych zalogowanych użytkowników zaplecza
Fabian Schmengler,

2
@fschmengler. Nie próbowałem tego wcześniej, ale myślę, że to może zadziałać. Szczerze mówiąc, nie sądzę, żeby było warto.
Marius

9

Znalazłem sposób na obejście tego przy bardzo niewielkich dostosowaniach. Potrzebujemy:

  1. Nowa akcja kontrolera, która ponownie ładuje listę ACL (bez wylogowania i zalogowania), a następnie przekierowuje z powrotem na poprzednią stronę:

    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. Aktualizacja układu dla admin_norouteuchwytu. Dodamy link do tej nowej akcji kontrolera bezpośrednio na stronie admin 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. I szablon z linkiem:

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

Wrzuciłem to do małego rozszerzenia na Github: SSE_AclReload (dodaje link również do menu System> Uprawnienia )

Możesz także spróbować ponownie załadować ACL automatycznie, gdy tylko zostanie uruchomiona akcja admin / noroute, ale wolę 1) wiedzieć, co się dzieje i 2) mieć wybór.


1

Jeśli masz problem z instalacją nowego rozszerzenia i wyświetleniem strony błędu 404 , musisz tylko zrobić jedną rzecz System > Permissions > Roles. Po prostu zapisz rolę i nie zapomnij wyczyścić, var/cachea var/seesion Twój problem został rozwiązany.


„wyczyść var ​​/ sesję”? Wylogować wszystkich klientów i opróżnić ich koszyki? Nie.
Fabian Schmengler

nup, po prostu wyczyść sesję, w folderze var
Hiral Unadkat

Niestety to jest to samo. Z wyjątkiem sytuacji, gdy nie używasz modułu obsługi sesji plików. W takim przypadku nic nie robi, ponieważ nie ma plików
Fabian Schmengler

Następnie musisz przejść do System> Uprawnienia> Role i zapisać rolę.
Hiral Unadkat

Co prowadzi nas do drugiego problemu z twoją odpowiedzią: nawet jeśli zadziała, jest to większy wysiłek niż wylogowanie i ponowne zalogowanie, którego OP chce uniknąć.
Fabian Schmengler

0

Spróbuj tego:

  1. Przejdź do Administrator -> System -> Zarządzanie pamięcią podręczną
  2. Wybierz cały typ pamięci podręcznej
  3. Zachowaj akcję jako Odśwież i naciśnij Prześlij.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.