Как установить значение по умолчанию в Symfony2, чтобы автоматически генерируемые CRUD формы не требовали этих полей? - PullRequest
11 голосов
/ 14 сентября 2011

Как я уже выяснил , Doctrine2 " не поддерживает установку значений по умолчанию в столбцах с помощью ключевого слова DEFAULT в SQL. ... вы можете просто использовать свой класс свойства в качестве значений по умолчанию".

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).

Я что-то не так делаю?

(я знаю, что могу отключить проверку, но я бы хотел решить проблему, а не просто обойти ее)

Ответы [ 5 ]

16 голосов
/ 03 октября 2011

Ваше логическое значение должно иметь значение NULL, установленное в true:

/**
 * @var string $sale
 *
 * @ORM\Column(name="sale", type="boolean", nullable=true)
 */
private $sale = false;
6 голосов
/ 02 апреля 2014

В объектно-ориентированном программировании вы должны использовать конструктор объекта, чтобы установить значение по умолчанию для атрибута:

public function __construct() {
    $this->sale = false;
}
3 голосов
/ 14 сентября 2011

Я не использовал инструмент автоматической генерации 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(),
        ));
    }
}
2 голосов
/ 23 сентября 2012

Вы также можете использовать параметр 'data', как в:

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

Здесь я установил класс, чтобы сделать JQuery UI datepicker поля с использованием JavaScript.Я также установил виджет в single_text, чтобы не получить три поля выбора.А затем я устанавливаю данные по умолчанию для текущего DateTime ()

1 голос
/ 20 октября 2014

Или в аннотациях Используйте:

options={"default":"foo"}

, а не:

options={"default"="foo"}

Например:

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