首先,我强烈建议您从PHP Architect购买PDF/电子书。这款游戏售价20美元,但却是我所能找到的唯一直接的“Magento是如何运作的”资源。我也开始在自己的网站上写Magento教程。
其次,如果您可以选择,并且不是一个有经验的程序员,或者没有机会接触到有经验的程序员(最好是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两三个星期了,买者自负。这是一个练习,以得到这个在我的头脑中,因为它是帮助堆栈溢出。
创建模块
所有对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知道它(并检查我们的工作)。在管理应用程序中
进入“System->Cache Management”
从所有缓存菜单中选择刷新
单击“保存缓存设置”
现在,我们要确保Magento知道这个模块
进入“System->Configuration”
单击高级
在“禁用模块输出”设置框中,寻找名为“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
现在尝试加载页面。进步!您将得到一个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';
}
}
Please note that the default controller IndexController and the default action indexAction can by implicit but have to be explicit if something come after it.
So http://example.com/magento/index.php/helloworld/foo will match the controller FooController and the action indexAction and NOT the action fooAction of the IndexController. If you want to have a fooAction, in the controller IndexController you then have to call this controller explicitly like this way :
http://example.com/magento/index.php/helloworld/index/foo because the second part of the url is and will always be the controllerName.
This behaviour is an inheritance of the Zend Framework bundled in Magento.
现在,您应该能够点击以下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控制器类,看看应该如何使用模型和模板/布局系统。