如何在Magento(麦进斗)中创建一个简单的“Hello World”模块?

来源:互联网 发布:mooc网络公开课网站 编辑:程序博客网 时间:2024/04/30 15:47

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

Magento MVCRubyon RailsDjangoCodeIgniterCakePHP等都非常不同。MVC模型现在很受PHP开发人员的欢迎。我认为它是基于Zend模型的,整个事情都是类似于Java的。有两个控制器你需要关心。模块/frontname控制器,然后是MVC控制器。

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

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

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

最后的免责声明。我使用Magento已经有两三个星期了,所以要小心。这是一种练习,可以让我在脑子里直接把它弄清楚。

创建一个模块

Magento的所有添加和定制都是通过模块完成的。所以,首先要做的是创建一个新模块。在app/modules中创建一个XML文件

cd/path/to/store/app

touchetc/modules/MyCompanyName_HelloWorld.xml

<?xmlversion="1.0"?>

<config>

     <modules>

        <MyCompanyName_HelloWorld>

            <active>true</active>

           <codePool>local</codePool>

        </MyCompanyName_HelloWorld>

     </modules>

</config>

MyCompanyName是您的修改的唯一名称空间,它不一定是您公司的名称,但是推荐的约定是我的magentoHelloWorld是您的模块的名称。

清除应用程序缓存

 

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

System->Cache Management

从所有缓存菜单中选择Refresh

单击Save Cache settings

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

System->Configuration

单击Advanced

在“Disable modules output”设置框中,寻找名为“mycompanynamehelloworld”的新模块。

如果您能够忍受性能的下降,那么您可能希望在开发/学习时关闭应用程序缓存。没有什么比这更令人沮丧的了,忘记清除缓存,并奇怪为什么你的更改没有显示出来。

设置目录结构

接下来,我们需要为模块设置一个目录结构。您不需要所有这些目录,但是现在设置它们并没有什么害处

mkdir -p app/code/local/MyCompanyName/HelloWorld/Block

mkdir -papp/code/local/MyCompanyName/HelloWorld/controllers

mkdir -papp/code/local/MyCompanyName/HelloWorld/Model

mkdir -papp/code/local/MyCompanyName/HelloWorld/Helper

mkdir -papp/code/local/MyCompanyName/HelloWorld/etc

mkdir -p app/code/local/MyCompanyName/HelloWorld/sql

然后添加一个配置文件

touchapp/code/local/MyCompanyName/HelloWorld/etc/config.xml

之后在配置文件中,添加以下内容,这实质上是一个“blank”配置。

<?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的前名的URL都应该使用frontName控制器mycompanynamehelloworld”。

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

因此,在上面的配置中,当您加载helloworld页面时,您将得到一个404页面。这是因为我们还没有为控制器创建一个文件。

touchapp/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php

现在尝试加载页面。进步!而不是404页面,你会得到一个php/magento异常

Controller file was loaded but class doesnot exist

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

<?php

classMyCompanyName_HelloWorld_IndexController extendsMage_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

如果你想匹配这个url

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

你必须有一个foo控制器,你可以这样做:

touchapp/code/local/MyCompanyName/HelloWorld/controllers/FooController.php

<?php

classMyCompanyName_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';

    }

}

?>

请注意,默认的controller IndexController和默认的动作indexAction可以通过隐式的方式来实现,但是如果有什么东西在后面出现,则必须显式。因此,http://example.com/magen/index.ph/helloworld/foo将与控制器foo控制器和动作索引操作相匹配,而不是IndexController的动作脚动作。如果你想要有一个foo,在控制器IndexController中,你必须以这样的方式显式地调用这个控制器:http://example.com/magen/index.ph/helloworld/index/foo,因为url的第二部分是并且始终是控制器名称。这种行为是在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

阅读全文
0 0
原创粉丝点击