【问题标题】:Magento Module with Frontend and Admin functionality具有前端和管理功能的 Magento 模块
【发布时间】:2012-08-03 09:27:17
【问题描述】:

我目前正在为 Magento 开发一个自定义模块。我了解包、模块和路由器的基础知识,并且我已经构建了模块的前端部分。

不过,我现在正在转向管理方面的工作。但是,我对如何将管理部分添加到路由器并让它调用相关控制器感到有些困惑。

假设我已经创建了这些路由器...

<frontend>
    <routers>
        <slider>
            <use>standard</use>
            <args>
                <module>Mypackage_Myodule</module>
                <frontName>Mymodule</frontName>
            </args>
        </slider>
    </routers> 
</frontend> 
<admin>
    <routers>
        <mymoduleadmin>
            <use>admin</use>
            <args>
                <module>Mypackage_Myodule</module>
                <frontName>Mymodule</frontName>
            </args>
        </mymoduleadmin>
    </routers>
</admin>

我认为这两个路由器都会尝试调用 controllers/IndexController.php 并因此具有相同的功能?是否可以进行设置,以便我的路由器根据它们是前端还是管理员调用不同的控制器?这甚至可能吗?还是我需要设置一个前端模块和一个管理模块?

如果这是一个男生的问题,我深表歉意,但这让我有点困惑,实际上我只想知道设置具有前端和管理功能的自定义模块的最有效方法。

【问题讨论】:

    标签: magento module admin frontend controllers


    【解决方案1】:

    根据区域(frontend 或 adminhtml),调度 frontend 或 adminhtml 路由器。
    因此,只要您为前端和 adminhtml 使用不同的控制器文件,前端控制器从 Mage_Core_Controller_Front_Action 扩展和 adminhtml 从 Mage_Adminhtml_Controller_Action 扩展,您就不必担心它会搞砸。

    Frontend / Adminhtml 路由器可以定义为(只是一种语法):

    <frontend>
        <routers>
            <[module]>
                <use>standard</use>
                <args>
                    <module>[Namespace]_[Module]</module>
                    <frontName>[module]</frontName>
                </args>
            </[module]>
        </routers>
    </frontend>
    <admin>
        <routers>
            <[module]>
                <use>admin</use>
                <args>
                    <module>[Namespace]_[Module]</module>
                    <frontName>[module]</frontName>
                </args>
            </[module]>
        </routers>
    </admin>
    

    您可以在以下位置创建前端控制器:app/code/[codePool]/[Namespace]/[Module]/controllers/
    例如:

    <?php
    //file: app/code/local/MagePsycho/Testmodule/controllers/IndexController.php
    class MagePsycho_Testmodule_IndexController extends Mage_Core_Controller_Front_Action
    {
        public function indexAction(){
    
        }
    }
    

    为了从 url 访问它:http://your-magento-url/testmodule/index/index
    和 adminhtml 控制器下: app/code/[codePool]/[Namespace]/[Module]/controllers/Adminhtml/
    例如:

    <?php
    //file: app/code/local/MagePsycho/Testmodule/controllers/Adminhtml/IndexController.php
    class MagePsycho_Testmodule_Adminhtml_IndexController extends Mage_Adminhtml_Controller_Action
    {
        public function indexAction(){
    
        }
    }
    


    为了从 url 访问它:http://your-magento-url/testmodule/adminhtml_index/index
    (可以看到用于分隔adminhtml控制器的Adminhtml文件夹)

    希望这能给你一些信息。
    谢谢

    【讨论】:

    • 对不起,我以为我有这个,但我没有。我想我迷失的是什么叫我的管理控制器,我应该把它放在目录结构的什么地方?正如你所说,我需要一个扩展 Mage_Core_Controller_Front_Action 的标准索引控制器和一个扩展 Mage_Adminhtml_Controller_Action 的管理控制器。
    • MagePsycho 所以我的管理控制器的目录结构看起来像 /Module/controllers/Adminhtml/IndexController.php..?
    • 是的,你是对的。另外,我更新了我的帖子。请检查一次。
    • @Robert Waller 如果您有任何疑问,请告诉我?
    • 真的很抱歉我按照你说的做了这个设置。但是每个路由器只是加载前端控制器。我无法让管理路由器加载 /controllers/Adminhtml/IndexController.php 它只是加载 /controllers/IndexController.php 似乎我在这里缺少一些非常基本的东西。我会发出什么 http 请求来访问管理控制器?我假设它只是example.com/frontName..?如果我给前端和管理员路由不同的前端名称?
    【解决方案2】:

    看看我的类似问题:Admin route in custom modules

    我也建议使用

    <admin>
     <routers>
       <adminhtml>
         <args>
           <modules>
             <modulename before="Mage_Adminhtml">Namespace_Module_Adminhtml</modulename>
           </modules>
         </args>
       </adminhtml>
     </routers>
    </admin>
    

    这将允许您避免在路由中使用 adminhtml 部分,因此您的模块后端 url 将具有像核心模块一样简单而干净的 url,例如admin/mymodule

    【讨论】:

    • 这里也一样。我更喜欢这种方式来获得更清晰的网址,尽管 MagePsycho 所说的也有效。
    猜你喜欢
    • 2015-10-03
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多