Symfony2表单 - 多对多作为文本导致错误

时间:2015-08-26 12:56:43

标签: php symfony many-to-many formbuilder

我试过寻找可能的解决方案,但没有运气。

我所拥有的是属性和邮政编码之间的多对多关系,例如由于可能的条目数量,我无法在选择中显示邮政编码。

我的解决方案是将其作为表单中的文本字段,然后在PrePersist上捕获它以搜索匹配的记录,然后在持久化到db之前将其应用于实体。

问题是当表单验证时它仍然试图将字符串值传递给期望实体对象的setter。

无论如何都要防止这种情况导致错误吗?

我已经为您附上了我的表单代码。

谢谢,

哈利

 $propertyData = new PropertyData();

        $builder
            ->add('reference')
            ->add('listing_type', 'choice', array('choices' => $propertyData->getListingTypes()))
            ->add('listing_status', 'choice', array('choices' => $propertyData->getStatusList()))
            ->add('title')
            ->add('house_number')
            ->add('address_line_1')
            ->add('address_line_2')
            ->add('town', 'text', array('data_class'=> 'Minos\Bundle\PropertyBundle\Entity\UtilTown'))
            ->add('county')
            ->add('country')
            ->add('council')
            ->add('region')
            ->add('postcode', 'text', array('data_class'=> 'Minos\Bundle\PropertyBundle\Entity\UtilPostcode'))
            ->add('short_description')
            ->add('long_description')
            ->add('size_sq_ft')
            ->add('floor_level')
            ->add('property_age')
            ->add('tenure_type', 'choice', array('choices' => $propertyData->getTenureTypes()))
            ->add('garage')
            ->add('num_living_rooms')
            ->add('num_bathrooms')
            ->add('num_bedrooms')
            ->add('num_floors')
            ->add('num_receptions')
            ->add('property_type')
            //->add('prices')
        ;

1 个答案:

答案 0 :(得分:1)

在处理表单之前,您需要data transformer将字符串输入转换为实体。

   $builder
    // ...
        ->add('postcode', 'text', array(
          'data_class'=> 'Minos\Bundle\PropertyBundle\Entity\UtilPostcode'
        ))
    // ...
    ;

    $builder->get('postcode')->addModelTransformer(new CallbackTransformer(
        //Render an entity to a string to display in the text input
        function($originalInput){
            $string = $originalInput->getPostcode();
            return $string;
        },

        //Take the form submitted value and convert it before processing.
        //$submittedValue will be the string because you defined
        // it in the builder that way
        function($submittedValue){ 
            //Do whatever to fetch the postcodes entity:
            $postcodeEntity = $entityManager->find('AppBundle\postcodes', $submittedValue);
            return $postcodeEntity;
        }
    ));

这只是一个例子(我还没有测试过),您需要更改一些内容以匹配实体的外观。