2016-04-15 11 views
0

Ich arbeite mit einem CollectionType Feld.CollectionType Element Validierung Fehlermeldung Speicherort

$builder->add('urls', CollectionType::class, [ 
    'allow_add'=>true, 
    'entry_type'=>UrlType::class, 
    'constraints'=>new All([ 
     'constraints'=>[ 
      new Url() 
     ] 
    ]) 
]); 

Es funktioniert wie ich erwartet habe. Außer der Nachricht, wenn das Feld einen ungültigen Inhalt hat.

Validator funktioniert, aber Fehlermeldung ist ein bisschen verwirrend: Field.0 - This value is not a valid URL address. Was ich brauche, ist einfach ein Elternfeld ungültig zu machen - Bind Fehler auf urls Feld.

Natürlich könnte ich einen Formular-Listener erstellen und dort Validierung durchführen. Aber - IMO - es ist ein Workaround.

Wie erreicht man das auf "reine" Weise? Ich habe versucht, in vielerlei Hinsicht zu spielen, aber es ist immer noch nicht etwas befriedigend.

+0

Haben Sie 'error_mapping' Option versucht? –

+0

@KamilAdryjanek - Dutzend Male. Meinst du irgendeinen bestimmten Ausdruck? – eRIZ

Antwort

0

versuchen, so dass Sie für die Kraft Validierung auf jeder UrlType und haben es Blase der Fehler nach oben in die Mutterform, die Collection

$builder->add('urls', CollectionType::class, [ 
    'allow_add'=>true, 
    'entry_type'=>UrlType::class, 
    'constraints'=>new All([ 
     'constraints'=>[ 
      new Url() 
     ] 
    ]), 
    'cascade_validation' => true, 
    'entry_options' => array('error_bubbling' => true) 
]); 
+0

Leider - ich bekomme immer noch '' Field.0 - ... '' Nachricht. – eRIZ

0

Ich denke, dass Sie error_mapping festlegen müssen:

$builder->add('urls', CollectionType::class, [ 
    'allow_add'=>true, 
    'entry_type'=>UrlType::class, 
    'constraints'=>new All([ 
     'constraints'=>[ 
      new Url() 
     ] 
    ]), 
    'cascade_validation' => true, 
    'error_bubbling' => false, 
    'error_mapping' => [ 
     'your_parent_form_alias.field_name' => 'field_name', 
    ] 
]); 

und dann in UrlValidator wenn Sie Verletzung bauen hinzufügen atPath wie folgt aus:

 if (empty($form['field_name'])) { 
      $this->context->buildViolation($constraint->getMessageName()) 
       ->atPath('your_parent_form_alias.field_name') 
       ->addViolation(); 
     } 

Ich bin nicht sicher, dass error_mapping und error_bubbling nicht zuerst für Url() und später noch einmal für All() zugeordnet werden sollen.

Ich hoffe, es wird Ihnen helfen

+0

# 1 - Ich benutze Symfony 2.8/3.0, also habe ich Angst, dass das Aliasing nicht so funktioniert, wie du es geschrieben hast; # 2 - muss Ihr Konzept den Verkäufer UrlValidator ändern? – eRIZ

+0

# 1 Diese Lösung ist für symfony 2.5, weiß nicht funktioniert es für die neueste Version # 2 Nein, ich rief UrlValidator, wie ich dachte, es benutzerdefinierte Validator nicht die, die von symfony2 ist In der Dokumentation [error_mapping] (https: //symfony.com/doc/current/reference/forms/types/choice.html#error-mapping) es gibt auch error_mapping für symfony3. Ich denke, so sollte man es versuchen. – omenrpg

+0

Ich habe versucht, mit '' error_mapping'' zu experimentieren, aber ohne zufriedenstellende Ergebnisse, deshalb frage ich. – eRIZ

Verwandte Themen