以Symfony2形式分​​配和更新实体属性

时间:2015-05-31 04:13:48

标签: php symfony symfony-forms

无论如何,我可以分配一个实体并在一个Symfony2表格中编辑其中一个属性吗?

示例:

任务有很多活动。

当我创建活动时,我通过实体表单字段分配任务。我还想在创建实体时更新Task remainingEstimateInSeconds。

活动实体:

<?php

namespace AppBundle\Entity;

/**
 * Activity
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\ActivityRepository")
 */
class Activity
{

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

    /**
     * @Assert\NotNull()
     * @ORM\ManyToOne(targetEntity="Task")
     */
    private $task;
}

任务实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Task
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\TaskRepository")
 */
class Task
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @Assert\NotBlank()
     * @ORM\Column(name="title", type="string", length=255)
     */
    private $title;

    /**
     * @ORM\Column(name="remainingEstimateInSeconds", type="integer", length=255, nullable=true)
     */
    private $remainingEstimateInSeconds;
}

活动表格:

我当前的实现是使用非映射字段。剩下的估计值将重新设置在控制器中的任务中,这不是最佳实现。

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotNull;

class ActivityType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('description');
        $builder->add('task');
        $builder->add('remainingEstimateInSeconds', 'integer', array(
            'mapped' => false,
            'constraints' => array(
                new NotNull()
            )
        ));
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            array(
                'data_class' => 'AppBundle\Entity\Activity',
            )
        );
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'activity';
    }
}

我也尝试使用property_path => "task.remainingEstimateInSeconds",但重复property_path会引发某种错误。

1 个答案:

答案 0 :(得分:0)

如何在主窗体上使用带有POST_SET_DATA和POST_SUBMIT侦听器的非映射字段来预填充字段/更新对象?