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


305

如何在Magento中完成以下任务?

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

  • 如何向该控制器(如果需要,或新控制器)添加方法,该方法与模型交互并执行查询Select * FROM articles where id='10',并将行(包含column id, title, content)返回给控制器?然后使用控制器包括一个视图,该视图将显示该行。所以去http://example.com/myController/show_row(或类似的东西)将在视图中显示行。(无需花哨,只需一个echo $row->id;或类似的东西即可。)

有关Magento代码结构的任何其他信息也将非常有帮助。


6
看来系统并没有增加您的悬赏。
艾伦·斯托姆

2
我无法打开赏金,因为它没有使用48个小时。.但我会尽快将其打开,我将授予最佳答案
单击Upvote,2009年

啊,我不知道赏金只适用于较老的帖子,很抱歉。
艾伦·斯托姆

3
小时候,他总是对经纪人着迷。他的代码以相同的方式工作。
vol7ron 2011年

Answers:


539

首先,我强烈建议您从PHP Architect购买PDF / E-Book。它的价格是20美元,但这是我能够找到的唯一直接的“ Magento的工作原理”资源。我也已经开始在自己的网站上编写Magento教程

其次,如果您有选择,并且不是经验丰富的程序员,或者没有经验丰富的程序员(最好使用PHP Java),请选择另一个购物车。Magento经过精心设计,但被设计为购物车解决方案,其他程序员可以在其上构建模块。并不是为了让聪明的人(而不是程序员)容易理解它。

第三,Magento MVC与Ruby on RailsDjangoCodeIgniterCakePHP等非常不同。MVC模型如今在PHP开发人员中很流行。我认为它基于Zend模型,整个过程非常类似于Java OOP。有2级需要被关心的控制器。模块/ frontName控制器,然后是MVC控制器。

第四,Magento应用程序本身是使用与您将使用的模块系统相同的模块构建的,因此,在核心代码中打针是一种有用的学习策略。另外,您将使用Magento进行的许多操作都将覆盖现有类。我在这里介绍的是创建新功能,而不是覆盖。在查看那里的代码示例时,请记住这一点。

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

Magento使用EAV数据库架构。尽可能尝试使用系统提供的模型对象来获取所需的信息。我知道SQL表中都有它们,但是最好不要考虑使用原始SQL查询来获取数据,否则您会发疯。

最终免责声明。我已经使用Magento大约两三周了,所以请注意。这是一个练习,它可以尽可能多地帮助我解决堆栈溢出问题。

创建一个模块

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是用于修改的唯一名称空间,它不一定是您公司的名称,但是建议的约定是我的名称。HelloWorld是您模块的名称。

清除应用程序缓存

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

  1. 转到系统->缓存管理
  2. 从“所有缓存”菜单中选择“刷新”
  3. 点击保存缓存设置

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

  1. 转到系统->配置
  2. 点击高级
  3. 在“禁用模块输出”设置框中,查找名为“ 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您要运行什么代码。

设置路由器

接下来,我们需要设置模块的路由器。这会让系统知道我们正在处理以下形式的网址

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";
    }
}

我们刚刚设置的是module / 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控制器类,以了解应如何使用模型和模板/布局系统。


4
谢谢,这是非常有帮助的。请考虑添加一些有关使用模型/数据库和视图的信息,以便您的答案能够完整
单击“更新”,2009年

7
确保app / code / local / MyCompanyName / HelloWorld / etc / config.xml与etc / modules中的xml具有相同的大小写(MyCompanyName_HelloWorld不是mycompanyname_helloworld),否则后端中会有条目!
莫阿克

8
对于Alan的完美答案,我只作了一点评论:“我们刚刚设置的是module / frontName控制器。这不是MVC控制器。” 它与FooController是完全相同的控制器类型。在ZF中,默认情况下会调用IndexController中的index action,因此请求example.com/magento/index.php/helloworld将在helloworld模块中调用IndexController :: indexAction()。因此,调用... / helloworld / foo将尝试在helloworld模块中找到FooController并对其调用indexAction()。要触发IndexController :: fooAction(),您需要请求:... / helloworld / index / foo。
Matus Zeman

