@e-hot

Symfony 2. Как вывести в форме value selected в списке внедренной формы?

Приветствую всех. Исходная ситуация:
(пропущены не существенные для вопроса части кода)

Сущность Oldemand:
namespace Acme\AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
...
class Oldemand
{
...
     /**
     * @var integer
     * 
     * @ORM\Column(name="status_id", type="integer")
     * @ORM\ManyToOne(targetEntity="Status", inversedBy="status_id")
     * @ORM\JoinColumn(name="status_id", referencedColumnName="id")
     */
    private $status_id;
...
}


Форма formEditOldemandType:
namespace Acme\AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManager;

use Acme\AppBundle\Form\formStatusType;

class formEditOldemandType extends AbstractType
{
    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder->add( 'status', new formStatusType() )
        ...
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Acme\AppBundle\Entity\Oldemand',
        );
    }

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


Форма StatusType, внедренная в formEditOldemandType:
namespace Acme\AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
//use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class formStatusType extends AbstractType
{
    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder->add( 'status', 'entity', array(
                            'class' => 'Acme\AppBundle\Entity\Status',
                            'property' => 'status_name',
                            'label'  => 'Статус: '
                        )
                    );
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Acme\AppBundle\Entity\Status',
        );
    }

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


Сущность Status:
namespace Acme\AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

...
class Status {
    
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="bigint", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="status_id", type="bigint")
     */
    private $status_id;
    
    /**
     * @var string
     *
     * @ORM\Column(name="status_name", type="string")
     */
    private $status_name;
    ...
}


При таком описании сущностей и способа внедрения формы у меня в форме formEditOldemandType
выводится полный список статусов из внедренной сущности Status, но такой вывод всех
возможных статусов хорош когда заявка (Oldemand => demand - заявка) создается -
выбрали нужный статус и сохранили в БД новую заявку.

Но у меня formEditOldemandType - форма редактирования уже существующей заявки
с существующим значением статуса, т.е. в поле status должны выводиться списком
все статусы из сущности Status и внедренной формы StatusType, где существующее
значение из сущности Oldemand должно быть selected - все.
Или другими словами: formEditOldemandType должно выводить текущее значение, выделенное как selected
в списке всех статусов из внедренной формы StatusType.

Что мне нужно сделать в приведенном выше коде, чтобы получился selected значения?

Заранее благодарю за помощь.
  • Вопрос задан
  • 780 просмотров
Пригласить эксперта
Ответы на вопрос 3
lexxpavlov
@lexxpavlov
Программист, преподаватель
Похоже, проблема в том, что при создании формы создаётся и новый объект статуса, который не имеет установленного статуса:
$builder->add( 'status', new formStatusType() )

Попробуйте передать объект статуса в форму:
class formEditOldemandType extends AbstractType
{
    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder->add( 'status', $options['status'] )
        ...
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Acme\AppBundle\Entity\Oldemand',
            'status' => new formStatusType(),
        );
    }

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


У вас старая версия Symfony - метод getDefaultOptions() убран в версии 2.3, и уже в версии 2.1 вместо него используется метод setDefaultOptions(), а в версии 2.7 используется configureOptions(). Вам следовало бы указать этот факт в вопросе. Какая версия использована в вашем проекте?
Ответ написан
miraage
@miraage
Старый прогер
Попробуйте так.
$builder->add( 'status', 'entity', array(
    'class' => 'Acme\AppBundle\Entity\Status',
    'property' => 'status_name',
    'label'  => 'Статус: ',
    'data' => 5, // selected value
));
Ответ написан
@e-hot Автор вопроса
Спасибо всем за ответы и советы - пока ничего не помогло, поэтому я вчитываюсь в очередной раз в документацию по Доктрине 2 - здесь, я думаю, у меня имеются проблемы с пониманием отображения связей между сущностями, и документацию по формам и внедренным формам.
В связи со всем этим у меня ситуация такова:
1. Отображение связей между сущностями я поправил, т.е. в тестовом режиме из контроллера могу брать родительские сущности и через их свойства-поля запрашивать связанные (дочерние) сущности и, соответственно, их любые свойства-поля - итого: здесь все отлично, все настроено.
2. Теперь я пытаюсь на все отображения сущностей и отображения связей между сущностями нахлобучить обращения из класса(ов) форм или другими словами: завязать работу форм на имеющиеся связанные сущности - вот здесь у меня и происходит клин. Читаю вдоль и поперек доки по формам и внедренным формам (субформам в качестве коллекции) и не могу осмыслить механизм того -
и сам ВОПРОС:
как поверх отображений связей в сущностях указывать связи между формами, базовой и внедренной в нее. На других форумах пишут, юзай документацию - там все есть, да, в документации есть про отображение связей - отдельно, про формы - отдельно. Не могу понять: для того, чтобы внедренные формы работали в базовой форме, я должен в родительскую сущность вводить дополнительное поле-свойство, чтобы через него впоследствии связывать коллекцию дочерних сущностей? Или я должен просто модифицировать имеющееся поле в родительской сущности под связывание? Помогите разобраться вот с этим моментом? Заранее благодарю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы