当前位置: 首页 > 面试题库 >

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

郝永思
2023-03-14
问题内容

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

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

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

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


问题答案:

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您要运行什么代码。

设置路由器

接下来,我们需要设置模块的路由器。这将使系统知道我们正在处理以下形式的所有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";
    }
}

我们刚刚设置的是module / frontName控制器。这是模块的默认控制器和默认操作。如果要添加控制器或动作,则必须记住,MagentoURL的树的第一部分是不可变的,它们将始终以这种方式运行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中捆绑的ZendFramework的继承。

现在,您应该可以访问以下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控制器类,以了解应如何使用模型和模板/布局系统。



 类似资料:
  • 问题内容: 我正在尝试创建一个代理服务器,以将请求从客户端传递到第三方网站(例如google)。我的代理只需将传入请求镜像到目标站点上的相应路径,因此,如果我的客户请求的url为: 应提供以下资源: 这是我想出的: 它适用于html页面,但对于其他类型的文件,它仅返回空白页面或来自目标站点的错误消息(在不同站点中有所不同)。 问题答案: 我认为处理从第三方服务器收到的响应不是一个好主意。这只会增加

  • 问题内容: 我正在寻找与JavaScript相同的效果。 我今天下午使用Twisted.web编写了一个基于Web的简单解释器。您基本上是通过表单提交Python代码块的,客户端来抓取并执行它。我希望能够发出一个简单的弹出消息,而不必每次都重写一堆样板wxPython或TkInter代码(因为该代码通过表单提交然后消失了)。 我尝试过tkMessageBox: 但这会在后台用tk图标打开另一个窗口

  • (附:我不太懂加工)

  • 问题内容: 我正在尝试在Eclipse中创建一个简单的Web服务。首先,我创建了一个空的Java项目,并将以下三个文件添加到src文件夹中 Greeting.java GreetingImp.java WSPublisher 我正在遵循的教程未指定任何服务器来运行Web服务!我想知道是否需要指定任何服务器。我已经有了Tomcat v5.5,但在此示例中未使用它。每当我将这个项目作为Java项目运行

  • 如何使用jBPM创建简单的“请假申请”流程?? 我已经在我的机器中安装了jBPM5.4。。我已经通过了jbpm控制台和drools guvnor process designer。。 我需要三个不同的用户,分别是employee、supervisor和HR manager。。 我必须为此创建自己的Web应用程序,或者安装的(jBPM5.4)就足够了??(即jBPM是现成的应用程序,或者我们将其用作

  • 问题内容: 我正在探索用Java创建简单业务规则引擎的不同方法。我需要为客户提供一个简单的webapp,让他配置一堆规则。规则库示例可能如下所示: 例子如下: 规则引擎非常简单,最终动作可能只是发送给住院病人或门诊病人的两个动作之一。表达式中涉及的运算符可以为,而表达式之间的逻辑运算符为。 我想构建一个Web应用程序,其中用户将用编写一个小脚本,然后对表达式进行评估- 这样,业务规则用简单的英语进