Symfony2: Comment utiliser des contraintes sur un type de formulaire composé personnalisé?
Voici une question que j'ai été me casser la tête dessus depuis un moment maintenant.
S'il vous plaît sais que je ne suis pas un expert Symfony2 (encore), j'ai fait une erreur de débutant quelque part.
Champ1: Standard de Symfony2 text
type de champ
Champ2: type de champ Personnalisé compound
champ avec text
champ + checkbox
champ)
Mon Objectif: Arriver contraintes ajoutées à la autoValue
champ de travailler sur la autoValue's text input child
La raison pour laquelle les contraintes ne fonctionnent pas c'est probablement parce que NotBlank
s'attend à une chaîne de valeur et les données internes de ce champ de formulaire est un tableau array('input'=>'value', 'checkbox' => true)
. Ce tableau valeur est converti en une chaîne de caractères avec une coutume DataTransformer
. Je soupçonne cependant que ce qui se passe APRÈS la validation du champ contre les contraintes que l'on connaît.
Comme vous le voyez ci-dessous dans le code commenté, j'ai été en mesure d'obtenir des contraintes de travail sur la saisie de texte, mais seulement lorsque codé en dur dans le autoValue de type de formulaire, et je veux valider contre le principal champ de contraintes.
Mon (simplifié) exemple de code pour le contrôleur et du terrain:
.
Contrôleur de code
La configuration d'un formulaire rapide à des fins de test.
<?php
//...
//$entityInstance holds an entity that has it's own constraints
//that have been added via annotations
$formBuilder = $this->createFormBuilder( $entityInstance, array(
'attr' => array(
//added to disable html5 validation
'novalidate' => 'novalidate'
)
));
$formBuilder->add('regular_text', 'text', array(
'constraints' => array(
new \Symfony\Component\Validator\Constraints\NotBlank()
)
));
$formBuilder->add('auto_text', 'textWithAutoValue', array(
'constraints' => array(
new \Symfony\Component\Validator\Constraints\NotBlank()
)
));
.
TextWithAutoValue fichiers source
src/My/Component/Form/Type/TextWithAutoValueType.php
<?php
namespace My\Component\Form\Type;
use My\Component\Form\DataTransformer\TextWithAutoValueTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class TextWithAutoValueType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('value', 'text', array(
//when I uncomment this, the NotBlank constraint works. I just
//want to validate against whatever constraints are added to the
//main form field 'auto_text' instead of hardcoding them here
//'constraints' => array(
// new \Symfony\Component\Validator\Constraints\NotBlank()
//)
));
$builder->add('checkbox', 'checkbox', array(
));
$builder->addModelTransformer(
new TextWithAutoValueTransformer()
);
}
public function getName()
{
return 'textWithAutoValue';
}
}
src/My/Component/Form/DataTransformer/TextWithAutoValueType.php
<?php
namespace My\Component\Form\DataTransformer;
use Symfony\Component\Form\DataTransformerInterface;
class TextWithAutoValueTransformer
implements DataTransformerInterface
{
/**
* @inheritdoc
*/
public function transform($value)
{
return array(
'value' => (string) $value,
'checkbox' => true
);
}
/**
* @inheritdoc
*/
public function reverseTransform($value)
{
return $value['value'];
}
}
src/Mon/ComponentBundle/Resources/config/services.yml
parameters:
services:
my_component.form.type.textWithAutoValue:
class: My\Component\Form\Type\TextWithAutoValueType
tags:
- { name: form.type, alias: textWithAutoValue }
src/Mon/ComponentBundle/Resources/views/Form/champs.html.twig
{% block textWithAutoValue_widget %}
{% spaceless %}
{{ form_widget(form.value) }}
{{ form_widget(form.checkbox) }}
<label for="{{ form.checkbox.vars.id}}">use default value</label>
{% endspaceless %}
{% endblock %}
.
Question
J'ai lu dans les docs et google depuis quelques heures maintenant et ne peut pas comprendre comment les copier, de les lier, de référence ou de l'origine des contraintes qui ont été ajoutés lors de la construction de ce formulaire.
-> Est-ce que quelqu'un sait comment faire cela?
-> Pour les points de bonus; comment faire pour activer les contraintes qui ont été ajoutés au formulaire principal est lié entité? (via des annotations sur la classe d'entité)
PS
Désolé c'est devenu une longue question, j'espère que j'ai réussi à faire mon problème clairement. Si non, merci de me demander pour plus de détails!
source d'informationauteur Maurice
Vous devez vous connecter pour publier un commentaire.
Je vous suggère de lire à nouveau le documentation sur la validation premier.
Ce que nous pouvons faire, c'est que la validation se produit principalement sur les classes plutôt que de former des types. C'est ce que vous avez oubliées. Ce que vous devez faire est de:
de validation.yml:
Edit:
Je suppose que vous savez déjà comment utiliser un formulaire type en un autre. Lors de la définition de votre validation de la configuration, vous pouvez utiliser un outil très utile à quelque chose, appelé les groupes de validation. Voici un exemple de base (dans un de validation.yml fichier, puisque je ne suis pas très compétent avec la validation des annotations):
Il y a un groupes paramètre qui peut être ajouté à chaque contrainte. C'est un tableau contenant la validation des noms de groupe. Lors d'une demande de validation sur un objet, vous pouvez spécifier avec l'ensemble des groupes que vous souhaitez valider. Le système va alors chercher dans la validation de fichier quelles sont les contraintes qui doivent être appliquées.
Par défaut, le "Défaut" du groupe est définie sur toutes les contraintes. C'est aussi le groupe qui est utilisé lors de l'exécution régulière de validation.
Cela, bien sûr, est le comportement standard pour tout type de formulaire options. Un exemple:
Que pour l'utilisation des différentes entités, vous pouvez accumuler vos classes de données en suivant la même architecture que votre empilement de formes. Dans l'exemple ci-dessus, un type de formulaire à l'aide de textWithAutoValueType devra avoir un data_class " auto_text la propriété et le getter/setter.
Dans la validation de fichier, le Valide les contraintes seront en mesure de cascade de validation. Une propriété avec Valide permettra de détecter la classe de la propriété et essayer de trouver un correspondant de validation de configuration pour cette classe, et de l'appliquer avec les mêmes groupes de validation:
Comme décrit ici https://speakerdeck.com/bschussek/3-steps-to-symfony2-form-mastery#39 (diapositive 39) par Bernhard Schussek (le principal contributeur de symofny extension de formulaire), un transformateur ne doit jamais modifier les informations, mais seulement changer sa représentation.
L'ajout de l'information (case à cocher' => true), vous faites quelque chose de mal.
Dans
Edit: