最好的方式来处理块的形式?

我来自不同的MVC框架(例如Symfony)到Magento。 我读了很多关于Magento的最佳实践,我可以看到Magento不使用典型的MVC风格。 艾伦风暴写了以下内容:

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

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

对。 但是形式呢?

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

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

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

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

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

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

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

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

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

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

  • Mage::register (注册)
  • $this->getLayout->getBlock('your_form_block')->setEntity($object) (直接设置变量为block)
  • 任何重定向都应该只在Controller中完成。

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

  • 如果您无法加载您的对象,这意味着用户正在使用的URL(使用对象ID)已过时,您可能需要将客户重定向到某个方便的错误页面。
  • 正如我上面所说的,所有重定向应该只在Controller中完成。 这是为什么? 因为目前block是进程,所以Magento已经完成了大量的引导工作,比如loadLayout并创建所有的块。 您不希望让用户等待所有时间,只是为了在事后重定向他。
  • 同时将重定向放置在Controller中的任何位置都会使应用程序无法维护。 当然也有例外,但你应该知道自己做得很好。
  • 你也忘记了更多有价值的部分。 如果控制器内的验证失败,则需要使用用户发送的值填写表单。 在Zend_Form中做得很好,但对于Magento表单,您需要使用会话(例如在AccountController中完成) - 将所有键值部分保存在会话中,然后在块中检查这些会话变量是否存在。 同样,只有当您的POST验证失败并且您将用户重定向到您的表单时,您才应该这样做。 在成功的情况下清除连接到表单的会话变量。

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


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

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

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

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

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

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

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

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

    链接地址: http://www.djcxy.com/p/59479.html

    上一篇: Best way to handle forms in blocks?

    下一篇: view doesn't show up