如何在Magento完成以下任务?
使用控制器/视图/模型方法显示"Hello World"消息.所以,如果我去http://example.com/myController
它会显示字符串'Hello World'.能够在我的网站模板中显示此字符串(例如,页眉,页脚等)将是一个奖励.
如何向该控制器(或必要时的新控制器)添加一个方法,该方法与模型交互,并执行查询Select * FROM articles where id='10'
并将行(包含列id, title, content
)返回给控制器?然后使用控制器包含一个视图,该视图将显示此行.所以转到http://example.com/myController/show_row
(或类似的东西)会在视图中显示该行.(不需要花哨,只需要echo $row->id;
类似或类似的东西.)
关于Magento代码结构的任何其他信息也将非常有用.
首先,我强烈建议您从PHP Architect购买PDF /电子书.这是20美元,但是我能找到的唯一直截了当的"Magento如何工作"资源.我也开始在自己的网站上编写Magento教程.
其次,如果您有选择,并且不是经验丰富的程序员或无法访问有经验的程序员(理想情况下是PHP 和 Java),请选择另一个购物车.Magento设计精良,但它被设计成一个购物车解决方案,其他程序员可以在其上构建模块.它的设计并不容易被聪明的人理解,但不是程序员.
第三,Magento MVC与Ruby on Rails,Django,CodeIgniter,CakePHP等有很大不同.MVC模型最近受到PHP开发人员的欢迎.我认为它基于Zend模型,整个事情就像Java OOP一样.有2个,你需要关心控制器.模块/ 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
true
local
MyCompanyName是您修改的唯一命名空间,它不一定是您公司的名称,而是推荐的约定my magento.HelloWorld
是您的模块的名称.
现在模块文件到位了,我们需要让Magento了解它(并检查我们的工作).在管理应用程序中
转到系统 - >缓存管理
从All Cache菜单中选择Refresh
单击保存缓存设置
现在,我们确保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
在配置文件中,添加以下内容,这实际上是一个"空白"配置.
0.1.0
这个配置文件过于简单化,可以让你告诉Magento你想要运行什么代码.
接下来,我们需要设置模块的路由器.这将让系统知道我们正在处理任何形式的URL
http://example.com/magento/index.php/helloworld
因此,在配置文件中,添加以下部分.
MyCompanyName_HelloWorld
helloworld
你在这里说的是"任何带有helloworld的frontName的URL ......
http://example.com/magento/index.php/helloworld
应该使用frontName控制器MyCompanyName_HelloWorld".
因此,通过上述配置,当您加载上面的helloworld页面时,您将获得404页面.那是因为我们没有为控制器创建文件.我们现在就这样做.
touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php
现在尝试加载页面.进展!而不是404,你将获得PHP/Magento异常
Controller file was loaded but class does not exist
因此,打开我们刚刚创建的文件,并粘贴以下代码.类的名称需要基于您在路由器中提供的名称.
我们刚刚设置的是模块/ frontName控制器.这是默认控制器和模块的默认操作.如果你想添加控制器或动作,你必须记住,Magento URL的树的第一部分是不可变的,它们总是会这样http://example.com/magento/index.php/frontName/controllerName/actionName
所以,如果你想匹配这个网址
http://example.com/magento/index.php/helloworld/foo
你必须有一个FooController,你可以这样做:
touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
请注意,默认控制器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控制器类中查看模型和模板/布局系统的使用方法.
我对Alan的完美答案只有一点评论:"我们刚设置的是模块/ frontName控制器.这不是MVC控制器." 它与FooController完全相同.在ZF中,IndexController中的索引操作默认被调用,因此请求http://example.com/magento/index.php/helloworld/将在helloworld模块中调用IndexController :: indexAction().因此调用.../helloworld/foo将尝试在helloworld模块中找到FooController并在其上调用indexAction().要触发IndexController :: fooAction(),您需要请求:.../helloworld/index/foo.
确保app/code/local/MyCompanyName/HelloWorld/etc/config.xml与etc/modules中的xml(MyCompanyName_HelloWorld NOT mycompanyname_helloworld)具有相同的大小写,否则后端会有条目!
谢谢,这非常有帮助.请考虑添加有关使用模型/数据库和视图的一些信息,以便您的答案可以完成
确保你阅读了来自@Matus Zeman的回复,以了解为什么在IndexController上找不到fooAction,它只是一个'正常'的Zend Framework MVC /路由器,你使用了坏网址,所以你应该删除"这不是MVC控制器"部分答案.
@ hypervisor666打开"开发者模式"(google it).启用开发人员模式后,Magento将崩溃XML文件中的任何错误.
2> Manos Dilave..:
我在上个月左右一直和Magento搏斗,我还在努力解决这个问题.所以这就是盲人领导盲人的情况.文档的方式很少,论坛/维基充其量只是混乱.不仅如此,还有一些解决方案已经过时或远非最佳.我不确定你是否有一个项目或者只是想弄明白,但如果你开始修改现有的功能而不是创造一些全新的东西,那可能会更容易.为此,我肯定会在维基中使用"推荐的开发人员文章".新的付款方式令人大开眼界.
对于调试,我肯定建议使用FirePHP并在出现问题时查看HTML源代码.ole echo调试方法并没有真正发挥作用.
一般的架构是如此令人难以置信的复杂,即使我完全理解它,我也需要写一本书来掩盖它.我能做的最好的就是给你建议,我希望有人在我刚开始的时候给了我...
远离核心文件.不要修改它们,而是编写自己的模块并覆盖您需要的模块.
Magento使用由XML组成的配置文件来决定它需要做什么.为了让它运行你自己的东西而不是核心功能,你需要正确的xml.遗憾的是,没有关于如何构建XML的指南; 你需要看一些例子并做一些严肃的测试.更复杂的是,这些文件的内容在很大程度上区分大小写.但是,如果掌握了这些功能,您可以覆盖基本功能的任何部分,从而构成一个功能非常强大的系统.
Magento会用类似的方法Mage::getModel('mymodel')
,Mage::getSingleton('mysingleton')
,Mage::helper('myhelper')
返回特定类的对象.它默认在其核心命名空间中找到它们.如果您希望它使用您自己的,您需要在config.xml
文件中覆盖它们.
类的名称必须与它们所在的文件夹相对应.
Magento中的很多对象最终扩展了一个叫做a的东西Varien_Object
.这是一个通用的类(有点像瑞士军刀),它的目的是让你能够动态定义自己的方法/变量.例如,您将看到它用作一个美化数组,用于将数据从一个方法传递到另一个方法.
在开发过程中,请确保禁用缓存.它会使magento变得极其缓慢,但它会为你节省很多头部创伤(从敲打你的桌子上).
你会看到$this
被大量使用.它意味着一个不同的类,具体取决于您看到的文件.get_class($this)
是你的朋友,特别是与FirePHP一起使用.
在纸上记下事情.很多.在你遇到它们的1-2天之后,你将需要无数的小事实.
Magento喜欢OO.如果跟踪方法会带您通过5-10个不同的类,请不要感到惊讶.
在这里阅读设计师指南.它主要用于图形设计人员,但您需要它来了解模块输出的最终位置和原因.为此,请不要忘记在管理面板的开发人员部分打开"模板路径提示".
还有更多,但在此变成论文之前我会停在这里.