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ąć?

JohnyFree
źródło
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ą.

Marius
źródło
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.

Fabian Schmengler
źródło
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.

Hiral Unadkat
źródło
„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.
shefali singh
źródło