Javascript Symfony2表格处理
我使用表单通过ajax将实体数据处理为api方法 我的类型类:Javascript Symfony2表格处理,javascript,forms,symfony,Javascript,Forms,Symfony,我使用表单通过ajax将实体数据处理为api方法 我的类型类: /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add( $builder->create('basicdata', 'form',
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
$builder->create('basicdata', 'form', array('virtual' => true))
->add('firstname', null, array('required' => true))
->add('lastname', null, array('required' => true))
);
$builder->add('contactdetails', new ContactdetailsType());
$builder->add('medialinks', new MedialinksType());
}
正如你所看到的,我将我的表单分为三个部分,一个是basedata,另外两个是用来保存contactdetails和MediaLink的实体
在我的JavaScript中,创建按钮上有以下侦听器:
$('#player_form_create').on('click', function(e){
e.preventDefault();
$.ajax({
type: "POST",
url: remotePathPlayerCreate,
data: $('.form').serialize()
});
});
根据chromes developer tool,POST数据如下所示:
player_form[basicdata][firstname]:Harvey
player_form[basicdata][lastname]:Specter
player_form[contactdetails][email]:h.specter@pearson.com
player_form[medialinks][website]: http://
在我的API操作中,我想处理请求并保存新的播放器记录:
public function cpostAction()
{
$player = new Player();
$form = $this->createForm(new PlayersType(), $player);
$form->handleRequest($this->getRequest());
if($form->isValid()){
$em = $this->getDoctrine()->getManager();
$em->persist($player);
$em->persist($player->getContactdetails());
$em->persist($player->getMedialinks());
$em->flush();
return $this->redirectView(
$this->generateUrl(
'get_player',
array('id' => $player->getId())
),
Codes::HTTP_CREATED
);
}
return array(
'processedForm' => $form
);
}
正如你所知道的,问题发生在我想处理请求的时候。我猜$this->getRequest()
不包含请求处理程序所需格式的POST数据信息
当我像这样发布数据时,我得到了一个500,其中预期参数类型为\“Symfony\\Component\\HttpFoundation\\Request\”,“array\”给定
我如何才能实现我的帖子数据作为请求对象提交?我在构建应用程序时遇到了同样的问题,服务器端是Symfony,客户端是AngularJS。以这种方式处理表单有效:
$content = $this->get('request')->getContent();
if (!empty($content)) { $params = json_decode($content, true); }
else { // return an error or whatever }
$defaultOptions = array('csrf_protection' => false);
$form = $this->createFormBuilder(null, $defaultOptions)
->add('email', 'email', array(
'constraints' => new Constraints\Email(array('message' => 'emailError'))
))
->getForm();
$form->submit($params);
if ($form->isValid()) {
...
}
当然,这里我没有像你一样使用类型来创建表单,但是结果是一样的。这假设请求有效负载如下所示:
{email: 'test@example.com'}
好的,我找到了解决方案:根据页面,我现在使用
$form->submit
将数组数据提交到表单:
$form->submit($this->getRequest()->request->get($form->getName()));
拜托,对于那个用例,必须有一个最佳实践。我想我不是唯一一个想通过ajax提交表单并利用表单框架的人。当我从我的方法返回
$form
时,我得到的只是{“children”:{“basicdata”:{“children”:{“firstname”:[],“lastname”:[],…
我找到了解决方案:我的负载看起来像这个播放器(表单[basicdata][firstname]=Harvey&player\u form[basicata][lastname]=Specter,因此json\u decode对$content不起作用。您能解释一下为什么要执行$form->submit($params)?是因为请求数据绑定到表单吗?