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

2022-08-30 06:04:44

如何在Magento中完成以下工作?

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

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

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


答案 1

首先,我强烈建议您从PHP Architect购买PDF / 电子书。这是20美元,但这是我能找到的唯一一个直截了当的“这是Magento的工作原理”资源。我也开始在自己的网站上编写Magento教程

其次,如果你有选择,但不是一个有经验的程序员,或者没有一个有经验的程序员(最好是PHPJava),选择另一个购物车。Magento设计得很好,但它被设计成一个购物车解决方案,其他程序员可以在其上构建模块。它的设计并不容易被那些聪明但不是程序员的人理解。

第三,Magento MVC与Ruby on RailsDjangoCodeIgniterCakePHP等非常不同。MVC模型现在在PHP开发人员中很受欢迎。我认为它是基于Zend模型的,整个事情非常像Java OOP。您需要关注个控制器。模块/前端名称控制器,然后是 MVC 控制器。

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

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

Magento使用EAV数据库架构。只要有可能,请尝试使用系统提供的模型对象来获取所需的信息。我知道这一切都在SQL表中,但最好不要想到使用原始SQL查询来抓取数据,否则你会发疯。

最终免责声明。我已经使用Magento大约两三个星期了,所以警告emptor。这是一个练习,让我的头脑直通无阻,就像它可以帮助Stack Overflow一样。

创建模块

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

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. 转到系统>缓存管理
  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

应使用前端名称控制器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 可以通过隐式操作,但如果它后面有东西,则必须是显式的。因此,将匹配控制器 FooController 和操作 indexAction,而不是 IndexController 的 action fooAction。如果你想有一个fooAction,在控制器IndexController中,你必须像这样显式调用这个控制器:因为url的第二部分是并且将永远是controrName。此行为是捆绑在 Magento 中的 Zend 框架的继承。http://example.com/magento/index.php/helloworld/foohttp://example.com/magento/index.php/helloworld/index/foo

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

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控制器类,看看应该如何使用模型和模板/布局系统。


答案 2

在过去的一个月左右的时间里,我一直在与Magento摔跤,我仍然在努力弄清楚。所以这是盲人领导盲人的案例。文档的方式很少,论坛/维基充其量是混乱的。不仅如此,还有几种解决方案要么已经过时,要么远非最佳。我不确定你是否有一个项目,或者只是试图弄清楚它,但如果你从修改现有功能开始,而不是创建一些全新的东西,这可能会更容易。为此,我肯定会在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变得非常慢,但它会为你节省很多头部创伤(从敲打你的桌子上)。

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

在纸上记下东西。好多。有无数的小事实,你会遇到它们后1-2天。

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

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

还有更多,但在这变成一篇论文之前,我会在这里停下来。


推荐