繁体   English   中英

动态形式Symfony上的约束违规

Constraint Violation on dynamic form Symfony

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在Symfony3.4上工作,我有一个动态的形式country-> region-> city(3个不同的实体)。 我可以根据用户选择更改字段,而不会出现任何问题。

但是由于对字段城市(仅此字段)的约束违反,我无法持久保存在数据库中

我真的不知道为什么,因为我用相同的方式称呼他们(地区和城市)...

任何帮助都将受到欢迎。

这是表格:

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $em = $options['entityManager'];

    $builder
        ->add('rue', TextType::class, array(
            'label' => 'votre rue',
            'required' => true,
        ))

        ->add('pays', EntityType::class, array(
            'class' => 'AppBundle\Entity\Pays',
            'placeholder' => '--choisir--',
            'choice_label' => 'nom',
            'required' => true
        ))
    ;

    $addRegion = function (FormInterface $form, Pays $pays = null) {
        $regions = null === $pays ? array() : $pays->getRegions();

        $form->add('region', EntityType::class, array(
            'class' => 'AppBundle\Entity\Region',
            'placeholder' => '--choisir une région--',
            'choices' => $regions,
            'choice_label' => 'nom',
            'required' => true
        ));

    };

    $addVille = function (FormInterface $form, Region $region = null) {
        $villes = null === $region ? array() : $region->getVilles();

        $form->add('ville', EntityType::class, array(
            'class' => 'AppBundle\Entity\Ville',
            'placeholder' => '--choisir une ville--',
            'choices' => $villes,
            'choice_label' => 'nom',
            'required' => true
        ));


        $form->add('submit', SubmitType::class
        );

    };

    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (FormEvent $event) use ($addRegion, $addVille){
            $form = $event->getForm();
            $addVille($form, null);
            $addRegion($form, null);
        }
    );

    $builder->addEventListener(
        FormEvents::PRE_SUBMIT,
        function (FormEvent $event) use ($addRegion, $addVille, $em) {
            $form = $event->getForm();
            $data = $event->getData();
            if(isset($data['pays'])){
                $paysId = $data['pays'];

                $repo = $em->getRepository('AppBundle\Entity\Pays');
                $pays = $repo->find($paysId);

                $addRegion($form, $pays);
                $addVille($form, null);
            }
            else if(isset($data['region'])){
                $regionId = $data['region'];

                $repo = $em->getRepository('AppBundle\Entity\Region');
                $region = $repo->find($regionId);

                $addVille($form, $region);
            }
        }
    );
}

这是模板:

{% block body %}

{% form_theme form 'bootstrap_4_layout.html.twig' %}

{% for message in app.flashes('notice') %}
    <div style="color:green;">
        {{ message }}
    </div>
{% endfor %}

{{ form_start(form) }}
{{ form_errors(form) }}
{{ form_end(form) }}

{%endblock%}

{%块javascripts%}

<script>
    var $pays = $('#adresse_pays');
    var $region = $('#adresse_region');
    var $ville = $('#adresse_ville');

    $pays.change(function() {
        var $form = $(this).closest('form');
        var data = {};
        data[$pays.attr('name')] = $pays.val();
        // Submit data via AJAX to the form's action path.
        $.ajax({
            url : $form.attr('action'),
            type: $form.attr('method'),
            data : data,
            success: function(html) {
                $ville.empty()
                var select = $(html).find('#adresse_ville > option')
                $ville.append(select)

                $region.empty()
                var select = $(html).find('#adresse_region > option')
                $region.append(select)
                $region.val($("#adresse_region option:first").val());
                console.log('regions')
                console.log(select)
            }
        });
    });


    $region.change(function() {
        var $form = $(this).closest('form');
        var data = {};
        data[$region.attr('name')] = $region.val();
        // Submit data via AJAX to the form's action path.
        $.ajax({
            url : $form.attr('action'),
            type: $form.attr('method'),
            data : data,
            success: function(html) {
                $ville.empty()
                var select = $(html).find('#adresse_ville > option')
                $ville.append(select)
                $ville.val($("#adresse_ville option:first").val());
                console.log('villes')
                console.log(select)
            }
        });
    });


</script>

{%endblock%}

这是表单上的警报(城市字段旁边):错误此值无效

