如何在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的所有添加和自定义都是通过模块完成的。因此,您需要做的第一件事是创建一个新模块。在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控制器类中查看模型和模板/布局系统的使用方法。
- Wordpress <= 4.6.1 使用主题文件触发存储型XSS 漏洞分析
- 如何跨平台在本地开发环境提交MapReduce作业到CDH集群
- 区块链行业的机会
- KEGG数据库的rest API(附带R语言小技巧)
- 如何使用Java代码访问HDFS.docx
- Django CSRF Bypass (CVE-2016-7401) 漏洞分析
- 如何使用Cloudera Manager禁用YARN的HA
- Web Worker 中的 importScripts 和 baseHref 同源策略绕过问题
- 如何使用Java代码访问CDH的Solr服务
- Safari UXSS漏洞分析(CVE-2016-4758)
- Sqoop抽取Hive Parquet表数据到MySQL异常分析
- Hue中使用Oozie创建Ssh工作流时sudo命令执行失败问题分析
- [译]Safari URL重定向漏洞(CVE-2016-4585)利用分析
- Hive中的Timestamp类型日期与Impala中显示不一致分析(补充)
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Spring mvc文件上传实现
- 「Mysql优化大师三」查询执行计划explain详解,含案例
- flutter BottomAppBar实现不规则底部导航栏
- Yarr:一个UI很漂亮的RSS阅读器
- kotlin Standard中的内联函数示例详解
- 解决react-native软键盘弹出挡住输入框的问题
- flutter编写精美的登录页面
- Flutter实现App功能引导页
- Flutter底部不规则导航的实现过程
- Flutter实现用视频背景的登录页的示例代码
- Flutter实现可循环轮播图效果
- Android判断登录情况
- linux尝试登录失败后锁定用户账户的两种方法
- Linux内存泄漏检测shell脚本
- 详解Linux系统中网卡MAC地址克隆方法