首页 文章

如何在Magento中创建一个简单的'Hello World'模块?

提问于
浏览
297

如何在Magento完成以下任务?

  • 使用控制器/视图/模型方法显示"Hello World"消息 . 所以,如果我去了 http://example.com/myController ,它会显示字符串'Hello World' . 能够在我的网站模板中显示此字符串(例如,页眉,页脚等)将是一个奖励 .

  • 如何向该控制器(或必要时的新控制器)添加方法,该方法与模型交互,并执行查询 Select * FROM articles where id='10' 并将行(包含列 id, title, content )返回给控制器?然后使用控制器包含一个视图,该视图将显示此行 . 因此,转到 http://example.com/myController/show_row (或类似的东西)会在视图中显示该行 . (不需要花哨,只是 echo $row->id; 或类似的东西会起作用 . )

关于Magento代码结构的任何其他信息也将非常有用 .

4 回答

  • 2

    首先,我强烈建议你买PDF/E-Book from PHP Architect . 它's US$20, but is the only straightforward 585904 resource I'已经能够找到 . 我也开始写Magento tutorials at my own website .

    其次,如果你有一个选择,并且没有经验丰富的程序员(理想情况下是PHP和Java),那么 pick another cart . Magento设计精良,但它被设计成一个购物车解决方案,其他程序员可以在其上构建模块 . 它的设计并不容易被聪明的人理解,但不是程序员 .

    第三,Magento MVC与Ruby on RailsDjangoCodeIgniterCakePHP等MVC模型非常不同,基于Zend模型的's popular with PHP developers these days. I think it',整个事情非常类似于Java OOP . 你需要关注 two 控制器 . 模块/ frontName控制器,然后是MVC控制器 .

    第四,Magento应用程序本身是使用与Magento相同的模块系统构建的,现有的类是 overriding . 我在这里介绍的是 creating 新功能,而不是覆盖 . 当你在那里查看代码样本时,请记住这一点 .

    我将从您的第一个问题开始,向您展示如何设置控制器/路由器以响应特定的URL . 这将是一部小小说 . 我可能稍后有时间讨论与模型/模板相关的主题,但就目前而言,我没有 . 但是,我将简要地谈谈您的SQL问题 .

    Magento使用EAV数据库架构 . 尽可能尝试使用系统提供的模型对象来获取所需的信息 . 我知道's all there in the SQL tables, but it'最好不要考虑使用原始SQL查询抓取数据,否则你会发疯 .

    最后的免责声明 . 我已经使用Magento大约两三个星期了,所以请注意 . 这是一个练习,可以直接解决这个问题,就像帮助Stack Overflow一样 .

    创建一个模块

    Magento的所有添加和自定义都是通过模块完成的 . 因此,您需要做的第一件事是创建一个新模块 . 在 app/modules 中创建一个XML文件,命名如下

    cd /path/to/store/app
    touch etc/modules/MyCompanyName_HelloWorld.xml
    
    <?xml version="1.0"?>
    <config>
         <modules>
            <MyCompanyName_HelloWorld>
                <active>true</active>
                <codePool>local</codePool>
            </MyCompanyName_HelloWorld>
         </modules>
    </config>
    

    MyCompanyName是您修改的唯一命名空间,它没有't have to be your company'的名称,但推荐的约定是我的magento . HelloWorld 是模块的名称 .

    清除应用程序缓存

    现在模块文件到位了,我们需要让Magento了解它(并检查我们的工作) . 在管理应用程序中

    • 进入系统 - >缓存管理

    • 从“所有缓存”菜单中选择“刷新”

    • 单击“保存缓存设置”

    现在,我们确保Magento了解该模块

    • 进入系统 - >配置

    • 单击“高级”

    • 在"Disable modules output"设置框中,查找名为"MyCompanyName_HelloWorld"的新模块

    如果您可以忍受性能下降,则可能需要在开发/学习时关闭应用程序缓存 . 没有什么比这更令人沮丧的了,忘记清除缓存并想知道为什么你的更改没有出现 .

    设置目录结构

    接下来,我们需要为模块设置目录结构 . 你不需要所有这些目录,但现在设置它们没有任何害处 .

    mkdir -p app/code/local/MyCompanyName/HelloWorld/Block
    mkdir -p app/code/local/MyCompanyName/HelloWorld/controllers
    mkdir -p app/code/local/MyCompanyName/HelloWorld/Model
    mkdir -p app/code/local/MyCompanyName/HelloWorld/Helper
    mkdir -p app/code/local/MyCompanyName/HelloWorld/etc
    mkdir -p app/code/local/MyCompanyName/HelloWorld/sql
    

    并添加配置文件

    touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml
    

    在配置文件中,添加以下内容,这实际上是一个“空白”配置 .

    <?xml version="1.0"?>
    <config>
        <modules>
            <MyCompanyName_HelloWorld>
                <version>0.1.0</version>
            </MyCompanyName_HelloWorld>
        </modules>
    </config>
    

    这个配置文件过于简单化,可以让你告诉Magento你想要运行什么代码 .

    设置路由器

    接下来,我们需要设置模块的路由器 . 这将让系统知道我们正在处理任何形式的URL

    http://example.com/magento/index.php/helloworld
    

    因此,在配置文件中,添加以下部分 .

    <config>
    <!-- ... -->
        <frontend>
            <routers>
                <!-- the <helloworld> tagname appears to be arbitrary, but by
                convention is should match the frontName tag below-->
                <helloworld>
                    <use>standard</use>
                    <args>
                        <module>MyCompanyName_HelloWorld</module>
                        <frontName>helloworld</frontName>
                    </args>
                </helloworld>
            </routers>
        </frontend>
    <!-- ... -->
    </config>
    

    你在这里说的是“任何带有helloworld的frontName的URL ......

    http://example.com/magento/index.php/helloworld
    

    应该使用frontName控制器MyCompanyName_HelloWorld“ .

    因此,通过上述配置,当您加载上面的helloworld页面时,您将获得一个404页面 . 那是因为我们没有为控制器创建文件 . 我们现在就这样做 .

    touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php
    

    现在尝试加载页面 . 进展!而不是404,你将获得PHP / Magento例外

    Controller file was loaded but class does not exist
    

    因此,打开我们刚刚创建的文件,并粘贴以下代码 . 类的名称需要基于您在路由器中提供的名称 .

    <?php
    class MyCompanyName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
        public function indexAction(){
            echo "We're echoing just to show that this is what's called, normally you'd have some kind of redirect going on here";
        }
    }
    

    我们刚刚设置的是模块/ frontName控制器 . 这是默认控制器和模块的默认操作 . 如果你想添加控制器或动作,你必须记住,Magento URL的树的第一部分是不可变的,它们总是这样 - http://example.com/magento/index.php/frontName/controllerName/actionName

    所以,如果你想匹配这个网址

    http://example.com/magento/index.php/helloworld/foo
    

    你必须有一个FooController,你可以这样做:

    touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
    
    <?php
    class MyCompanyName_HelloWorld_FooController extends Mage_Core_Controller_Front_Action{
        public function indexAction(){
            echo 'Foo Index Action';
        }
    
        public function addAction(){
            echo 'Foo add Action';
        }
    
        public function deleteAction(){
            echo 'Foo delete Action';
        }
    }
    

    请注意,默认控制器IndexController和默认操作indexAction可以隐式但必须是显式的,如果它后面的东西 . 所以 http://example.com/magento/index.php/helloworld/foo 将匹配控制器FooController和动作indexAction而不是IndexController的动作fooAction . 如果你想拥有一个fooAction,在控制器IndexController中你必须像这样显式地调用这个控制器: http://example.com/magento/index.php/helloworld/index/foo 因为url的第二部分是并且将永远是controllerName . 此行为是Magento中捆绑的Zend Framework的继承 .

    您现在应该能够点击以下URL并查看echo语句的结果

    http://example.com/magento/index.php/helloworld/foo
    http://example.com/magento/index.php/helloworld/foo/add
    http://example.com/magento/index.php/helloworld/foo/delete
    

    所以,这应该给你一个关于Magento如何调度到控制器的基本想法 . 从这里开始,我建议在现有的Magento控制器类中查看模型和模板/布局系统的使用方法 .

  • 0

    在过去的一个月左右的时间里,我一直在和Magento搏斗,我还在努力解决这个问题 . 所以这就是盲人领导盲人的情况 . 文档的方式很少,论坛/维基充其量只是混乱 . 不仅如此,还有一些解决方案已经过时或远非最佳 . 我不确定你是否有一个项目或只是想弄明白,但如果你开始修改现有的功能而不是创造一些全新的东西,那可能会更容易 . 为此,我肯定会在维基中使用“推荐开发人员的文章” . 新的付款方式令人大开眼界 .

    对于调试我肯定会推荐using FirePHP并在出现问题时查看您的HTML源代码 . ole echo调试方法并没有真正发挥作用 .

    一般的架构是如此令人难以置信的复杂,即使我完全理解它,我也需要写一本书来掩盖它 . 我能做的最好的就是给你建议,我希望有人在我刚开始的时候给了我...

    远离核心文件 . 不要修改它们,而是编写自己的模块并覆盖您需要的模块 .

    Magento使用由XML组成的配置文件来决定它需要做什么 . 为了让它运行你自己的东西而不是核心功能,你需要正确的xml . 遗憾的是,没有关于如何构建XML的指南;你需要看一些例子并做一些严肃的测试 . 更复杂的是,这些文件的内容在很大程度上区分大小写 . 但是,如果掌握了这些功能,您可以覆盖基本功能的任何部分,从而构成一个功能非常强大的系统 .

    Magento使用 Mage::getModel('mymodel')Mage::getSingleton('mysingleton')Mage::helper('myhelper') 等方法返回某些类的对象 . 它默认在其核心命名空间中找到它们 . 如果您希望它使用您自己的,您需要在 config.xml 文件中覆盖它们 .

    类的名称必须与它们所在的文件夹相对应 .

    Magento中的很多对象最终会扩展名为 Varien_Object 的东西 . 这是一个通用类(有点像瑞士军刀),它的目的是让你能够动态定义自己的方法/变量 . 例如,您将看到它用作一个美化数组,用于将数据从一个方法传递到另一个方法 .

    在开发过程中,请确保禁用缓存 . 它会让magento变得极其缓慢,但它会为你节省很多头部创伤(从敲打你的 table 上) .

    你会看到 $this 被大量使用 . 它意味着一个不同的类,具体取决于您看到的文件 . get_class($this) 是你的朋友,特别是与FirePHP一起使用 .

    记下纸上的东西 . 很多 . 在你遇到它们1-2天之后,你将需要无数的小事实 .

    Magento喜欢OO . 如果跟踪方法会带您通过5-10个不同的类,请不要感到惊讶 .

    阅读设计师指南here . 它主要面向图形设计人员,但您需要它来了解模块输出的最终位置和原因 . 为此,请不要忘记在管理面板的开发人员部分打开"Template path hints" .

    还有更多,但在此变成论文之前我会停在这里 .

  • 36

    我宁愿推荐Mage2Gen,这将帮助您生成样板,您可以专注于核心业务逻辑 . 它只是有助于加快速度 .

  • 528

    Magento模块是一组包含需要的块,控制器,帮助程序和模型的目录创建特定的商店功能 . 它是Magento平台中的定制单元 . 可以创建Magento模块以执行具有支持逻辑的多种功能,以影响用户体验和店面外观 . 它具有允许安装,删除或禁用它们的生命周期 . 从商家和扩展开发人员的角度来看,模块是Magento平台的核心单元 .

    Declaration of Module

    我们必须使用配置文件声明模块 . 由于Magento 2在模块的etc目录中搜索配置模块 . 所以现在我们将创建配置文件module.xml .

    代码如下所示:

    <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Cloudways_Mymodule" setup_version="1.0.0"></module> </config>
    

    Registration of Module 必须使用Magento Component Registrar类在Magento 2系统中注册该模块 . 现在我们将在模块根目录中创建文件registration.php:

    app/code/Cloudways/Mymodule/registration.php
    

    守则将如下所示:

    ?php
    \Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Cloudways_Mymodule',
    __DIR__
    );
    

    Check Module Status 完成上述步骤后,我们将创建一个简单的模块 . 现在,我们将使用以下命令行检查模块的状态以及是启用还是禁用它:

    php bin/magento module:status
    
    php bin/magento module:enable Cloudways_Mymodule
    

    完成整个过程后,请分享您的反馈

相关问题