首先,我强烈建议您购买
PHP Architect的PDF /电子书。它售价20美元,但是这是我能够找到的唯一直接了解Magento工作原理的资源。我还在
自己的网站上编写Magento教程。
其次,如果您有选择,并且不是经验丰富的程序员或没有经验丰富的程序员(最好是在PHP和Java中),
请选择其他购物车。Magento设计得非常好,但它是为其他程序员构建模块的购物车解决方案而设计的。它并不是为那些聪明但不是程序员的人易于理解的。
第三,Magento MVC与当今PHP开发人员流行的
Ruby on Rails,
Django,
CodeIgniter,
CakePHP等MVC模型非常不同。我认为它基于
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是您修改的独特命名空间,它不必是您公司的名称,但这是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>
<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";
}
}
我们刚刚设置的是模块/前端控制器。这是模块的默认控制器和默认操作。如果您想添加控制器或操作,您必须记住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的第二部分始终是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控制器类,以了解如何使用模型和模板/布局系统。