Magento – 处理块中表单的最佳方法?

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

it’s not the responsibility of the controller to set variables for the
view […] controller’s job is to do certain things to Models,and
then tell the system it’s layout rendering time.

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

对.但形式呢?

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

在Magento中,这些都应该发生在一个块内,而(瘦)控制器只应该准备布局然后再渲染它. (如果我理解的话.)

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

我做到了.它现在有效,但我不满意.那么,我检查了核心模块中Contact表单的源代码,这些对我来说搞乱了整个图片.内置的Contact表单使用IndexController进行上述大多数操作,(几乎)像标准MVC一样.

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

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

我的困惑主要在于:

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

解决方法

您可以查看Customer / AccountController,看看loginPost,createPostmethods如何处理传入的表单数据.

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

表格准备也在Controllers的肩膀上.您需要加载对象并在Controller操作中对其进行验证.然后有几种方法将它传递给块:

>法师::注册(注册表)
> $this-> getLayout-> getBlock(‘your_form_block’) – > setEntity($object)(直接将变量设置为块)

任何重定向都应该只在Controller中完成.

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

>如果您未能加载对象,则表示用户正在使用的URL(带有对象ID)已过时,您可能需要将客户重定向到某个方便的页面并出现错误.
>正如我上面所说,所有重定向都应该只在Controller中完成.这是为什么?因为目前块是进程,Magento已经完成了大量的自举工作 – 比如loadLayout并创建所有块.您不希望让用户等待所有时间只是为了后来重定向他.
>同时将重定向放在Controller中的任何位置都会导致应用程序无法维护.当然也有例外,但你应该知道你做得很好.

你也忘记了另一个有价值的部分.如果验证在控制器内失败,则需要使用用户发送的值填写表单.在Zend_Form中做得很漂亮,但是使用Magento表单你需要使用session(就像它在AccountController中完成的那样) – 在会话中保存所有键值部分,然后在块检查中存在那些会话变量.同样,只有在POST验证失败并且您将用户重定向回表单时,才应执行此操作.在成功的情况下,清除连接到表单的会话变量.

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

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些