我
我使用一个集合字段来显示我正在创建的项目的所有文本的两倍(一个用于法语,另一个用于英语),但我选择不显示字段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())
答案 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) }}