不带准则“ allow_delete”的带有collectionType的Symfony 4嵌入表单似乎无法正常工作

时间:2018-11-22 20:36:39

标签: php symfony symfony-forms

对于特定项目,我们使用symfony而不使用任何ORM。我们使用REST API来获取和存储数据。 我们的类确实类似于教义实体,但是它是一种定制服务,可以使用API​​获取和存储数据。

对于一个非常复杂的页面,我们有一些可重复的嵌入形式。除删除过程外,一切正常。

当我们在embed集合中删除一个项目(通过使用JavaScript删除DOM中的字段)并提交时,表单数据仍然包含已删除项目的行,但是所有属性均为null。就像我们已经忘记在CollectionType字段上使用“ allow_delete”属性一样。

您能给我们一些帮助吗?

主要对象类:

class Survey extends WSObject
{
    protected $id;
    protected $title;
    protected $surveyQuestions;

    //Getter and setters are ok
}

“子”对象类:

class SurveyQuestion extends WSObject
{
    protected $id;
    protected $title;
    protected $surveyId;

    //Getter and setters are ok
}

表单结构:

// $survey is a well constructed survey with data
$form = $this->createFormBuilder($survey)
        ->add('title', TextType::class,array(
            'label'         => 'Title FR *',
            'required'      => true
        ))
        ->add('surveyQuestions', CollectionType::class, array(
            'entry_type' => SurveyQuestionType::class,
            'allow_add' => true,
            'allow_delete' => true,
            'delete_empty'=>true,
            'label' => false,
            'entry_options' => array(
                'surveyId'=>$survey->getId(),
                'empty_data' => null
            )
        ))
        ->getForm();

SurveyQuestionType:     

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;

class SurveyQuestionType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('id', HiddenType::class,array(
        'required'          => false
    ));
    $builder->add('title', TextType::class,array(
        'required'          => true
    ));
    $builder->add('surveyId', HiddenType::class,array(
        'data' => $options['surveyId'],
        'required'          => false
    ));
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => SurveyQuestion::class,
        'surveyId' => null
    ));
}
}

想象一下已有两个问题的现有调查。如果我们删除表单中的一个问题(通过从JavaScript中的DOM中删除字段)并提交。 $ form-> getData();返回:

Survey {
    id : 42,
    title : 'the meaning of life',
    surveyQuestions : array(2) [
        0 : surveyQuestion {
            id : 1,
            title : 'My first question',
            surveyId : 42
        },
        // This is the corresponding deleted row
        1 : surveyQuestion {
            id : null,
            title : null,
            surveyId : null
        },
    ]
}

我们期望的是:

Survey {
    id : 42,
    title : 'the meaning of life',
    surveyQuestions : array(1) [
        0 : surveyQuestion {
            id : 1,
            title : 'My first question',
            surveyId : 42
        }
    ]
}

如果您需要更多详细信息,请告诉我。提前致谢。 最好的问候。

0 个答案:

没有答案