2
确保您阅读了@Matus Zeman的响应,以了解为什么在IndexController上找不到fooAction,这只是一个“正常”的Zend Framework MVC /路由器,并且使用了错误的url,因此应删除“这不是MVC控制器”部分。
regilero

2
@ hypervisor666打开“开发人员模式”(使用Google)。在开发人员模式下,Magento会因XML文件中的任何错误而崩溃。
艾伦·风暴

39

在过去的一个月左右的时间里,我一直在与Magento进行角力,但我仍在努力弄清楚。因此,这是盲人领先盲人的情况。文档的方式很少,而且论坛/ Wiki充其量是混乱的。不仅如此,还有一些解决方案已经过时或远非最佳。我不确定您是否有一个项目或只是想弄清楚它,但是如果您从修改现有功能开始而不是创建全新的东西,可能会更容易。为此,我肯定会选择Wiki中的“针对开发人员的推荐文章”。新的付款方式真是大开眼界。

对于调试,我绝对建议您使用FirePHP并在出现问题时查看HTML源代码。ole echo调试方法不能很好地工作。

总体架构是如此令人麻木,即使我完全理解它,也需要写一本书来涵盖它。我能做的最好的就是给您建议,希望我刚开始时有人给我...

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

Magento使用由XML组成的配置文件来决定它需要做什么。为了使其能够运行自己的东西而不是核心功能,您需要正确的xml。不幸的是,没有关于如何构建XML的指南。您需要查看示例并进行一些认真的测试。使事情复杂化的是,这些文件的内容在很大程度上区分大小写。但是,如果您掌握了这些知识,则可以覆盖基本功能的任何部分,从而使系统非常强大。

Magento的使用方法一样Mage::getModel('mymodel')Mage::getSingleton('mysingleton')Mage::helper('myhelper')返回特定类的对象。默认情况下,它将在其核心名称空间中找到它们。如果要使用自己的文件,则需要在config.xml文件中覆盖它们。

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

Magento中的许多对象最终都扩展了一个称为的对象Varien_Object。这是一个通用类(有点像瑞士军刀),其生活目的是允许您动态定义自己的方法/变量。例如,您将看到它用作修饰数组,用于将数据从一种方法传递到另一种方法。

在开发过程中,请确保已禁用缓存。它会使magento慢得令人难以置信,但会为您省去很多头部创伤(因为将其撞在桌子上)。

您会发现$this经常使用它。根据您看到的文件,这意味着一个不同的类。get_class($this)是您的朋友,尤其是与FirePHP一起使用时。

把事情记在纸上。很多。遇到它们后,您将需要1-2天的无数小类事实。

Magento喜欢OO。如果跟踪方法将您带入5-10个不同的类,请不要感到惊讶。

此处阅读设计师指南。它主要用于图形设计人员,但是您需要它来了解模块输出的输出位置和原因。为此,请不要忘记在管理面板的开发人员部分中打开“模板路径提示”。

还有更多,但是在这变成论文之前,我将在这里停止。


如果可以的话,请发布更多信息,所有信息都将非常有用:)
单击Upvote

Misa,您可能应该在Stackoverflow上注册,如果您丢失了Cookie,所有代表都将消失;)
单击Upvote 09年

谢谢!这非常有帮助。Ner
Ner

2

我宁愿推荐Mage2Gen,这将帮助您生成样板,并且您可以专注于核心业务逻辑。它只会帮助加速事情。


0

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

模块声明

我们必须使用配置文件来声明模块。作为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>

模块 的注册必须使用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__
);

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

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

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


0

我试图从magaplaza hello world教程制作我的模块,但是出了点问题。我从github 导入了这个模块的代码https://github.com/astorm/magento2-hello-world,它起作用了。从该模块中,我创建了一个类别子类别ajax select下拉模块。在magento2安装AAP /代码目录中安装它后按照这个网址.. http://www.example.com/hello_mvvm/hello/world 你可以从这里下载它的代码https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns 并将其放在您的aap / code文件夹中。而不是运行这些命令...

php bin/magento setup:update
php bin/magento setup:static-content:deploy -f
php bin/magento c:c

现在,您可以使用以下URL http:// {{www.example.com}} / hello_mvvm / hello / world检查模块功能


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.