Magento - 处理块形式的最佳方法?

Posted

技术标签:

【中文标题】Magento - 处理块形式的最佳方法?【英文标题】:Magento - Best way to handle forms in blocks? 【发布时间】:2012-11-28 13:55:31 【问题描述】:

我来自不同的 MVC 框架(例如 Symfony)到 Magento。我阅读了很多关于 Magento 最佳实践的信息,我可以看到 Magento 没有使用典型的 MVC 风格。 Alan Storm 写道:

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

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

没错。但是表格呢?

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

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

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

我做到了。它现在有效,但我不满意。然后,我检查了核心模块中的联系人表单的源代码,这些代码给我弄乱了整个画面。内置的联系人表单使用 IndexController 来完成上述大部分操作,(几乎)像标准 MVC 一样。

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

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

我的困惑主要在于:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

任何重定向都只能在 Controller 中完成。

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

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

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

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

【讨论】:

感谢 Slayer,这就是我的怀疑。这似乎更有意义!我同意你上面的所有论点。根据我的 MVC 知识,我假设了类似的东西。我会检查那些核心代码。非常感谢!【参考方案2】:

我也不是 magento 专业人士,但我想我可以回答您的问题:

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

并根据它从数据库中加载一个对象? (也是,然后传给phtml) 如果你想将模型传递给模板,你应该在你的块上编写一个函数来获取模型。

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

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

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

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

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

【讨论】:

以上是关于Magento - 处理块形式的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

magento 非法块类型

如何在magento管理站点块中翻译变量

Magento-检查是否启用了静态块

magento完全解析cms块

Magento : Mage::getModel 清除数据

如何从产品页面中删除“标签”块?