لم يتم العثور على فئة وحدة التحكم الأمامية عند التوجيه من فئة جهاز التوجيه

magento.stackexchange https://magento.stackexchange.com//questions/86750

سؤال

بينما أنا على دراية التسجيل باستخدام وحدة تحكم الواجهة الأمامية ، وأنا لا يمكن أن يبدو للاستفادة من هذه وحدة تحكم الواجهة الأمامية من فئة جهاز التوجيه الخاص بي دون الترميز الثابت الأول فب تشمل فئة وحدة تحكم. الذي لا أعتقد أنه يجب أن يكون ضروريا إذا تم تكوين كل شيء بشكل صحيح. أود الاستفادة من فئة جهاز التوجيه هذه لمعرفة ما إذا كان عنوان ورل المطلوب هو تطابق لتمديد بلدي ، وإذا كان الأمر كذلك استدعاء وحدة تحكم/الإجراء المناسب.الإعداد الحالي الخاص بي هو كما يلي:

في بلدي التمديد الخ / التكوين.ملف شمل لقد سجلت كل من جهاز التوجيه وحدة تحكم:

<frontend>
    <routers>
        <doall_manual>
            <use>standard</use>
            <args>
                <module>DoALL_Manual</module>
                <frontName>doall_manual</frontName>
            </args>
        </doall_manual>
    </routers>
</frontend>
<default>
    <web>
        <routers>
            <doall_manual>
                <area>frontend</area>
                <class>DoALL_Manual_Controller_Router</class>
            </doall_manual>
        </routers>
    </web>
</default>

هنا هو صف جهاز التوجيه الخاص بي:

لاحظ ال require_once بيان هنا.أنا مقتنع بأن هذا السطر من التعليمات البرمجية هو ليس ضروريا إذا تم إعداد الامتداد الخاص بي بشكل صحيح.على سبيل المثال ، لا يوجد شيء من هذا القبيل.

class DoALL_Manual_Controller_Router extends Mage_Core_Controller_Varien_Router_Standard
{

    public function match(Zend_Controller_Request_Http $request)
    {
        // checking before even try to find out that current module
        // should use this router
        if (!$this->_beforeModuleMatch()) {
            return false;
        }

        $path = explode('/', trim($request->getPathInfo(), '/'));

        if ($path[0] != 'parts-manual') {
            return false;
        }

        $request
            ->setModuleName('doall_manual')
            ->setControllerName('manual');

        switch (count($path)) {
            case 1:
                $request->setActionName('index');
                break;

            case 2:
                $request->setActionName('manual');
                break;

            case 3:
                $request->setActionName('page');
                break;

            default:
                $request->setActionName('noroute');
                break;
        }

        // TODO: This line shouldn't be needed, but I'm unsure as to why it is not detecting the controller's location on it's own.
        require_once 'DoALL'.DS.'Manual'.DS.'controllers'.DS.'ManualController.php';

        $controllerInstance = Mage::getControllerInstance('DoALL_Manual_ManualController', $request, $this->getFront()->getResponse());

        // dispatch action
        $request->setDispatched(true);
        $controllerInstance->dispatch($request->getActionName());

        return true;
    }

}

بلدي تحكم الواجهة الأمامية:

class DoALL_Manual_ManualController extends Mage_Core_Controller_Front_Action
{
    /**
     * Display all manuals
     */
    public function indexAction()
    {
        echo __METHOD__;
    }

    /**
     * Display a manual's index
     */
    public function manualAction()
    {
        echo __METHOD__;
    }

    /**
     * Display the parts from a manual's page.
     */
    public function pageAction()
    {
        echo __METHOD__;
    }

}

من الواضح أنني لم أنتهي من تطوير وحدة التحكم هذه.ومع ذلك ، فإن نقطة هذا المنشور لا تتمحور حول محتويات إجراءات وحدة التحكم هذه.إنه ببساطة الوصول إلى هذه الإجراءات من جهاز التوجيه الخاص بي, دون الحاجة إلى القيام على وجه التحديد تتطلب بيان على ذلك أولا.

وحدة تحكم الواجهة الأمامية نفسها ، يعمل على ما يرام.هذه المسارات ورل في الواقع صدى أسماء الأسلوب كما هو متوقع:

/doall_manual/manual/
/doall_manual/manual/manual/
/doall_manual/manual/page/

