如果您有一个选择,并且不是一个有经验的程序员,或者不能访问一个有经验的程序员(最好是在PHP和Java中),选择另一个购物车。Magento设计得很好,但它被设计成一种购物车解决方案,其他程序员可以在上面构建模块。它不是由聪明的人容易理解的,但不是程序员。
Magento MVC与Rubyon Rails、Django、CodeIgniter、CakePHP等都非常不同。MVC模型现在很受PHP开发人员的欢迎。我认为它是基于Zend模型的,整个事情都是类似于Java的。有两个控制器你需要关心。模块/frontname控制器,然后是MVC控制器。
Magento应用程序本身是使用您将使用的相同的模块系统构建的,因此在核心代码中戳戳是一种有用的学习策略。此外,您将在Magento中做的很多事情都是覆盖现有的类。我在这里所介绍的是创建新功能,而不是覆盖。当您查看代码示例时,请记住这一点。
我将从您的第一个问题开始,向您展示如何设置控制器/路由器以响应特定的URL。这将是一部小小说。我可能会有时间来做模型/模板相关的主题,但是现在,我没有。但是,我将简要地介绍您的SQL问题。
Magento使用的是EAV数据库架构。只要可能,尝试使用系统提供的模型对象来获取所需的信息。我知道SQL表中都有它,但是最好不要使用原始SQL查询来获取数据,否则您会发疯的。
最后的免责声明。我使用Magento已经有两三个星期了,所以要小心。这是一种练习,可以让我在脑子里直接把它弄清楚。
创建一个模块
对Magento的所有添加和定制都是通过模块完成的。所以,首先要做的是创建一个新模块。在app/modules中创建一个XML文件
cd/path/to/store/app
touchetc/modules/MyCompanyName_HelloWorld.xml
<?xmlversion="1.0"?>
<config>
<modules>
<MyCompanyName_HelloWorld>
<active>true</active>
<codePool>local</codePool>
</MyCompanyName_HelloWorld>
</modules>
</config>
MyCompanyName是您的修改的唯一名称空间,它不一定是您公司的名称,但是推荐的约定是我的magento。HelloWorld是您的模块的名称。
清除应用程序缓存
现在,模块文件已经就位,我们需要让Magento知道它(并检查我们的工作)。在管理应用程序
System->Cache Management
从所有缓存菜单中选择Refresh
单击Save Cache settings
现在,我们要确保Magento知道这个模块
System->Configuration
单击Advanced
在“Disable modules output”设置框中,寻找名为“mycompanynamehelloworld”的新模块。
如果您能够忍受性能的下降,那么您可能希望在开发/学习时关闭应用程序缓存。没有什么比这更令人沮丧的了,忘记清除缓存,并奇怪为什么你的更改没有显示出来。
设置目录结构
接下来,我们需要为模块设置一个目录结构。您不需要所有这些目录,但是现在设置它们并没有什么害处
mkdir -p app/code/local/MyCompanyName/HelloWorld/Block
mkdir -papp/code/local/MyCompanyName/HelloWorld/controllers
mkdir -papp/code/local/MyCompanyName/HelloWorld/Model
mkdir -papp/code/local/MyCompanyName/HelloWorld/Helper
mkdir -papp/code/local/MyCompanyName/HelloWorld/etc
mkdir -p app/code/local/MyCompanyName/HelloWorld/sql
然后添加一个配置文件
touchapp/code/local/MyCompanyName/HelloWorld/etc/config.xml
之后在配置文件中,添加以下内容,这实质上是一个“blank”配置。
<?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都应该使用frontName控制器mycompanynamehelloworld”。
http://example.com/magento/index.php/helloworld
因此,在上面的配置中,当您加载helloworld页面时,您将得到一个404页面。这是因为我们还没有为控制器创建一个文件。
touchapp/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php
现在尝试加载页面。进步!而不是404页面,你会得到一个php/magento异常
Controller file was loaded but class doesnot exist
因此,打开我们刚刚创建的文件,并将其粘贴到下面的代码中。类的名称需要基于您在路由器中提供的名称。
<?php
classMyCompanyName_HelloWorld_IndexController extendsMage_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
如果你想匹配这个url
http://example.com/magento/index.php/helloworld/foo
你必须有一个foo控制器,你可以这样做:
touchapp/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
<?php
classMyCompanyName_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';
}
}
?>
请注意,默认的controller IndexController和默认的动作indexAction可以通过隐式的方式来实现,但是如果有什么东西在后面出现,则必须显式。因此,http://example.com/magen/index.ph/helloworld/foo将与控制器foo控制器和动作索引操作相匹配,而不是IndexController的动作脚动作。如果你想要有一个foo,在控制器IndexController中,你必须以这样的方式显式地调用这个控制器:http://example.com/magen/index.ph/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