如何在Magento中创build一个简单的“Hello World”模块?

Magento中如何实现以下function?

  • 使用控制器/视图/模型方法显示“Hello World”消息。 所以,如果我去http://example.com/myController它会显示string“Hello World”。 能够显示在我的网站模板(例如,页眉,页脚等)这个string将是一个奖金。

  • 如何添加一个方法到这个控制器(或者一个新的控制器,如果需要的话),它与模型进行交互,并执行查询Select * FROM articles where id='10'并返回行(包括列id, title, content )到控制器? 然后使用控制器来包含一个视图,这将显示此行。 所以去http://example.com/myController/show_row (或类似的东西)将显示在视图中的行。 (不需要花哨,只需要echo $row->id;或者类似的东西就可以了。)

有关Magento的代码结构的任何其他信息也将非常有帮助。

首先,我强烈build议您从PHP Architect购买PDF / E-Book 。 这是20美元,但它是唯一直接的“Magento工作原理”资源,我已经find了。 我也开始在自己的网站上写Magento的教程 。

其次,如果您有select,而且不是经验丰富的程序员,或者没有经验丰富的程序员(理想情况下是PHP Java),那么select另一个购物车 。 Magentodevise良好,但是它被devise成一个购物车解决scheme,其他程序员可以在其上构build模块。 这并不是为了聪明的人而容易理解,而不是程序员。

第三,Magento MVC与Ruby on Rails , Django , CodeIgniter , CakePHP等MVC模式非常不同。 我认为它是基于Zend模型,整个事情是非常类似Java的OOP。 有两个你需要关心的控制器。 模块/ frontName控制器,然后是MVC控制器。

第四,Magento应用程序本身是使用您将要使用的相同模块系统构build的,因此,围绕核心代码展开讨论是一种有用的学习策略。 另外,Magento的很多function是覆盖现有的类。 我在这里覆盖的是创造新的function,而不是压倒一切。 记住这个代码时,请记住这一点。

我将从第一个问题开始,向您展示如何设置控制器/路由器来响应特定的URL。 这将是一个小小说。 以后我可能会花些时间来处理模型/模板相关的主题,但是现在我不知道。 然而,我会简要地谈谈你的SQL问题。

Magento使用EAV数据库架构。 尽可能尝试使用系统提供的模型对象来获取所需的信息。 我知道这些都在SQL表中,但最好不要想到使用原始SQL查询来获取数据,否则你会发疯的。

最终免责声明。 我一直在使用Magento大约两三个星期,所以要注意的是emptor。 这是一个练习,可以让我的脑海变得像帮助Stack Overflow一样。

创build一个模块

所有Magento的添加和定制都是通过模块完成的。 所以,你需要做的第一件事是创build一个新的模块。 在app/modules创build一个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是你的模块的名字。

清除应用程序caching

现在模块文件已经存在,我们需要让Magento知道它(并检查我们的工作)。 在pipe理员应用程序中

  1. 进入系统 – >高速cachingpipe理
  2. 从“All Cache”菜单中select“Refresh”
  3. 点击保存caching设置

现在,我们确保Magento知道这个模块

  1. 进入系统 – >configuration
  2. 点击高级
  3. 在“禁用模块输出”设置框中,查找名为“MyCompanyName_HelloWorld”的新模块

如果您可以忍受性能下降,则可能需要在开发/学习时closures应用程序caching。 没有什么是更令人沮丧的,然后忘记清除caching,并想知道为什么你的变化没有显示出来。

设置目录结构

接下来,我们需要为模块设置一个目录结构。 你不需要所有这些目录,但现在把它们全部设置好就没有什么坏处了。

 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 

并添加一个configuration文件

 touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml 

并在configuration文件中添加以下内容,这本质上是一个“空白”configuration。

 <?xml version="1.0"?> <config> <modules> <MyCompanyName_HelloWorld> <version>0.1.0</version> </MyCompanyName_HelloWorld> </modules> </config> 

过度简化的东西,这个configuration文件将让你告诉Magento你想运行什么代码。

设置路由器