علاوة على ذلك ، يعمل التكوين الحالي الخاص بي.كما أتوقع ، هذه المسارات ورل أداء كما هو متوقع أيضا:

/parts-manual/
/parts-manual/ANYTHING_HERE/
/parts-manual/ANYTHING_HERE/ANYTHING_HERE_ALSO/

وأخيرا, /parts-manual/ANYTHING_HERE/ANYTHING_HERE_ALSO/longer_url/ النتائج في الماجنتو 404 الصفحة.

بعض الملاحظات:

جهاز التوجيه الخاص بي يمتد Mage_Core_Controller_Varien_Router_Standard في حين أن جهاز التوجيه ماجي كمس يمتد Mage_Core_Controller_Varien_Router_Abstract.لقد حاولت تسجيل جهاز التوجيه الخاص بي بنفس الطريقة الماجنتو:

class DoALL_Manual_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract

وأضاف هذا إلى بلدي etc/config.xml ملف ، وعلق خارج بلدي التسجيل الأصلي لجهاز التوجيه من default/web/routers:

<global>
    <events>
        <controller_front_init_routers>
            <observers>
                <doall_manual>
                    <class>DoALL_Manual_Controller_Router</class>
                    <method>initControllerRouters</method>
                </doall_manual>
            </observers>
        </controller_front_init_routers>
    </events>
<global>

ثم أضاف في هذه الطريقة إلى جهاز التوجيه الخاص بي:

/**
 * Initialize Controller Router
 *
 * @param Varien_Event_Observer $observer
 */
public function initControllerRouters($observer)
{
    /* @var $front Mage_Core_Controller_Varien_Front */
    $front = $observer->getEvent()->getFront();

    $front->addRouter('doall_manual', $this);
}

هذا النهج ، في حين أنه يعمل، فإنه لا يزال لا يحل سؤالي الأصلي ل لماذا لا بد لي من تنفيذ الثابت مشفرة تتطلب بيان على فئة تحكم بلدي.

هل كانت مفيدة؟

المحلول

حسنا...بعد أخذ ما يقرب من ساعة لكتابة هذا السؤال أنا حلها حرفيا تماما كما انتهيت من كتابته.لذلك في محاولة لعدم إضاعة هذه الساعة على الأقل ، قررت نشرها حتى تتمكن من المساهمة بشيء ما في المجتمع.

هذا هنا, كان غير ضروري تماما:

$controllerInstance = Mage::getControllerInstance('DoALL_Manual_ManualController', $request, $this->getFront()->getResponse());

$request->setDispatched(true);
$controllerInstance->dispatch($request->getActionName());

هذه السطور كنت قد أضفت في ، في حين أخذ الإلهام من مشاركة إنشو من عام 2012.

التكوين النهائي هو كما يلي:

الخ / التكوين.شمل

<frontend>
    <routers>
        <doall_manual>
            <use>standard</use>
            <args>
                <module>DoALL_Manual</module>
                <frontName>doall_manual</frontName>
            </args>
        </doall_manual>
    </routers>
</frontend>
<default>
    <web>
        <routers>
            <doall_manual>
                <area>frontend</area>
                <class>DoALL_Manual_Controller_Router</class>
            </doall_manual>
        </routers>
    </web>
</default>

راوتر:

class DoALL_Manual_Controller_Router extends Mage_Core_Controller_Varien_Router_Standard
{

    public function match(Zend_Controller_Request_Http $request)
    {
        // checking before even try to find out that current module
        // should use this router
        if (!$this->_beforeModuleMatch()) {
            return false;
        }

        $path = explode('/', trim($request->getPathInfo(), '/'));

        if ($path[0] != 'parts-manual') {
            return false;
        }

        $request
            ->setModuleName('doall_manual')
            ->setControllerName('manual');

        switch (count($path)) {
            case 1:
                $request->setActionName('index');
                break;

            case 2:
                $request->setActionName('manual');
                break;

            case 3:
                $request->setActionName('page');
                break;

            default:
                $request->setActionName('noroute');
                break;
        }

        return true;
    }

}

المراقب المالي:

(لا توجد تغييرات ضرورية)

الكثير من الساعات التي قضاها حتى أتمكن من القضاء على سطر واحد من التعليمات البرمجية (بيان تتطلب)...

ربما..ربما فقط ، سيوفر هذا المنشور شخصا آخر ساعات من الإحباط يوما ما :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top