Forms 如何使用数据原型symfony 2.8创建3级表单

Forms 如何使用数据原型symfony 2.8创建3级表单,forms,symfony,symfony-2.8,Forms,Symfony,Symfony 2.8,我有三项资格:(简历、领域能力和能力) CV可以有许多领域能力,领域能力可以有许多能力,每个实体都有一个formType Cv实体 class Cv { //... /** * @OneToMany(targetEntity="DomaineCompetenceCv", mappedBy="cv", cascade={"persist"}) * */ private $domainesCompetence; 域能力实体 class DomaineCompet

我有三项资格:(简历、领域能力和能力) CV可以有许多领域能力,领域能力可以有许多能力,每个实体都有一个formType

Cv实体

class Cv
{ 
 //...

  /**
   * @OneToMany(targetEntity="DomaineCompetenceCv", mappedBy="cv", cascade={"persist"})
   * 
   */
   private $domainesCompetence;
域能力实体

class DomaineCompetenceCv
{
 /**
  * @var int
  *
  * @ORM\Column(name="id", type="integer")
  * @ORM\Id
  * @ORM\GeneratedValue(strategy="AUTO")
  */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="nom", type="string", length=255)
 */
private $nom;

/**
 * @ORM\ManyToOne(targetEntity="Cv", inversedBy="domainesCompetence")
 * @ORM\JoinColumn(name="cv_id", referencedColumnName="id")
 */
private $cv;

/**
 * @ORM\OneToMany(targetEntity="CompetenceCv", mappedBy="domaineCompetence", cascade={"persist"})
 * 
 */
private $competences;
能力CV

class CompetenceCv
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="nom", type="string", length=255)
 */
private $nom;

/**
 * @ORM\Column(name="niveau", type="integer")
 */
private $niveau;

/**
 * @ORM\ManyToOne(targetEntity="DomaineCompetenceCv", inversedBy="competences")
 * @ORM\JoinColumn(name="domaine_id", referencedColumnName="id")
 */
private $domaineCompetence;
 <form role="form" action="" {{ form_enctype(form) }} method="POST">
                             {{ form_widget(form._token) }}  
    //...
     <h4 class="no-margin-top has-divider text-highlight">Compétences</h4>
             <div id="domaineCV" class="domaineCV" data-prototype="{{ form_widget(form.domainesCompetence.vars.prototype)|e('html_attr') }}">

                 {% for com in form.domainesCompetence %}

                   <div class="" data-prototype="{{ form_widget(com.vars.prototype)|e('html_attr') }}">

                   </div>
                   {% endfor %}
               </div>
   </form>     
CVForm

 public function buildForm(FormBuilderInterface $builder, array $options)
{ $builder
    //...
    ->add('domainesCompetence', CollectionType::class, array(

        'entry_type' => DomaineCompetenceCvForm::class,
        'allow_add'    => true,
        'by_reference' => false,


    ))      
        ;

}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('nom')
            ->add('competences', CollectionType::class, array(

        'entry_type' => CompetenceCvForm::class,
        'allow_add'    => true,
        'by_reference' => true,


    ))      
            ;
}
 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('nom')->add('niveau')    ;
}
域能力CVForm

 public function buildForm(FormBuilderInterface $builder, array $options)
{ $builder
    //...
    ->add('domainesCompetence', CollectionType::class, array(

        'entry_type' => DomaineCompetenceCvForm::class,
        'allow_add'    => true,
        'by_reference' => false,


    ))      
        ;

}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('nom')
            ->add('competences', CollectionType::class, array(

        'entry_type' => CompetenceCvForm::class,
        'allow_add'    => true,
        'by_reference' => true,


    ))      
            ;
}
 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('nom')->add('niveau')    ;
}
能力表单

 public function buildForm(FormBuilderInterface $builder, array $options)
{ $builder
    //...
    ->add('domainesCompetence', CollectionType::class, array(

        'entry_type' => DomaineCompetenceCvForm::class,
        'allow_add'    => true,
        'by_reference' => false,


    ))      
        ;

}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('nom')
            ->add('competences', CollectionType::class, array(

        'entry_type' => CompetenceCvForm::class,
        'allow_add'    => true,
        'by_reference' => true,


    ))      
            ;
}
 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('nom')->add('niveau')    ;
}
Cv的小枝

class CompetenceCv
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="nom", type="string", length=255)
 */
private $nom;

/**
 * @ORM\Column(name="niveau", type="integer")
 */
private $niveau;

/**
 * @ORM\ManyToOne(targetEntity="DomaineCompetenceCv", inversedBy="competences")
 * @ORM\JoinColumn(name="domaine_id", referencedColumnName="id")
 */
private $domaineCompetence;
 <form role="form" action="" {{ form_enctype(form) }} method="POST">
                             {{ form_widget(form._token) }}  
    //...
     <h4 class="no-margin-top has-divider text-highlight">Compétences</h4>
             <div id="domaineCV" class="domaineCV" data-prototype="{{ form_widget(form.domainesCompetence.vars.prototype)|e('html_attr') }}">

                 {% for com in form.domainesCompetence %}

                   <div class="" data-prototype="{{ form_widget(com.vars.prototype)|e('html_attr') }}">

                   </div>
                   {% endfor %}
               </div>
   </form>     