接下来,我们需要设置模块的路由器。 这会让系统知道我们正在处理任何URL

 http://example.com/magento/index.php/helloworld 

所以,在您的configuration文件中,添加以下部分。

 <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> 

你在这里说的是“任何URL与helloworld的frontName …

 http://example.com/magento/index.php/helloworld 

应该使用frontName控制器MyCompanyName_HelloWorld“。

所以,通过上面的configuration,当你加载上面的helloworld页面,你会得到一个404页面。 那是因为我们还没有为我们的控制器创build一个文件。 现在就来做吧

 touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php 

现在尝试加载页面。 进展! 而不是404,你会得到一个PHP / Magentoexception

 Controller file was loaded but class does not exist 

所以,打开我们刚刚创build的文件,并粘贴下面的代码。 该类的名称需要基于您在路由器中提供的名称。

 <?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"; } } 

我们刚刚设置的是模块/ 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 : http://example.com/magento/index.php/helloworld/index/foo因为url的第二部分是且将始终是控制器名称。 这个行为是Magento中绑定的Zend框架的inheritance。

您现在应该能够击中以下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如何派发给控制器的基本思路。 从这里我build议在现有的Magento控制器类上进行点击,看看应该如何使用模型和模板/布局系统。

我已经在上个月左右与Magento搏斗了,我还在试图弄清楚。 所以这是盲人领导盲人的一个案例。 在文档方面几乎没有什么,论坛/ wiki充其量是混乱的。 不仅如此,还有几种解决scheme已经过时或者远未达到最佳状态。 我不确定你是否有一个项目,或只是试图弄清楚,但如果你开始修改现有的function,而不是创build一个全新的东西,可能会更容易。 为此,我肯定会与维基中的“为开发人员推荐的文章”。 新的支付方式让人大开眼界。

对于debugging,我肯定会推荐使用FirePHP,并在出现问题时查看HTML源代码。 ole回声debugging方法并没有真正的工作。

一般的架构是非常复杂的,即使我完全理解它,我也需要写一本书来涵盖它。 我能做的最好的是给你build议,希望有人在我刚开始的时候给了我…

远离核心文件。 不要修改它们,而是编写自己的模块并覆盖你所需要的。

Magento使用由XML组成的configuration文件来决定它需要做什么。 为了得到它运行自己的东西,而不是核心function,你需要正确的XML。 不幸的是,没有关于如何构buildXML的指南。 你需要看例子,做一些严肃的testing。 使这些文件的内容复杂化很大程度上是区分大小写的。 但是,如果你掌握了这些,你可以覆盖基本function的任何部分,这使得一个非常强大的系统。

Magento使用像Mage::getModel('mymodel')Mage::getSingleton('mysingleton')Mage::helper('myhelper')来返回某些类的对象。 它在默认的核心命名空间中find这些。 如果你想使用你自己的,你需要在你的config.xml文件中覆盖这些。

您的课程名称必须与其所在的文件夹相对应。

Magento中的很多对象最终都会扩展一个名为Varien_Object东西。 这是一个通用的课程(有点像瑞士军刀),它的目的是让你在飞行中定义你自己的方法/variables。 例如,你会看到它被用作一个荣耀的数组来传递数据从一个方法到另一个。

在开发过程中,确保您的caching已禁用。 它会使得极慢的极端,但它会为您节省很多的头部创伤(从您的桌子上撞)。

你会看到$this被使用了很多。 这意味着一个不同的类取决于你看到的文件。 get_class($this)是你的朋友,特别是与FirePHP结合使用。

记下纸上的东西。 很多。 有无数小事实,你会需要1-2天后,你遇到他们。

Magento喜欢OO。 如果追踪某个方法需要通过5-10个不同的类别,请不要感到惊讶。

在这里阅读devise师指南。 这主要是针对graphicsdevise人员的,但是您需要了解模块的输出结果将在何处以及为什么会出现。 为此,请不要忘记在pipe理面板的开发人员部分打开“模板path提示”。

还有更多,但是在这变成论文之前,我会停下来。