Magento应用程序本身是使用与您将使用的模块系统相同的模块构建的,因此,在核心代码周围打针是一种有用的学习策略。另外,您将使用Magento进行的许多操作都将
覆盖 现有类。我在这里介绍的是 创建 新功能,而不是覆盖。在查看此处的代码示例时,请记住这一点。
我将从第一个问题开始,向您展示如何设置控制器/路由器以响应特定的URL。这将是一部小小说。我可能稍后会花一些时间来讨论与模型/模板相关的主题,但到目前为止,我还没有。但是,我将简要地谈谈您的SQL问题。
Magento使用EAV数据库架构。尽可能尝试使用系统提供的模型对象来获取所需的信息。我知道SQL表中都有它们,但是最好不要考虑使用原始SQL查询来获取数据,否则您会发疯。
最终免责声明。我已经使用Magento大约两三个星期了,所以请注意。这是一个练习,它可以尽可能多地帮助我解决堆栈溢出问题。
创建一个模块
Magento的所有添加和自定义都是通过模块完成的。因此,您需要做的第一件事就是创建一个新模块。创建一个
app/modules名为的XML文件,如下所示
cd /path/to/store/apptouch etc/modules/MyCompanyName_HelloWorld.xml<?xml version="1.0"?><config> <modules> <MyCompanyName_HelloWorld> <active>true</active> <prePool>local</prePool> </MyCompanyName_HelloWorld> </modules></config>
MyCompanyName是用于修改的唯一命名空间,它不一定是您公司的名称,但建议的约定是我的名称。
HelloWorld是您模块的名称。
清除应用程序缓存
现在,模块文件就位了,我们需要让Magento知道它(并检查我们的工作)。在管理应用程序中
- 转到系统->缓存管理
- 从“所有缓存”菜单中选择“刷新”
- 点击保存缓存设置
现在,我们确保Magento了解该模块
- 转到系统->配置
- 点击高级
- 在“禁用模块输出”设置框中,查找名为“ MyCompanyName_HelloWorld”的新模块。
如果您可以忍受性能下降的情况,则可能需要在开发/学习时关闭应用程序缓存。没有什么比让您忘记清除高速缓存并想知道为什么未显示更改更令人沮丧的了。
设置目录结构
接下来,我们需要为模块设置目录结构。您将不需要所有这些目录,但是现在将它们全部设置没有什么害处。
mkdir -p app/pre/local/MyCompanyName/HelloWorld/Blockmkdir -p app/pre/local/MyCompanyName/HelloWorld/controllersmkdir -p app/pre/local/MyCompanyName/HelloWorld/Modelmkdir -p app/pre/local/MyCompanyName/HelloWorld/Helpermkdir -p app/pre/local/MyCompanyName/HelloWorld/etcmkdir -p app/pre/local/MyCompanyName/HelloWorld/sql
并添加一个配置文件
touch app/pre/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/pre/local/MyCompanyName/HelloWorld/controllers/IndexController.php
现在尝试加载页面。进展!而不是404,您将获得一个PHP / Magento异常
Controller file was loaded but class does not exist
因此,打开我们刚刚创建的文件,然后粘贴以下代码。该类的名称必须基于您在路由器中提供的名称。
<?phpclass 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/pre/local/MyCompanyName/HelloWorld/controllers/FooController.php<?phpclass 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/foohttp://example.com/magento/index.php/helloworld/foo/addhttp://example.com/magento/index.php/helloworld/foo/delete
因此,这应该为您提供有关Magento如何调度到控制器的基本思想。从这里开始,我建议戳一下现有的Magento控制器类,以了解应如何使用模型和模板/布局系统。