{{form_小部件(form._令牌)}
//...
互补性
{form.domainesCompetence%中com的%1}
{%endfor%}
我使用javaScript添加的不仅仅是域能力,但问题是能力的形式没有显示出来

有人能帮我吗?谢谢大家

JS用于域性能

<script type="text/javascript">
 $(document).ready(function() {

var $container = $('div#domaineCV');


var $addLink = $('<a href="#" id="add_category" class="btn btn-default">Ajouter une Domaine de compétence</a>');
$container.append($addLink);


$addLink.click(function(e) {
  addCategory($container);
  e.preventDefault(); // évite qu'un # apparaisse dans l'URL
  return false;
});


var index = $container.find(':input').length;


if (index == 0) {
  addCategory($container);
} else {

  $container.children('div').each(function() {
    addDeleteLink($(this));
  });
}


function addCategory($container) {

  var $prototype = $($container.attr('data-prototype').replace(/__name__label__/g, 'Catégorie n°' + (index+1))
      .replace(/__name__/g, index));


  addDeleteLink($prototype);


  $container.append($prototype);

  index++;
}


function addDeleteLink($prototype) {

  $deleteLink = $('<a href="#" class="btn btn-danger">Supprimer</a>');


  $prototype.append($deleteLink);


  $deleteLink.click(function(e) {
    $prototype.remove();
    e.preventDefault(); =
    return false;
  });
}

$(文档).ready(函数(){
var$container=$('div#domaineCV');
变量$addLink=$('');
$container.append($addLink);
$addLink.单击(函数(e){
addCategory($集装箱);
e、 preventDefault();//vite qu'un#Apparise dans l'URL
返回false;
});
var index=$container.find(':input').length;
如果(索引==0){
addCategory($集装箱);
}否则{
$container.children('div')。每个(函数(){
addDeleteLink($(this));
});
}
函数addCategory($container){
var$prototype=$($container.attr('data-prototype')。替换(/\uuuuu name\uuuuu label\uuuuu/g,'Catégorie n°'+(索引+1))
.替换(/_________/g,索引));
addDeleteLink($原型);
$container.append($prototype);
索引++;
}
函数addDeleteLink($prototype){
$deleteLink=$('');
$prototype.append($deleteLink);
$deleteLink.单击(函数(e){
$prototype.remove();
e、 预防默认值()=
返回false;
});
}
}));

我在本地环境中复制了您的问题,相同的堆栈(Symfony 2.8.20)

从您的屏幕截图中,我可以看到DomainesCompetence表单显示在Cv表单中,因为您创建了处理此集合的js。但是您确定实际的js在每个域能力表单中处理能力集合吗

也许你需要这样做。请给出反馈

**编辑:肮脏的解决方案(工作但需要重构!!!)**

第一点,当您呈现您的简历表单模板时,域能力(嵌入在您的简历表单中)表单原型会被填充,但嵌入的能力表单原型不会填充在您的域能力表单中。您可以按如下方式在控制器中填充第二级表单集合:

<?php

namespace AppBundle\Controller;

use AppBundle\Form\CvType;
use AppBundle\Form\DomaineCompetenceCvType;
use AppBundle\Form\CompetenceCvType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class CvController extends Controller
{
    /**
     * @Route("/new")
     */
     public function newAction()
     {
         $form = $this->createForm(CvType::class);
         $domaineCompetenceCvForm = $this
             ->createForm(
                 CompetenceCvType::class,
                 null,
                 array('auto_initialize' => false
             )
         );
         $form->get('domainesCompetence')
             ->add($domaineCompetenceCvForm)
         ;


         return $this->render(
             ':cv:new.html.twig',
             array(
                 'form' => $form->createView(),
             )
         );
    }
}
{% extends 'base.html.twig' %}

{% form_theme form _self %}

{% block _appbundle_cv_domainesCompetence_entry_widget %}
    {{ form_row(form.nom) }}
{% endblock %}

{% block title %}AppBundle:Cv:new{% endblock %}

{% block body %}
    <h1>Welcome to the Cv:new page</h1>

    <form role="form" action="" {{ form_enctype(form) }} method="POST">
        {{ form_widget(form._token) }}  

        <h4 class="no-margin-top has-divider text-highlight">Compétences</h4>
        Domaines
        <div style="border: 1px solid green" id="domaineCV" class="domaineCVs" data-prototype="{{ form_widget(form.domainesCompetence.vars.prototype)|e('html_attr') }}">

            <div style="border: 1px solid yellow" id="competencesProto" data-prototype="{{ form_widget(form.children.domainesCompetence)|e('html_attr') }}">
            </div>
        </div>


    </form> 
{% endblock %}
{% block javascripts %}
    {{ parent() }} {# load your jquery and bootstrap deps #}
    <script type="text/javascript">
        {# custom js handling your collections here #}
    </script>

{% endblock %}

谢谢您的回答,域名竞争表仅显示名称(nom),但此域名中的能力集合不显示这就是我要说的。检查您的js是否也处理能力收集。也许js处理某些CSS类使用DomainesCompetence表单,但不处理能力集合中使用的CSS类。我可以看到你的js来完全重现你的问题吗?我编辑这个问题来添加我的脚本js,我也认为问题出在脚本js中。但我两周前就遇到了同样的问题,我找不到解决办法:(有人能帮我吗?我正试图为我的期末研究课题开发一个应用程序,我真的被阻止了:)谢谢lot@DhiaEddineFarah我用一个有效的解决方案更新了我的帖子。这应该可以解决问题,但是非常糟糕。也许你应该尝试为这个问题做另一个应用程序设计。