我有这样的形式:
名称(必填)。
slug(必填)。
slug
,但允许用户在表单字段中将其留空(如果用户将slug留空,则会使用name
作为输入)。
我尝试使用Event form listener
,但它说您无法更改已提交表单的值。我尝试使用Data transformers
这样:
public function reverseTransform($slug)
{
if ($slug) {
return $slug;
} else {
return $this->builder->get('name')->getData();
}
}
return $this->builder->get('name')->getData();
始终返回null。所以我试着这样:
public function reverseTransform($slug)
{
if ($slug) {
return $slug;
} else {
return $_POST['category']['name'];
}
}
它有效,但我认为它反对框架。我怎么能以正确的方式做到这一点?
答案 0 :(得分:2)
您也可以在控制器中执行此操作
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
// get the data sent from your form
$data = $form->getData();
$slug = $data->getSlug();
// if no slug manually hydrate the $formObject
if(!$slug)
{
$formObject->setSlug($data->getName());
}
$em->persist($formObject);
$em->flush();
return ....
}
}
答案 1 :(得分:1)
如果您使用函数将代码保存在一个位置,那么您也不应该使用Request数据。 在表单操作中,您可以调用该函数,包括名称变量。
public function reverseTransform($name, $slug)
{
if (!empty($slug)) {
return $slug;
} else {
return $name;
}
}
答案 2 :(得分:0)
另一种可能的方法是通过请求类设置如下:
数组表单 <input name="tag['slug']"...>
:
public function createAction(Request $request)
{
$postData = $request->request->get('tag');
$slug = ($postData['slug']) ? $postData['slug'] : $postData['name'];
$request->request->set('tag', array_merge($postData,['slug' => $slug]));
.......
常用表单 <input name="slug"...>
:
$request->request->set('slug', 'your value');
我认为这是最好的方法,因为如果您使用dml-filter-bundle
,则无需再次在控制器中过滤输入:
$this->get('dms.filter')->filterEntity($entity);