2012-11-28 27 views
6

我来自不同的MVC框架(例如Symfony)到Magento。我读了很多关于Magento的最佳实践,我可以看到Magento不使用典型的MVC风格。艾伦风暴写下如下:Magento - 最好的方式来处理块的形式?

它不是控制器设置为 视图变量的责任[...]控制器的工作是做某些事情,以模型和 然后告诉它的系统布局呈现时间。

我想我理解这种方法,因为这可以为块提供一种灵活性。

对。但是形式呢?

在典型的MVC框架中,您将获得控制器中的请求参数,验证控制器中的表单数据,在必要时进行模型操作(保存,加载等)或重定向,并且当一切都干净整齐时,您将为视图提供新鲜出炉的输出件。

在Magento这些都应该发生的块内和(薄)控制器只应该准备的布局,然后解析它。 (如果我明白了)。

我试图找到一篇文章(手册,论坛主题,任何内容),它描述了一个独立模块的创建步骤和一个自己的新模型,可以通过前端的表单进行编辑由用户。我想看看自定义表单应该如何在前端工作。我只找到关于块,表单,修改或创建adminhtml表单或定制联系人或通讯注册表单的一般性文章。

我做到了。它现在有效,但我不满意。于是,我检查了核心模块中联系人表单的源代码,以及那些让我搞乱了整个图片的东西。内置的Contact表单使用IndexController来处理上面提到的大部分操作,(几乎)就像一个标准的MVC。

可能有人建议我最好的做法,如何管理一个简单的流程类似下面的? (我已经得到了这些下面的解决方案,但我不知道,是“正确的Magento办法”):

  • 页面加载,显示块的形式,它包括在
  • 单独页面
  • 负载从DB模型对象由一个请求参数
  • 填充对象数据到表单当用户提交表单,处理表单数据,验证它们
  • 如果验证错误时,显示再次形成,并弹出错误消息
  • I ˚FOK,将数据存储到数据库,显示感谢您网页

我的困惑主要是围绕:

  • 我应该在哪里获取和管理请求参数? (我在块类文件中做过)
  • 并基于它从数据库中加载一个对象? (另外,然后传递给phtml)
  • 如何将它传递给视图,如果我不加载它呢? (我会知道一种方式,但我不知道最好的方法。)
  • 哪里应该(POST)表单数据处理,验证和存储? (Block?)
  • 如何在块中正确使用重定向?我是否需要重定向,因为感谢页面应该是不同的块/页面?或者只是一个替代(有条件)的相同块的外观?

回答

2

您只需查看Customer/AccountController并查看loginPost,createPost方法如何处理传入表单数据。

我绝不会将CRUD逻辑添加到块中。您需要验证和处理您的控制器中的POST数据。块应该只包含视图相关的逻辑:像格式url,或者准备Collection

此外,表单准备也放在控制器的肩膀上。您需要加载对象并在Controller动作中对其进行验证。然后有一些方法将它传递给块:

  • Mage::register(注册)
  • $this->getLayout->getBlock('your_form_block')->setEntity($object)(直接设置变量块)

任何转向应该在唯一的控制器来完成。

UPDATE 关于为什么在控制器中加载模型的几句话。

  1. 如果你无法加载你的对象,这意味着该URL的用户使用(有对象ID)是过时的,这是可能的,你需要给客户重定向到一些方便的页面错误。
  2. 正如我前面所说,所有重定向应该只在控制器来完成。这是为什么?因为目前block是进程,所以Magento已经完成了大量的引导工作 - 比如loadLayout并创建所有的块。您不希望让用户等待所有时间,只是为了在事后重定向他。
  3. 也将重定向放在任何地方不在控制器使应用程序无法维护。当然也有例外,但你应该知道自己做得很好。

而且你已经忘记了一个更有价值的部分。如果控制器内的验证失败,则需要使用用户发送的值填写表单。在Zend_Form中做得很好,但对于Magento表单,您需要使用会话(例如在AccountController中完成) - 将所有键值部分保存在会话中,然后在块中检查这些会话变量是否存在。同样,只有当您的POST验证失败并且您将用户重定向到您的表单时,您才应该这样做。在成功的情况下清除连接到表单的会话变量。

由于建议的通用件:如果你想跟着Magento的风格,少读论坛和更多的核心代码。

+0

谢谢Slayer,这就是我所怀疑的。这似乎更有意义!我同意你上面的所有论点。基于我的MVC知识,我假设了一些类似的东西。我会检查这些核心代码。非常感激! –

0

我不是一个Magento的亲下去,但我想我可以回答你的问题:

我应该从哪里获取和管理请求参数? (我在块类文件中做过) 影响你需要它们的地方。如果您打算将它们保存在模型中,请使用控制器。如果您想在页面上输出它们,请使用块。大多数情况下,你想用这个控制器。

并基于它从数据库中加载一个对象? (另外,然后传递给phtml) 如果要将模型传递给模板,应在模块上编写一个函数,以获取模型。

如何将它传递给视图,如果我不加载它呢? (我会知道一种方法,但我不知道最好的方法。) 如上所述,使用获取模型的函数创建一个块。然后从你的模板,你可以使用$ model = $ this-> functionThatGetsTheModel();达到此功能并获得该块。

哪里应该(POST)表格数据处理,验证和存储? (Block?) 保存模型等东西是控制器的东西。

如何在块中正确使用重定向?我是否需要重定向,因为感谢页面应该是不同的块/页面?或者只是一个替代(有条件)的相同块的外观? 最好在您的控制器中进行重定向。最好为每个计划制作的页面创建一个新的块/模板。

关于块/模板主题:请阅读此页有关布局XML的使用更多信息使用块和模板http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-4-magento-layouts-blocks-and-templates

我希望这可以帮助您开始使用Magento的!

相关问题