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

发布于 2024-12-04 05:25:34 字数 620 浏览 1 评论 0原文

正如我已经发现的,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 表单仍然需要我填写所有表单。对于布尔属性,这甚至意味着我只能将其设置为 true(即 1)。

我做错了什么吗?

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

As I've already found out, Doctrine2 "does not support to set the default values in columns through the “DEFAULT” keyword in SQL. ... you can just use your class properties as default values".

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;

But even when I do this, the generated CRUD forms still require me to fill out all forms. In case of boolean attributes this even means I can only set it to true (i.e. 1).

Am I doing something wrong?

(I know I can turn the validation off but I'd like a solution to the problem instead of just bypassing it)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

半岛未凉 2024-12-11 05:25:34

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

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

Your boolean value need to have nullable set as true:

/**
 * @var string $sale
 *
 * @ORM\Column(name="sale", type="boolean", nullable=true)
 */
private $sale = false;
何以笙箫默 2024-12-11 05:25:34

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

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

In Object-oriented programming you should use constructor of the entity to set a default value for an attribute:

public function __construct() {
    $this->sale = false;
}
断舍离 2024-12-11 05:25:34

我没有使用过 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';
    }
}

同样可以在控制器内生成的表单类中实现

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(),
        ));
    }
}

I haven't used the CRUD auto-generation tool, but I know that by default, each and every field is required. YOu must explicitly pass 'required' => false as an option for your fields.

This can be done in the form classes

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

The same can be achived in a Form class generated inside your controller

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(),
        ));
    }
}
佼人 2024-12-11 05:25:34

您还可以使用“data”参数,如下所示:

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

这里我设置了一个类来使用 JavaScript 制作字段的 jQuery UI 日期选择器。
我还将小部件设置为 single_text,这样我就不会获得三个选择字段。
然后我将默认数据设置为当前的 DateTime()

You can also use the 'data' parameter like in :

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

Here I have set a class to make a jQuery UI datepicker of the field using JavaScript.
I also set the widget to a single_text so I won't get three select fields.
And then I set the default data to the current DateTime()

陪你搞怪i 2024-12-11 05:25:34

或者在注释中
使用:

options={"default":"foo"}

而非:

options={"default"="foo"}

例如:

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

Or In annotations
Use:

options={"default":"foo"}

and not:

options={"default"="foo"}

For instance:

/**
 * @ORM\Column(name="foo", type="smallint", options={"default":0})
 */
private $foo;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文