7

我来自不同的 MVC 框架(例如 Symfony)到 Magento。我阅读了很多关于 Magento 最佳实践的文章,我可以看到 Magento 没有使用典型的 MVC 风格。艾伦斯托姆写道:

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

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

对。但是表格呢?

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

在 Magento 中,这些都应该发生在一个块内,并且(瘦)控制器只应该准备布局然后渲染它。(如果我明白的话。)

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

我做到了。它现在有效,但我不满意。因此,我检查了核心模块中的联系人表单的源代码,这些代码为我搞砸了整个画面。内置的 Contact 表单使用 IndexController 进行上述大多数操作,(几乎)像标准 MVC 一样。

任何人都可以向我建议一个最佳实践,如何管理一个简单的流程,如下所示?(我在下面有一个解决方案,但我不确定,这是“正确的 Magento 方式”):

  • 页面加载时,在一个块中显示一个表单,该表单包含在单独的页面中
  • 通过请求参数从数据库加载模型对象
  • 将对象数据填充到表单中
  • 当用户提交表单时,处理表单数据,验证它们
  • 如果验证错误,再次显示表单,并弹出错误消息
  • 如果可以,将数据存储到数据库中,显示感谢页面

我的困惑主要是围绕:

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

2 回答 2

3

您可以查看 Customer/AccountController 并查看loginPostcreatePost方法如何处理传入的表单数据。

我永远不会将CRUD逻辑添加到块中。您需要在 Controller 中验证和处理您的 POST 数据。块应仅包含与视图相关的逻辑:例如格式 url 或 prepare Collection

表格准备也落在了控制器的肩上。您需要加载对象并在 Controller 操作中对其进行验证。然后有几种方法可以将其传递给块:

  • Mage::register(登记处)
  • $this->getLayout->getBlock('your_form_block')->setEntity($object)(直接设置变量为block)

任何重定向都应仅在 Controller 中完成。

更新 关于为什么在控制器内加载模型的几句话。

  1. 如果您未能加载您的对象,这意味着用户正在使用的 url(带有对象 id)已过时,您可能需要将客户重定向到某个方便的页面,但出现错误。
  2. 正如我上面所说,所有重定向都应该只在 Controller 中完成。这是为什么?因为此时块是进程,Magento 已经完成了大量的引导工作 - 就像loadLayout创建所有块一样。您不想让用户等待所有时间只是为了在之后重定向他。
  3. 此外,将重定向放在不在控制器中的任何地方都会使应用程序无法维护。当然也有例外,但你应该知道自己做得很好。

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

作为一般建议:如果您想遵循 Magento 风格,请少阅读论坛和更多核心代码。

于 2012-11-28T14:58:41.187 回答
0

我也不是magento pro,但我想我可以回答您的问题:

我应该在哪里获取和管理请求参数?(我在块类文件中做了) 取决于你需要它们的地方。如果您打算将它们保存在模型中,请使用控制器。如果要将它们输出到页面上,请使用块。大多数情况下,您希望为此使用控制器。

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

如果我不在那里加载它,如何将它传递给视图?(我会知道一种方法,但我不知道最好的方法。) 如上所述,制作一个带有获取模型的函数的块。然后从您的模板中,您可以使用$model = $this->functionThatGetsTheModel(); 达到这个功能并获得块。

(POST)表单数据应该在哪里处理、验证和存储?(块?) 保存模型之类的东西是控制器的东西。

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

关于块/模板主题:阅读此页面以获取有关使用布局 xml 以使用块和模板的更多信息http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-4- magento 布局块和模板

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

于 2012-11-28T14:57:27.030 回答