【问题标题】:How to have a field in my form whitout displaying it in Symfony 2如何在我的表单中有一个字段而不在 Symfony2 中显示它
【发布时间】:2015-08-22 02:15:56
【问题描述】:

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

{% 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-&gt;isValid())之外的语言

【问题讨论】:

  • 那你为什么不把字段类型隐藏呢? -&gt;add('languague', 'hidden', ...)
  • 为什么你不在开头设置它:$descriptionFr-&gt;setProjet($nouveauProjet)-&gt;setLanguage('fr');
  • 对于第一条评论,如果我隐藏它,用户可以更改我的 css 并开始使用该语言。对于第二个,我不能在开始时设置它,因为如果我这样做,他将无法找到语言,因为我的字段设置为在我的树枝中呈现,但似乎这样做会使我表单不保存语言字段,这就是我设置它的原因。我不想以前怎么设置它。

标签: php forms symfony doctrine


【解决方案1】:

我找到了一种更好的方法来做到这一点。在表单中,我为语言字段赋予属性'read_only'=&gt;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) }}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多