Подтвердить что ты не робот

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

Как я уже узнал , 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 по-прежнему требуют, чтобы я заполнил все формы. В случае логических атрибутов это даже означает, что я могу установить только его значение (т.е. 1).

Я что-то делаю неправильно?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 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(),
        ));
    }
}

Ответ 4

Вы также можете использовать параметр 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()

Ответ 5

Или в аннотации Использование:

options={"default":"foo"}

и не:

options={"default"="foo"}

Например:

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