如何在我的表单中输出一个字段,在Symfony 2中显示它

时间:2015-08-22 02:15:57

标签: php forms symfony doctrine

我使用一个集合字段来显示我正在创建的项目的所有文本的两倍(一个用于法语,另一个用于英语),但我选择不显示字段langague因为用户不能假设能够改变它。为此,我写道:

{% for description in form.descriptions %}
            {% if loop.index == 1 %}
                French
            {% elseif loop.index == 2 %}
                English
            {% endif %}
            <li>
                {% do description.language.setRendered %}   
                ...
            </li>
        {% endfor %}

问题是我第一次尝试写这样的控制器:

public function ajoutAction(Request $request)
  {
    //Crée un nouveau projet
    $nouveauProjet = new Projet();

    //Crée les descriptions
    $descriptionFr = new ProjetInt();
    $descriptionEn = new ProjetInt();

    //Indique le bon code de langue pour les descriptions
    $descriptionFr->setLangue('fr');
    $descriptionEn->setLangue('en');

    //Associe le projet et les descriptions
    $nouveauProjet->addDescription($descriptionFr);
    $nouveauProjet->addDescription($descriptionEn);
    $descriptionFr->setProjet($nouveauProjet);
    $descriptionEn->setProjet($nouveauProjet);

    //Formulaires pour la création d'un projet
    $formulaire=$this->createForm(new ProjetType(), $nouveauProjet);

    //On surveille le formulaire
    $formulaire->handleRequest($request);

    //Si le formulaire est valide
    if($formulaire->isValid())
    {
      ...
    }

    return $this->render('AdminBundle::ajoutProjet.html.twig',array(
                                      'formulaire'=>$formulaire->createView()
                                    ));
  }

问题在于,当我提交表单时,由于我在模板中所做的事情,它找不到语言,因此我的控制器看起来像这样:

public function ajoutAction(Request $request)
  {
    //Crée un nouveau projet
    $nouveauProjet = new Projet();

    //Crée les descriptions
    $descriptionFr = new ProjetInt();
    $descriptionEn = new ProjetInt();

    //Associe le projet et les descriptions
    $nouveauProjet->addDescription($descriptionFr);
    $nouveauProjet->addDescription($descriptionEn);
    $descriptionFr->setProjet($nouveauProjet);
    $descriptionEn->setProjet($nouveauProjet);

    //Formulaires pour la création d'un projet
    $formulaire=$this->createForm(new ProjetType(), $nouveauProjet);

    //On surveille le formulaire
    $formulaire->handleRequest($request);

    //Si le formulaire est valide
    if($formulaire->isValid())
    {
      //Indique le bon code de langue pour les descriptions
      $descriptionFr->setLangue('fr');
      $descriptionEn->setLangue('en');

      //Applique les modifications
      $em=$this->getDoctrine()->getManager();
      $em->persist($nouveauProjet);
      $em->flush();

      ...
    }
  }

这只是一个细节,但它真的让我烦恼。我真的想在if($formulaire->isValid())

之外设置我的语言

1 个答案:

答案 0 :(得分:0)

我找到了一种更好的方法来做到这一点。在表单中,我为语言字段提供了属性'read_only'=>true。这让我可以将控制器改为我想要的。我不需要使用行{% do description.language.setRendered %},我可以使用语言字段中的内容来显示描述语言(fr = french和en = english)。唯一需要的是使用一些CSS来隐藏字段语言,如果有人调整CSS来显示它并不重要,因为它们无论如何都无法编辑字段。瞧!

以下是代码:

形式:

<?php

namespace AdminBundle\Form\Type;

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

Class ProjetIntType extends AbstractType
{

    public function buildForm(FormBuilderInterface $constructeur, array $options)
    {
        $constructeur
        ->add('langue', 'text', array('read_only'=>true))
        ->add('nom', 'text')
        ->add('descriptionCours', 'text')
        ->add('descriptionComplete', 'text')
        ->add('roles', 'text')
        ->add('aptitudesDeveloppees', 'text');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'PublicBundle\Entity\ProjetInt',
            ));
    }

    public function getName()
    {

        return 'projetInt';

    }

}

控制器:

public function addAction(Request $request)
  {
    //New project
    $nouveauProjet = new Projet();

    //New descriptions
    $descriptionFr = new ProjetInt();
    $descriptionFr->setLangue('fr');
    $descriptionFr->setProjet($nouveauProjet);

    $descriptionEn = new ProjetInt();
    $descriptionEn->setLangue('en');
    $descriptionEn->setProjet($nouveauProjet);

    //Add the descriptions to the project
    $nouveauProjet->addDescription($descriptionFr);
    $nouveauProjet->addDescription($descriptionEn);

    ...
}

我的树枝:

{{ form_start(formulaire, {'attr': {'novalidate': 'novalidate'}}) }}
    {#  #}
    {{ form_row(formulaire.imageFile) }}
    {{ form_row(formulaire.technologie) }}
    {{ form_row(formulaire.annee) }}
    {{ form_row(formulaire.type) }}
    {{ form_row(formulaire.fichierFile) }}
    {{ form_row(formulaire.largeur) }}
    {{ form_row(formulaire.hauteur) }}
    {{ form_row(formulaire.categories) }}
    {#  #}
    <h3>Descriptions</h3>
    <ul class="descriptions">
        {% for description in formulaire.descriptions %}
            {% if description.langue.vars.value == 'fr' %}
                Français
            {% elseif description.langue.vars.value == 'en' %}
                Anglais
            {% endif %}
            <li>    
                {{ form_row(description.langue) }}
                {{ form_row(description.nom) }}
                {{ form_row(description.descriptionCours) }}
                {{ form_row(description.descriptionComplete) }}
                {{ form_row(description.roles) }}
                {{ form_row(description.aptitudesDeveloppees) }}
            </li>
        {% endfor %}
    </ul>

    <input type="submit" value="{{ textBtn }}"/>
{{ form_end(formulaire) }}