如何在Symfony2中设置默认值,以便自动CRUD生成的表单不需要这些字段?

时间:2011-09-13 23:13:42

标签: php symfony crud

由于我已经found out,Doctrine2“不支持通过SQL中的”DEFAULT“关键字在列中设置默认值....您可以将类属性用作默认值值”。

class Product
{

// ...

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name = "";

    /**
     * @var string $sale
     *
     * @ORM\Column(name="sale", type="boolean")
     */
    private $sale = false;

但即使我这样做,生成的CRUD表单仍然要求我填写所有表格。在布尔属性的情况下,这甚至意味着我只能将其设置为真(即1)。

我做错了吗?

(我知道我可以关闭验证,但我想解决问题,而不是绕过它)

5 个答案:

答案 0 :(得分:16)

您的布尔值需要将nullable设置为true:

/**
 * @var string $sale
 *
 * @ORM\Column(name="sale", type="boolean", nullable=true)
 */
private $sale = false;

答案 1 :(得分:6)

在面向对象的编程中,您应该使用实体的构造函数来设置属性的默认值:

public function __construct() {
    $this->sale = false;
}

答案 2 :(得分:3)

我没有使用CRUD自动生成工具,但我知道默认情况下,每个字段都是必需的。你必须明确地将'required' => false作为你的字段的选项。

这可以在表格类

中完成
namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class FooType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('field', 'text', array('required' => false));
    }

    public function getName()
    {
        return 'foo';
    }
}

在控制器内生成的Form类中可以获得相同的内容

namespace Acme\DemoBundle\Controller;

use Acme\DemoBundle\Entity\Foo;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    public function newAction(Request $request)
    {
        // ...    

        $form = $this->createFormBuilder($foo)
            ->add('field', 'text', array('required' => false)
            ->getForm();

        // ...

        return $this->render('AcmeDemoBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

答案 3 :(得分:2)

您也可以使用'data'参数,如:

->add('date', 'date', array(
                    'widget' => 'single_text',
                    'format' => 'dd/MM/yyyy',
                    'attr' => array('class' => 'datepicker'),
                    'data' => new \DateTime()
                ))

这里我设置了一个类,使用JavaScript创建该字段的jQuery UI datepicker。 我还将小部件设置为single_text,因此我不会获得三个选择字段。 然后我将默认数据设置为当前的DateTime()

答案 4 :(得分:1)

或者在注释中 使用:

options={"default":"foo"}

而不是:

options={"default"="foo"}

例如:

/**
 * @ORM\Column(name="foo", type="smallint", options={"default":0})
 */
private $foo;