由于调试栏,我走得更远,而且似乎该字段不是发送对象,而是发送整数。

我发现与另一个领域的区别是在城市领域:

Normalized Format submitted is null

而在另一个领域(例如region)中:

Normalized Format   

Region {#6035 ▼
  -id: 3
  -nom: "Catalogne"
  -villes: PersistentCollection {#6039 …}
  -pays: Pays {#5802 ▶}
  -adresses: PersistentCollection {#6041 …}

}

1 个回复

有用 !

我拆分功能

$ builder-> addEventListener(FormEvents :: PRE_SUBMIT,...减半=>我删除else if,并在更改“ region”时使另一个相似的函数监听。

令我困扰的是我不明白为什么它会以这种方式起作用,但反之则不...

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,
    function (FormEvent $event) use ($addRegion, $addVille, $em) {
        $form = $event->getForm();
        $data = $event->getData();
        if(isset($data['pays'])){
            $paysId = $data['pays'];
            $repo = $em->getRepository('AppBundle\Entity\Pays');
            $pays = $repo->find($paysId);
            $addRegion($form, $pays);
            $addVille($form, null); 
        }
    }        
);

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,
    function(FormEvent $event) use ($addVille, $em) {
        $form = $event->getForm();
        $data = $event->getData();
        if(isset($data['region'])){
            $regionId = $data['region'];
            $repo = $em->getRepository('AppBundle\Entity\Region');
            $region = $repo->find($regionId);
            $addVille($form, $region); 
        }           
    }
);
1 违反Symfony完整性约束

我尝试对“文件”实体进行级联删除,以防止删除“扩展”实体。 但这是行不通的。 错误: 无法删除或更新父行,外键约束失败( zioo 。 files ,约束FK_6354059F395DB7B外键( expense_id )参考文献expenses ( id )) 文件实体代码 ...

2 Yii2动态表格约束违反数据库表中的唯一索引

我正在创建具有动态字段的表单,其中2个字段在数据库表中具有唯一索引。 第一个“固定电话”和第二个“地址”。 如果在任何动态添加的字段中没有重复的值,则表单提交没有任何错误,但是,如果我输入的地址或座机线与之前添加的任何字段匹配,那么即使我已经添加了规则,也会显示约束冲突而不是显示错误消息在模 ...

3 违反诚信约束原则2和Symfony

我正在使用某种textbuilder,可以在其中添加块来构建文本。 构建基块是在数据库中定义的,当您在文本中添加1时,它将被保存在会话中(如何构建它们)。 但是现在当我尝试将会话持久化到数据库时,我得到了: 他想添加构建基块的现有定义,但是已经定义了。 会话本身已序列化。 ...

7 ORM和Symfony2违反完整性约束1062

我有一个具有主键的实体,如下所示: 但是,当我尝试使用set方法插入ProductId时,出现此错误: 完整性约束违反1062密钥“主”的重复条目“ 0” 我尝试使用* @ORM \\ GeneratedValue(strategy =“ NONE”),但结果相同,我需 ...

8 是否可以在 symfony 5 中自定义违规约束错误渲染?

我是 symfony 的初学者,我想使用框架工具从头开始创建一个注册表单。 所以不使用“make:register ...”命令行。 我已经用注释语法实现了一个表单和约束。 但是,当我想显示消息错误时,它会显示:注册表错误视图示例 我想要的是在我的控制器中获取所有约束错误并将它们呈现在引导程序危险 ...

9 Symfony 1.4 embedRelation完整性约束违反

我已找到有关此问题的一些有用信息,但无法完全解决问题。 因此,我希望有人可以向我解释一个有用的解决方案,而不是一个插件/黑客/变通办法,我正在努力地尝试“正确”的方法: 所以这是我的问题: 模式: 所以用英语来说,我有一个学生,有一个父母,那个父母有一个简单的电子邮件地址。 ...

10 Symfony-违反完整性约束:1062复制条目

我试图为我的问题找到答案,但是没有成功。 我正在使用Symfony(已经使用了2个月),当我想建立多对多关系时遇到问题。 我有家,也有服务。 一所房屋可以提供很多服务,而一项服务可以拥有很多房屋。 一切正常,而且我了解该原则可用于许多工作,我在控制器中刷新之前将所有值都保留了下来,但 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM