Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 取决于第二个值的Symfony2数据转换器?_Forms_Symfony - Fatal编程技术网

Forms 取决于第二个值的Symfony2数据转换器?

Forms 取决于第二个值的Symfony2数据转换器?,forms,symfony,Forms,Symfony,我有一个模型,其中约会对象与提醒对象具有一对一关系。我想在约会表单中嵌入一组提醒表单。约会对象具有属性Appointment.Date。提醒对象还有一个属性rementer.Date 我制作了一个名为“IntervalType”的自定义类型,由一个“数字”下拉列表和一个“单位”下拉列表组成,用于提醒。日期输入。其思想是用户选择一个数字和一个单位(“1小时”、“2天”等) 然后,我需要将“2天”转换为一个日期时间值,用于提醒。比约会日期早2天的日期。我正试图找出如何使用名为“IntervalToD

我有一个模型,其中约会对象与提醒对象具有一对一关系。我想在约会表单中嵌入一组提醒表单。约会对象具有属性Appointment.Date。提醒对象还有一个属性rementer.Date

我制作了一个名为“IntervalType”的自定义类型,由一个“数字”下拉列表和一个“单位”下拉列表组成,用于提醒。日期输入。其思想是用户选择一个数字和一个单位(“1小时”、“2天”等)


然后,我需要将“2天”转换为一个日期时间值,用于提醒。比约会日期早2天的日期。我正试图找出如何使用名为“IntervalToDateTransformer”的自定义数据转换器来实现这一点。我可以将数据转换器添加到提醒表单或IntervalType输入等,但如何让转换器知道提醒的家长约会。日期是?

起初,我认为这是不可能的,因为我以前在这个问题上做过一些研究。我决定试试看,结果成功了。基本上,我创建了一个自定义表单类型,它有两个字段issue和option。然后我设法在数据转换类中获得这两个值,它们可以用于转换。这是文件

Note that the 'option' field is not used, but I did verify 
it was accessible from the data transformer.

Also, I could not manage to render the validation messages declared 
on the data transform class when transformation fails. I stopped 
there, but if you manage to do it let me know.
第一型

class IssueSelectorType extends AbstractType
{

    /**
     * @var ObjectManager
     */
    private $om;

    /**
     * @param ObjectManager $om
     */
    public function __construct(ObjectManager $om)
    {
        $this->om = $om;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('number', 'text', array(
                // 'mapped' => false
        ));
        $builder->add('option', 'choice', array(
                // 'mapped' => false
        ));

          $transformer = new IssueToNumberTransformer($this->om);
          $builder->addViewTransformer($transformer);
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'invalid_message' => 'The selected issue does not exist',
        ));
    }

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

    public function getParent()
    {
        return 'field';
    }

}
数据转换器类别:

class IssueToNumberTransformer implements DataTransformerInterface
{

    /**
     * @var ObjectManager
     */
    private $om;

    /**
     * @param ObjectManager $om
     */
    public function __construct(ObjectManager $om)
    {
        $this->om = $om;
    }

    /**
     * Transforms an object (issue) to a array .
     *
     * @param  Issue|null $issue
     * @return array
     */
    public function transform($issue)
    {
        if (null === $issue)
        {

            return array(
                'number' => 0,
                'option' => 0
                    );
        }

        return array(
            'number' => $issue->id,
            'option' => 0
        );
    }

    /**
     * Transforms a array  to an object (issue).
     *
     * @param  array $value
     * @return Issue|null
     * @throws TransformationFailedException if object (issue) is not found.
     */
    public function reverseTransform($value)
    {
        if (null === $value)
        {
            return null;
        }

        if (!is_array($value))
        {
            throw new UnexpectedTypeException($value, 'array');
        }
        $number = $value['number'] ;
        $option = $value['option'] ;

        $issue = $this->om
                ->getRepository('AcmeTransformerBundle:Issue')
                ->findOneBy(array('id' => $number))
        ;

        if (null === $issue)
        {
            throw new TransformationFailedException(sprintf(
                            'An issue with number "%s" does not exist!', $number
            ));
        }

        return $issue;
    }
}