วิธีหลีกเลี่ยงข้อผิดพลาด 404 ในการติดตั้งส่วนขยายใหม่


27

เป็นข้อผิดพลาดทั่วไปที่แสดงใน Magento เมื่อคุณติดตั้งส่วนขยายใหม่ที่มีการกำหนดค่าsystem.xml :

เมื่อคุณไปที่System->Configuration->Extensionแท็บจะมีข้อผิดพลาด 404 ปรากฏขึ้น คุณต้องออกจากระบบและลงชื่อเข้าใช้อีกครั้งจากนั้นก็โอเค แต่มีวิธีที่จะหลีกเลี่ยงปัญหานี้หรือไม่?


ฉันไม่เชื่อเช่นนั้นทรี ACL จะถูกโหลดเมื่อคุณเข้าสู่ระบบและเก็บไว้ในเซสชันผู้ใช้
Peter O'Callaghan

ฉันมีความคิดเดียว แต่ไม่รู้ว่าเป็นไปได้หรือไม่ คุณสามารถเปลี่ยนลักษณะการทำงานของ "Magento Connect Manage" เพื่อหมดอายุเซสชันการดูแลระบบทั้งหมดหลังจากติดตั้งส่วนขยายแล้ว แต่มันเป็นไปไม่ได้ที่จะทำจากขอบเขตของการขยาย (((เฉพาะจากขอบเขตของตัวจัดการการเชื่อมต่อ
oleksii.svarychevskyi

2
คำถามของคุณตอบคำถามของฉัน! ขอบคุณ!
Ian Phillips

ฉันต้องแสดงความคิดเห็นเพราะเอียนพูดว่า: "คำถามของคุณตอบคำถามของฉัน" การล็อกทำเคล็ดลับได้!
Hans Wassink

คำตอบ:


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 ฉันไม่เคยลองมาก่อน แต่ฉันคิดว่ามันใช้ได้ จริง ๆ แล้วฉันไม่คิดว่ามันจะคุ้มค่ากับปัญหา
Marius

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 อีกครั้งโดยอัตโนมัติทันทีที่มีการส่งการดำเนินการของผู้ดูแลระบบ / noroute แต่ฉันต้องการ 1) รู้ว่าเกิดอะไรขึ้นและ 2) มีตัวเลือก


1

ถ้าคุณมีปัญหาใด ๆ เมื่อคุณติดตั้งส่วนขยายใหม่และได้รับข้อผิดพลาด 404System > Permissions > Rolesหน้าแล้วเท่านั้นสิ่งหนึ่งที่คุณต้องทำคือการไปลง เพียงแค่บันทึกบทบาทและไม่ลืมที่จะล้างvar/cacheและvar/seesion และปัญหาของคุณได้รับการแก้ไข


"ล้าง var / เซสชัน" หรือไม่ หากต้องการออกจากระบบลูกค้าทั้งหมดและล้างรถเข็นของพวกเขา? Nope
Fabian Schmengler

nup เพียงล้างเซสชั่นในโฟลเดอร์ var
Hiral Unadkat

น่าเสียดายที่นี่เหมือนกัน ยกเว้นถ้าคุณไม่ได้ใช้ตัวจัดการเซสชันไฟล์ ในกรณีนี้มันไม่ทำอะไรเลยเพราะไม่มีไฟล์
Fabian Schmengler

จากนั้นคุณต้องทำคือไปที่ระบบ> สิทธิ์> บทบาทและบันทึกบทบาท
Hiral Unadkat

ซึ่งนำเราไปสู่ปัญหาอื่น ๆ ด้วยคำตอบของคุณ: แม้ว่ามันจะใช้งานได้มันเป็นความพยายามมากกว่าการออกจากระบบและกลับเข้ามาใหม่ซึ่ง OP ต้องการหลีกเลี่ยง
เฟเบียน Schmengler

0

ลองสิ่งนี้:

  1. ไปที่ผู้ดูแลระบบ -> ระบบ -> การจัดการแคช
  2. เลือกประเภทแคชทั้งหมด
  3. ดำเนินการต่อเป็นรีเฟรชและกดส่ง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.