首先,我强烈建议您从 PHP Architect 购买 PDF/电子书。它是 20 美元,但它是我能找到的唯一直接的“Magento 的工作原理”资源。我还开始在我自己的网站上编写 Magento 教程。
其次,如果您可以选择,但不是经验丰富的程序员或无法接触到经验丰富的程序员(最好是 PHP和Java),请选择另一个购物车。Magento 设计精良,但它被设计成一个购物车解决方案,其他程序员可以在其上构建模块。它的设计不是为了让聪明但不是程序员的人容易理解。
第三,Magento MVC 与现在 PHP 开发人员流行的Ruby on Rails、Django、CodeIgniter、CakePHP等 MVC 模型有很大不同。我认为它是基于Zend模型的,整个过程非常类似于 Java OOP。您需要关注两个控制器。module/frontName 控制器,然后是 MVC 控制器。
第四,Magento 应用程序本身是使用您将使用的相同模块系统构建的,因此围绕核心代码进行探索是一种有用的学习策略。此外,您将使用 Magento 做的很多事情都是覆盖现有的类。我在这里介绍的是创建新功能,而不是覆盖。当您查看那里的代码示例时,请记住这一点。
我将从您的第一个问题开始,向您展示如何设置控制器/路由器以响应特定的 URL。这将是一本小小说。稍后我可能有时间讨论与模型/模板相关的主题,但现在我没有。但是,我将简要谈谈您的 SQL 问题。
Magento 使用EAV数据库架构。只要有可能,尝试使用系统提供的模型对象来获取您需要的信息。我知道这些都在 SQL 表中,但最好不要考虑使用原始 SQL 查询来获取数据,否则你会发疯的。
最后的免责声明。我已经使用 Magento 大约两三周了,所以请谨慎购买。这是一个让我明白这一点的练习,就像帮助 Stack Overflow 一样。
创建一个模块
Magento 的所有添加和定制都是通过模块完成的。因此,您需要做的第一件事就是创建一个新模块。创建一个 XML 文件,app/modules
命名如下
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 知道它(并检查我们的工作)。在管理应用程序中
- 转到系统->缓存管理
- 从所有缓存菜单中选择刷新
- 单击保存缓存设置
现在,我们确保 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 前端名称的 URL ...
http://example.com/magento/index.php/helloworld
应该使用 frontName 控制器 MyCompanyName_HelloWorld”。
所以,有了上面的配置,当你加载上面的 helloworld 页面时,你会得到一个 404 页面。那是因为我们还没有为控制器创建文件。现在让我们这样做。
touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php
现在尝试加载页面。进步!你会得到一个 PHP/Magento 异常,而不是 404
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 控制器。这是默认控制器和模块的默认操作。如果你想添加控制器或动作,你必须记住 Magento URL 的树的第一部分是不可变的,它们总是这样http://example.com/magento/index.php/frontName/controllerName/actionName
所以如果你想匹配这个 url
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 的第二部分是并且将永远是控制器名。这种行为是对捆绑在 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
因此,这应该让您对 Magento 如何调度到控制器有一个基本的了解。从这里我建议查看现有的 Magento 控制器类,看看应该如何使用模型和模板/布局系统。