【问题标题】:Magento admin routing isn't workingMagento 管理员路由不起作用
【发布时间】:2011-06-17 16:51:14
【问题描述】:

我正在为 Magento 的管理区域开发一个模块。我正在尝试遵循 Alan Storm 在Magento admin controllers 上的教程,但似乎无法让我的控制器执行任何操作。我认为这可能与路由有关,但我不确定。它向我显示了带有 404 错误的前端模板。

(注意:我已经在这里包含了所有相关代码。实际问题在最底部。

该模块名为 Mynamespace_Donor,位于 app/code/local/Mynamespace/Donor/ 中。

我的 etc/config.xml 看起来像这样:

<?xml version="1.0"?>
<config>
    <modules>
        <Mynamespace_Donor>
            <version>0.1.0</version>
        </Mynamespace_Donor>
    </modules>
    <global>
        <helpers>
            <donor>
                <class>Mynamespace_Donor_Helper</class>
            </donor>
        </helpers>
        <resources>
            <donor_setup>
                <setup>
                    <module>Mynamespace_Donor</module>
                </setup>
            </donor_setup>
        </resources>
    </global>

    <admin>
        <routers>
            <donor>
                <use>admin</use>
                <args>
                    <module>Mynamespace_Donor</module>
                    <frontname>donor</frontname>
                </args>
            </donor>
        </routers>
    </admin>

    <adminhtml>
        <menu>
            <donor translate="title" module="donor">
                <title>Donor</title>
                <sort_order>42</sort_order>
                <children>
                    <manage_donors module="donor">
                        <title>Manage Donors</title>
                        <action>donor/index/index</action>
                    </manage_donors>
                </children>
            </donor>
        </menu>
    </adminhtml>
</config>

我的控制器/IndexController.php 看起来像这样:

<?php
class Mynamespace_Donor_IndexController extends Mage_Adminhtml_Controller_Action
{
    public function indexAction()
    {
        $this->loadLayout();

        //create a text block with the name of "example-block"
        $block = $this->getLayout()
        ->createBlock('core/text', 'example-block')
        ->setText('<h1>This is a text block</h1>');

        $this->_addContent($block);

        $this->renderLayout();
    }
}

菜单项将我指向/index.php/donor/index/index/key/e98a...,它显示了一个 404 页面。当我尝试直接访问/donor/index.php/donor/index.php/donor/index 等时,仍然会出现 404 错误。

如果我从配置中删除 &lt;helpers&gt;,Magento 会抱怨它找不到它。如果我删除 &lt;adminhtml&gt; 部分,它就会停止抱怨,即使我仍然有我的 &lt;admin&gt;&lt;routers&gt; 部分(不知道路由的东西是否需要帮助,或者这是否相关)。

我也尝试在&lt;adminhtml&gt; 下添加此块,但是当我尝试编辑角色权限时,我得到一个带有以下错误的白页:Fatal error: Class 'Mage_Mynamespace_Donor_Helper_Data' not found in /home/mysite/public_html/magento_dev_1_10/app/Mage.php on line 520

<acl>
    <resources>
        <admin>
            <children>
                <donor translate="title" module="Mynamespace_Donor">
                    <title>Donors</title>
                    <sort_order>60</sort_order>
                    <children>
                        <manage_donors>
                            <title>Manage Donors</title>
                        </manage_donors>
                    </children>
                </donor>
            </children>
        </admin>
    </resources>
</acl>

问题:我在这里做错了什么?为什么我无法访问此控制器?

最后,在 Alan 的示例代码中,URL 以模块名称开头,但我希望我的 URL 以 /admin/donor 开头,而不是 /donor。为此我需要进行哪些更改?


编辑 1 最终目标是在管理区域中有一个新选项卡,用于管理系统中的捐赠者和相关数据。当您单击某个菜单项时,我想显示一个网格并具有子选项卡和类似的东西。我希望覆盖 adminhtml 控制器 - 尽管我正在根据 Alan's suggestion 扩展它:

与标准的唯一区别 这里的控制器是我们 延伸 Mage_Adminhtml_Controller_Action 代替 Mage_Core_Controller_Varien_Action。 Mage_Adminhtml_Controller_Action 包含用于验证的重要代码 管理会话,以及几个 在管理员中有用的方法 控制台上下文。

所以在这张图片中,单击第一个子菜单项应该调用我的控制器的索引操作并显示一个网格或其他东西来管理捐赠者。

【问题讨论】:

  • 请考虑使用the module creator 为您构建所有这些配置内容。它使您免于大量样板文件,并且(从内存中)甚至具有用于带有网格的管理页面的模板。
  • 感谢您的提示,下次我一定会从该提示开始 :) 或者如果我遇到其他问题..

标签: php magento


【解决方案1】:

尝试替换:

<frontname>donor</frontname>

与:

<frontName>donor</frontName>

这将解决您的 404 错误。

【讨论】:

  • 效果很好,谢谢!为什么最大的问题总是归结为一个角色? :P 知道如何使 URL 以“/admin/donor”而不是“/donor”开头吗?
  • 这个答案是正确的,但如果使用 B00MER 的答案是多余的。
  • @clockworkgeek - 你是说我需要使用 B00MER 的解决方案来获取以“/admin”开头的 URL?
  • 我尝试将 &lt;frontName&gt; 设置为 admin/donor - 这使得菜单 URL 指向我想要的 (/admin/donor/index/index),但 404 问题又回来了:-/
  • 我认为'admin' 前缀在这一点上是不值得的。这让它与它一起工作,所以我会接受这个。再次感谢@clockworkgeek 和@B00MER 的帮助!我很感激。
【解决方案2】:
<config>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <mynamespace_donor before="Mage_Adminhtml">Mynamespace_Donor</mynamespace_donor>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

在您的 config.xml 中尝试上述方法

更多细节:

http://prattski.com/2010/06/24/magento-overriding-core-files-blocks-models-resources-controllers/

【讨论】:

  • 我认为这会覆盖 adminhtml 控制器。这真的是我想做的吗?我想我只是想扩展它,获得一些内置功能,但不干扰其他任何东西。
  • @Colin - 这并不完全覆盖 adminhtml,只是确保您的控制器在任何其他之前尝试,如果 URL 与您的控制器的操作不匹配,则 adminhtml 将正常处理。如果需要,您可以使用它来覆盖现有操作,但这是稍后的课程...
  • @clockworkgeek/B00MER - 明白了,这是有道理的。我能够通过 B00MER 的答案获得所需的 URL,但管理区域中的所有其他选项卡最终都会出现 404ing。我的控制器名为 IndexController,我的操作名为 indexAction。我是否需要更改其中任何一个的名称以防止它覆盖这些名称?如果是这样,我应该给它们起什么名字,我需要移动任何文件吗?
【解决方案3】:

关于致命错误;您在权限中有module="Mynamespace_Donor"。如果您查看 Alan 的教程,他有:

<tutorial_menu translate="title" module="adminhelloworld">

他使用 模块别名 而不是模块名称 - adminhelloworld 而不是 Alanstormdotcom_Adminhelloworld。 Magento 正在尝试寻找与翻译标题相关的助手。在您的情况下,您需要:

<donor translate="title" module="donor">

donor 来自您自己的配置文件:

<helpers>
    <donor> <!-- <<< This is the alias "donor" -->
        <class>Mynamespace_Donor_Helper</class>
    </donor>
</helpers>

【讨论】:

  • 谢谢,为我解决了权限问题:)
猜你喜欢
  • 1970-01-01
  • 2012-10-07
  • 2015-11-18
  • 2017-05-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
相关资源
最近更新 更多