Symfony收集表单数据不在post params中

时间:2014-08-04 12:20:58

标签: forms symfony collections

今天我们的用户报告说保存他的简历不起作用,它不能保存他的技能,语言,驾驶执照等级,学校和上一页。就业。

这是我在网站的两个部分使用的收藏表格(简历和优惠)......

有趣的是,我们在上线之前测试了它并从IE6直播到任何其他更新的浏览器。

使用“添加foobar记录”按钮正确添加了集合,当数据库中有任何记录时,它会在编辑中正确显示,当我编辑这些记录时,它将被保存,如果我删除它们将被删除。

但是当我添加新内容时,这些新记录不在表单发布数据中。我无法理解它的形式,html的部分是否正确呈现,为什么它不包含在帖子中......

这些集合与Offer实体一起使用,保存更新已添加......没问题。我检查了控制器代码,javascript代码,实体代码,html代码,集合模板,表单类型..

这是DB结构:

http://i.stack.imgur.com/b7TnU.png

这是我如何在botz CV和Offer

中添加集合
<div class="tbl">
    <div class="row">
        <div class="col" style="text-align: center; width: 100%;">Počítačové znalosti</div>
    </div>
    <div class="divider"></div>
    <div class="skills" data="0" data-prototype="{% filter escape %}{% include 'TvarplastTopzamBundle:Collections:SkillCollection.html.twig' with {'form': form.skills.vars.prototype} %}{% endfilter %}">
            {% for skill in form.skills %}
        <div class="row">
                    {% include 'TvarplastTopzamBundle:Collections:SkillCollection.html.twig' with {'form': skill} %}
        </div>
        <script type="text/javascript">$(".skills").data("index", {{ loop.index }});</script>
            {% endfor %}
    </div>
    <div class="row">
        <div class="col">
            <a href="#" class="add_skill_link">Pridať počítačovú znalosť</a>
        </div>
    </div>
</div>

问题不能与实体有关,因为如果某个关系存在于DB中,显示为集合,如果对其进行编辑,则可以更改或删除,并将其显示在post参数中,然后实体,表单类型,不能出错

但我处理这样的形式:

