想象一下这样的场景:我们公司有一个员工在“玩”图形、css、html等。
我们的新项目将在 symfony2 下诞生,所以我们正在尝试一些愚蠢但“真实”的东西(比如来自 db 的身份验证、从表单提交数据并将其持久化到 db 等等..)
问题
据我所知,从我在网站上找到的 symfony2 “书”中了解到(您可以在此处找到),有一种“自动”的方式来创建和呈现表单:
1)以这种方式将表单构建为控制器
$form = $this->createFormBuilder($task)
->add('task','text'),
->add('dueDate','date'),
->getForm();
return $this->render('pathToBundle:Controller:templateTwig',
array('form'=>$form->createview());
2)进入templateTwig
渲染模板
{{ form_widget(form) }} // or single rows method
3)进入一个控制器(同样有一个可以提交数据的路由),取回提交的信息
if($rquest->getMethod()=='POST'){
$form->bindRequest($request);
/* and so on */
}
返回场景
我们的图形员工不想访问控制器、编写 php 和其他类似的东西。因此,他将使用“非常规”(从 symfony2 的角度来看,但从 HTML 的角度来看是传统的)方法编写一个 twig 模板:
/* into twig template */
<form action="{{ path('SestanteUserBundle_homepage') }}" method="post" name="userForm">
<div>
USERNAME: <input type="text" name="user_name" value="{{ user.username}}"/>
</div>
<div>
EMAIL: <input type="text" name="user_mail" value="{{ user.email }}"/>
</div>
<input type="hidden" name="user_id" value="{{ id }}" />
<input type="submit" value="modifica i dati">
</form>
现在,如果进入处理数据提交的控制器,我们会执行类似的操作
public function indexAction(Request $request)
{
if($request->getMethod() == 'POST'){ // sono arrivato per via di un submit, quindi devo modificare i dati prima di farli vedere a video
$defaultData = array('message'=>'ho visto questa cosa in esempio, ma non capisco se posso farne a meno');
$form = $this->createFormBuilder($defaultData)
->add('user_name','text')
->add('user_mail','email')
->add('user_id','integer')
->getForm();
$form->bindRequest($request); //bindo la form ad una request
$data = $form->getData(); //mi aspetto un'array chiave=>valore
/* .... */
我们预计$data
它将包含一个数组,其中包含来自提交表单的键、值。
我们发现这不是真的。在谷歌搜索了一段时间并尝试了其他“坏”想法之后,我们被冻结了。
所以,如果你有一个不能直接处理 php 代码的“图形办公室”,我们如何从表单连接到控制器?
更新
似乎 Symfony2 对表单的字段名称和查找使用不同的约定,一旦您提交了该约定。特别是,如果我的表单名称为addUser
且字段名称为userName
,则该字段的名称AddUser[username]
可能为“动态”查找方法,该方法将提取表单名称、字段名称、连接它们并查找值。
可能吗?