在symfony2中提交后修改表单值

时间:2014-11-11 21:29:04

标签: php forms symfony

我有这样的形式:

  1. 名称(必填)。

  2. slug(必填)。

  3. 后端需要

    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'];
        }
    }
    

    它有效,但我认为它反对框架。我怎么能以正确的方式做到这一点?

3 个答案:

答案 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);