public function zivotopisAction(\Symfony\Component\HttpFoundation\Request $request, $showmsg = false) {

    if (!$this->get("data")->hasPerm(Role::WORKER, $this->getUser())) {
        $message["show"] = true;
        $message["text"] = "Nemáte požadované oprávnenia. Stránka nemôže byť zobrazená.";
        $message["type"] = "box-red";
        return new \Symfony\Component\HttpFoundation\Response($this->renderView("TvarplastTopzamBundle::error.html.twig", array("message" => $message)));
    }

    $return = array();
    $message = array("show" => $showmsg, "type" => "", "text" => "");

    if ($message["show"]) {
        $message["text"] = "Je nutné vyplniť nasledujúce informácie pre pokračovanie.";
        $message["type"] = "box-red";
    }

    $em = $this->getDoctrine()->getManager();
    if (!is_null($this->getUser()->getZivotopis())) {
        $zivotopis = $em->getRepository("TvarplastTopzamBundle:Zivotopis")->find($this->getUser()->getZivotopis()->getId());
    } else {
        $zivotopis = new \Tvarplast\TopzamBundle\Entity\Zivotopis();
    }

    $originalSkills = new \Doctrine\Common\Collections\ArrayCollection();
    if ($zivotopis->getSkills()) {
        foreach ($zivotopis->getSkills() as $skill) {
            $originalSkills->add($skill);
        }
    }
    $originalLanguages = new \Doctrine\Common\Collections\ArrayCollection();
    if ($zivotopis->getLanguages()) {
        foreach ($zivotopis->getLanguages() as $language) {
            $originalLanguages->add($language);
        }
    }
    $originalDrivingskills = new \Doctrine\Common\Collections\ArrayCollection();
    if ($zivotopis->getSkilldriving()) {
        foreach ($zivotopis->getSkilldriving() as $skilldriving) {
            $originalDrivingskills->add($skilldriving);
        }
    }
    $originalEmployments = new \Doctrine\Common\Collections\ArrayCollection();
    if ($zivotopis->getEmployments()) {
        foreach ($zivotopis->getEmployments() as $employment) {
            $originalEmployments->add($employment);
        }
    }
    $originalSchools = new \Doctrine\Common\Collections\ArrayCollection();
    if ($zivotopis->getSchools()) {
        foreach ($zivotopis->getSchools() as $school) {
            $originalSchools->add($school);
        }
    }

    $form = $this->createForm(new \Tvarplast\TopzamBundle\Form\ZivotopisType(), $zivotopis, array(
        'action' => $this->generateUrl('zivotopis'),
    ));


    $form->handleRequest($request);

    if ($form->isValid()) {
        //var_dump($_POST); die();
        foreach ($originalSkills as $skill) {
            if (false === $zivotopis->getSkills()->contains($skill)) {
                $skill->getZivotopis()->removeElement($zivotopis);
                $em->persist($skill);
                $em->remove($skill);
            }
        }
        foreach ($originalLanguages as $language) {
            if (false === $zivotopis->getLanguages()->contains($language)) {
                $language->getZivotopis()->removeElement($zivotopis);
                $em->persist($language);
                $em->remove($language);
            }
        }

        foreach ($originalDrivingskills as $drivingskill) {
            if (false === $zivotopis->getSchools()->contains($drivingskill)) {
                $drivingskill->getZivotopis()->removeElement($zivotopis);
                $em->persist($drivingskill);
                $em->remove($drivingskill);
            }
        }
        foreach ($originalEmployments as $employment) {
            if (false === $zivotopis->getEmployments()->contains($employment)) {
                $employment->getZivotopis()->removeElement($zivotopis);
                $em->persist($employment);
                $em->remove($employment);
            }
        }
        foreach ($originalSchools as $school) {
            if (false === $zivotopis->getSchools()->contains($school)) {
                $school->getZivotopis()->removeElement($zivotopis);
                $em->persist($school);
                $em->remove($school);
            }
        }

        $zivotopis->upload();
        $zivotopis->setBasicUser($this->getUser());
        $zivotopis = $form->getData();
        $em->persist($zivotopis);
        $em->flush();

        $message["text"] = ($this->container->get('security.context')->isGranted('ROLE_WORKER') ? "Životopis" : "Profil") . " bol úspešne uložený.";
        $message["type"] = "box-yellow";
        $message["show"] = true;
    }

    $return["form"] = $form->createView();
    $return["message"] = $message;
    return $return;

我的javascript看起来像这样:

$(document).ready(function() {

    $.extend({getDeleteLinkCode: function(div) {
            return '<div class="col" style="margin-top: 8px; margin-left: 3px;"><a href="#" style="margin-top: 5px;" >Odstrániť</a></div>';
        }});

    $.extend({addSubFormSelectChangeListener: function(collectionHolder, formRow, div) {
            formRow.find('select' + (!div ? ':first' : '')).on("change", function() {
                var org = $(this);
                if (collectionHolder.find(!div ? "tr" : "div").size() > 1) {
                    collectionHolder.find(!div ? "tr" : "div").each(function() {
                        if (org.val() === $(this).find('select:first').val() && org.attr("id") !== $(this).find("select:first").attr("id")) {
                            org.parent().parent().remove();
                        }

                    });
                }
            });
        }});

    $.extend({addSubForm: function(collectionHolder, div) {
            var prototype = collectionHolder.data('prototype');
            var index = collectionHolder.data('index');
            index = (index !== parseInt(index) ? 0 : index);
            var form = prototype.replace(/__name__/g, index);
            var formRow = $((div ? '<div class="row"></div>' : '<tr></tr>')).append(form);
            var removeFormRow = $($.getDeleteLinkCode(div));
            formRow.append(removeFormRow);
            collectionHolder.data('index', index + 1);
            collectionHolder.append(formRow);
            removeFormRow.on('click', function(e) {
                e.preventDefault();
                formRow.remove();
            });
            $.addSubFormSelectChangeListener(collectionHolder, formRow, div);
        }});


    function addSubFormItemDeleteLink(collectionHolder, $tagFormLi, div, notag) {
        var $removeFormA = $($.getDeleteLinkCode(div));
        $tagFormLi.append($removeFormA);
        $removeFormA.on('click', function(e) {
            e.preventDefault();
            $tagFormLi.remove();
        });
        $.addSubFormSelectChangeListener(collectionHolder, $tagFormLi, div);
    }

    jQuery.fn.toggleOption = function(show) {
        $(this).toggle(show);
        if (show) {
            if ($(this).parent('span.toggleOption').length) {
                $(this).unwrap();
            }
        } else {
            if ($(this).parent('span.toggleOption').length === 0) {
                $(this).wrap('<span class="toggleOption" style="display: none;" />');
            }
        }
    };

    $.extend({comboFilter: function(inputField, comboBox) {
            $("#" + inputField).delayBind("input", function() {

                var inputValue = $(this).val().toLowerCase();
                var combobox = document.getElementById(comboBox);

                $("#" + comboBox).children("span").children("optgroup").each(function() {
                    $(this).toggleOption(true);
                });


                optionToSelect = false;

                $("#" + comboBox + " option").each(function() {
                    if ($(this).text().toLowerCase().replace(/<.+?>/g, "").replace(/\s+/g, " ").indexOf(inputValue.replace(/<.+?>/g, "").replace(/\s+/g, " ")) !== -1) {
                        optionToSelect = $(this);
                        $(this).toggleOption(true);
                    } else {
                        $(this).toggleOption(false);
                    }
                    if (optionToSelect !== false) {
                        $(optionToSelect).select();
                    }
                });


                $("#" + comboBox).children("optgroup").each(function() {
                    if ($(this).children("option").length <= 0) {
                        $(this).toggleOption(false);
                    } else {
                        $(this).toggleOption(true);
                    }
                });

                if ($("#" + comboBox).children("optgroup").length <= 0) {
                    $("#" + comboBox).children("span").children("optgroup").children("option").each(function() {
                        $(this).parent().toggleOption(true);
                    });
                }

                if (inputValue === '') {
                    combobox[0].selected = true;
                    $("#" + comboBox).children("span").children("optgroup").each(function() {
                        $(this).toggleOption(true);
                    });
                }


            }, 50);
        }});


    /* skills */
    holderSkills = $('div.skills');
    holderSkills.find('div.row').each(function() {

        addSubFormItemDeleteLink(holderSkills, $(this), false, false);
    });

    $(".add_skill_link").on('click', function(e) {
        e.preventDefault();
        $.addSubForm(holderSkills, true);
    });

    /* driving */
    holderDriving = $('div.skilldriving');
    holderDriving.find('div.deletehere').each(function() {
        addSubFormItemDeleteLink(holderDriving, $(this), true, true);
    });
    $(".add_driving_link").on('click', function(e) {
        e.preventDefault();
        $.addSubForm(holderDriving, true);
    });

    /* Lang */
    holderLanguages = $('div.languages');
    holderLanguages.find('div.row').each(function() {
        addSubFormItemDeleteLink(holderLanguages, $(this), false, false);
    });
    $(".add_lang_link").on('click', function(e) {
        e.preventDefault();
        $.addSubForm(holderLanguages, true);
    });

    /* Emp */
    holderEmployments = $('div.employments');
    holderEmployments.find('div.deletehere').each(function() {
        addSubFormItemDeleteLink(holderEmployments, $(this), false, false);
    });
    $(".add_zam_link").on('click', function(e) {
        e.preventDefault();
        $.addSubForm(holderEmployments);
    });

    /* Schools */
    holderSchools = $('div.schools');
    holderSchools.find('div.deletehere').each(function() {
        addSubFormItemDeleteLink(holderSchools, $(this), false, false);
    });
    $(".add_Schools_link").on('click', function(e) {
        e.preventDefault();
        $.addSubForm(holderSchools);
    });


});

知道问题在哪里? 非常感谢你

1 个答案:

答案 0 :(得分:1)

感谢Dynamically added form field not showing up in POSTed data

通过将前2行切换为{form}并将第二行

分开来解决

我喜欢

<div .....>
{form....}

some html

</div>
<div>

htmlhhtml

</div>
</div>
{endform}

这就是为什么浏览器无法读取新添加的项目