форма symfony2 с сущностью «многие ко многим»

У меня есть эта форма с отношением manyTomany, отлично работающим следующим образом:

    public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('manifestations', 'entity', array(
                'class' => 'PrifProtocoleBundle:Manifestation',
                'multiple' => true,
                'expanded' => false,
                'property' => 'libelle',
                'empty_value' => 'Choississez',
                'required' => false,));
}

но я хочу установить для параметра «несколько» значение «ложь», таким образом, у меня просто есть поле выбора с опцией «Выбор», поэтому, когда я нажимаю на него, отображаются все остальные значения. К сожалению, я получаю сообщение об ошибке: ни один из методов _set()" или "_call()" не существует и не имеет общего доступа в классе. Я искал некоторые решения в Интернете и пробовал Вот этот:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('manifestations', 'collection', array(
                'type' => 'entity', 
                'options' => array(
                'class' => 'AcmeProtoBundle:Manifestation',
                'multiple' => false,
                'expanded' => false,
                'property' => 'libelle',
                'empty_value' => 'Choisissez',
                'required' => false,)));
}

у меня нет сообщения об ошибке! но форма выбора не отображается, даже когда я устанавливаю для параметра «несколько» значение «истина», у меня есть только кнопка отправки, при нажатии на которую отображаются результаты, поэтому я думаю, что я что-то пропустил в параметрах для отображения формы!

кто-нибудь может помочь? Спасибо

Манифестация.php

/**
 * @ORM\Entity
 * @ORM\Entity(repositoryClass="ManifestationRepository")
 */

Проявление класса {

public function __construct() {

    $this->dateCreation = new \DateTime;
    $this->dateModif = new \DateTime;
}

public function __toString() {
    return $this->getLibelle();
}

/**
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\Id
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\Column(type="integer")
 * @Assert\GreaterThan(
 *      value = 0,
 *      message = "La valeur doit être positive"
 * )
 */
private $numOrdre;

/**
 * @ORM\Column(type="string",length=50)
 * @Assert\Length(
 *      min = "5",
 *      minMessage = "Le libellé doit faire au moins {{ limit }} caractères"
 * )
 */
private $libelle;

/**
 * @ORM\Column(type="datetime")
 */
private $dateCreation;

/**
 * @ORM\Column(type="datetime")
 */
private $dateModif;

/**
 * @ORM\Column(type="boolean")
 * @Assert\NotBlank( message=" ")
 */
private $etat;

//getters and setters

инвайт.php

/**
 * @ORM\Entity
 * @ORM\Entity(repositoryClass="InviteRepository")
 * 
 */

класс Пригласить {

 /**
 * @var boolean
 *
 * @ORM\ManyToMany(targetEntity="Acme\ProtoBundle\Entity\Manifestation", cascade={"persist"})
 * @Assert\NotBlank(message=" ")
 */
private $manifestations;

person Albee    schedule 08.01.2014    source источник


Ответы (2)


Можете ли вы показать свой файл manifest.php (ваша сущность)?

Несколько не имеет нужного вам поведения: Несколько используется, чтобы позволить пользователю установить несколько флажков (true) или только один (false) в заданной форме. (документ Symfony: несколько).

В вашем случае распространенным решением является использование javascript в родительском поле, которое отключит/включит дочерние поля. Не забудьте добавить проверку на стороне сервера в этих полях, если вы идете на это.

person np87    schedule 09.01.2014
comment
Спасибо за ответ, я добавил файлы сверху! На самом деле решение, которое я пробовал с параметром «коллекция», я нашел здесь fr.openclassrooms.com/forum/sujet/ в конце страницы. кнопка отправки показывает мне результаты, но я думаю, что, возможно, я что-то упускаю в параметре для отображения тега выбора, потому что даже когда я ставлю кратное значение true, форма не отображается. - person Albee; 09.01.2014
comment
Что касается вашего решения, я не знаком с javascript, не могли бы вы показать мне пример того, как это сделать? Спасибо - person Albee; 09.01.2014
comment
Если вы еще этого не сделали, первое, что вам нужно сделать в своей сущности, — это создать методы Getter и Setters. Для этого есть команда Symfony, больше информации здесь -› [ссылка] (symfony.com/doc/current/book/). Сообщение об ошибке, которое вы получаете, касается этих методов получения/установки. - person np87; 09.01.2014
comment
Затем в предоставленной вами ссылке пользователь пытается показать форму с кнопкой добавления поля: для этого и нужны коллекции. Это то, чего вы пытаетесь достичь здесь? - person np87; 09.01.2014

Это решение работает для меня сейчас с 'multiple' => false':

Я добавил эту функцию в другую сущность в связи с Проявлением, чтобы рассматривать проявления как массив

    public function setManifestations($manifestations){
    if(!is_array($manifestations)){
        $manifestations = array($manifestations);
    }
    $this->manifestations = $manifestations;
}
person Albee    schedule 09.01.2014