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

如何在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代码结构的信息也将非常有帮助。

113810 次浏览
在过去的一个月左右,我一直在与Magento搏斗,我仍然试图弄清楚它。所以这是一个盲人给盲人引路的例子。几乎没有文档,论坛/wiki最多也就是混乱。不仅如此,还有一些解决方案要么已经过时,要么远远不是最佳的。 我不确定你是否有一个项目,或者只是想弄清楚,但如果你从修改现有功能开始,而不是创建全新的东西,可能会更容易。为此,我肯定会选择wiki上的“开发者推荐文章”。新的支付方式真让人大开眼界

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

它的总体架构是如此复杂,以至于即使我完全理解它,我也需要写一本书来介绍它。我所能做的就是给你一些建议,我希望在我刚开始工作时有人能给我一些建议……

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

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个不同的类,不要感到惊讶。

阅读设计师指南在这里。它主要是为图形设计师设计的,但你需要它来理解模块的输出将在哪里以及为什么结束。为此,不要忘记在管理面板的开发人员部分打开“模板路径提示”。

还有更多,但在这变成论文之前,我就讲到这里。

首先,我强烈建议你购买PDF/电子书从PHP架构师。这款游戏售价20美元,但却是我所能找到的唯一直接的“Magento是如何运作的”资源。我还开始编写Magento教程在我自己的网站上

其次,如果你有选择,并且不是一个有经验的程序员或没有访问一个有经验的程序员(理想在PHP 而且 Java), 另挑一辆车. c。Magento设计得很好,但它被设计成一个购物车解决方案,其他程序员可以在其上构建模块。它不是为了让那些聪明但不是程序员的人容易理解而设计的。

第三,Magento MVC与Ruby on RailsDjangoCodeIgniterCakePHP等非常不同。MVC模型,这在PHP开发人员中很流行。我认为它是基于Zend模型的,整个事情非常像Java oop。你需要关注两个控制器。模块/frontName控制器,然后是MVC控制器。

第四,Magento应用程序本身是使用您将使用的相同模块系统构建的,因此研究核心代码是一种有用的学习策略。而且,你要用Magento做的很多事情都是压倒一切的现有类。我在这里讨论的是创建新功能,而不是重写。在查看代码示例时,请记住这一点。

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

Magento使用数据库架构。只要有可能,尽量使用系统提供的模型对象来获取所需的信息。我知道这些都在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是您的修改的唯一名称空间,它不必是您公司的名称,但建议约定我的magento。HelloWorld是模块的名称。

清除应用程序缓存

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

  1. 进入“System->Cache Management”
  2. 从所有缓存菜单中选择刷新
  3. 单击“保存缓存设置”

现在,我们要确保Magento知道这个模块

  1. 进入“System->Configuration”
  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您想运行什么代码。

设置路由器

接下来,我们需要设置模块的路由器。这将让系统知道我们正在处理的任何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

现在尝试加载页面。进步!您将得到一个PHP/Magento异常,而不是404

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

如果你想匹配这个url

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。如果你想在控制器IndexController中有一个fooAction,你必须像这样显式地调用这个控制器: http://example.com/magento/index.php/helloworld/index/foo,因为url的第二部分是并且将永远是controllerName。 这个行为是对捆绑在Magento中的Zend框架的继承

现在,您应该能够点击以下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控制器类,看看应该如何使用模型和模板/布局系统。

我宁愿推荐Mage2Gen,这将帮助你生成样板,你可以只关注核心业务逻辑。这有助于加快速度。

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

一旦你完成了整个过程,分享你的反馈

我试图从magaplaza hello world教程使我的模块,但出了问题。我从github导入了这个模块https://github.com/astorm/magento2-hello-world的代码,它工作了。 从那个模块,我创建了一个类别子类别ajax选择下拉模块。在magento2安装的aap/code目录中安装后,请遵循此URL..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检查模块功能