ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-09-15 12:38:56  阅读:217  来源: 互联网

标签:magento-1-9 php magento controller


如何在Magento完成以下任务?

>使用控制器/视图/模型方法显示“Hello World”消息.所以,如果我去http://example.com/myController,它会显示字符串’Hello World’.能够在我的网站模板中显示此字符串(例如,页眉,页脚等)将是一个奖励.
>如何向此控制器(或必要时的新控制器)添加方法,该方法与模型交互,并执行查询Select * FROM articles where id = ’10’并返回行(包含列id,title) ,内容)到控制器?然后使用控制器包含一个视图,该视图将显示此行.因此,访问http://example.com/myController/show_row(或类似的东西)会在视图中显示该行. (不需要花哨,只需一个echo $row-> id;或者类似的东西可以工作.)

关于Magento代码结构的任何其他信息也将非常有用.

解决方法:

首先,我强烈建议你购买PDF/E-Book from PHP Architect.它是20美元,但是我能找到的唯一直截了当的“Magento如何工作”资源.我也开始写Magento tutorials at my own website了.

其次,如果您有选择,并且不是经验丰富的程序员或无法访问有经验的程序员(理想情况下是PHP和Java),请选择另一个购物车. Magento设计精良,但它被设计成一个购物车解决方案,其他程序员可以在其上构建模块.它的设计并不容易被聪明的人理解,但不是程序员.

第三,Magento MVC与Ruby on Rails,Django,CodeIgniter,CakePHP等MVC模型有很大的不同,这些模型最近受到PHP开发人员的欢迎.我认为它基于Zend模型,整个事情就像Java OOP一样.你需要关注两个控制器.模块/ frontName控制器,然后是MVC控制器.

第四,Magento应用程序本身是使用您将使用的相同模块系统构建的,因此探索核心代码是一种有用的学习策略.此外,您将使用Magento做的很多事情都会覆盖现有的课程.我在这里介绍的是创建新功能,而不是覆盖.当你在那里查看代码样本时,请记住这一点.

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

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

最后的免责声明.我已经使用Magento大约两三个星期了,所以请注意.这是一个练习,可以直接解决这个问题,就像帮助Stack Overflow一样.

创建一个模块

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是您修改的唯一命名空间,它不一定是您公司的名称,而是推荐的约定my magento. HelloWorld是您的模块的名称.

清除应用程序缓存

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

>转到系统 – >缓存管理
>从All Cache菜单中选择Refresh
>单击“保存缓存设置”

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

>转到系统 – >配置
>单击“高级”
>在“禁用模块输出”设置框中,查找名为“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";
    }
}

我们刚刚设置的是模块/ 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控制器类中查看模型和模板/布局系统的使用方法.

标签:magento-1-9,php,magento,controller
来源: https://codeday.me/bug/20190915/1804819.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有