2016-07-20 23 views
4

ich einen Auftrag und eine Produktentität habenSymfony2 einbetten Form: Fehler nicht angezeigt

class Order { 

    /** 
    * @ORM\OneToMany(targetEntity="Product", mappedBy="order", cascade={"persist", "remove"})) 
    * @Assert\Valid() 
    * @Assert\Count(
    *  min = "1" 
    *) 
    */ 
    protected $products; 
} 

und

class Product 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Order", inversedBy="products") 
    * @ORM\JoinColumn(name="id_order", referencedColumnName="id", onDelete="CASCADE", nullable=false) 
    */ 
    protected $order; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category") 
    * @ORM\JoinColumn(name="id_category", referencedColumnName="id", nullable=false) 
    */ 
    protected $category; 

    /** 
    * @ORM\ManyToOne(targetEntity="Size") 
    * @ORM\JoinColumn(name="id_size", referencedColumnName="id", nullable=true) 
    */ 
    protected $size; 


    /** 
    * @Assert\IsTrue(message = "Please enter a size") 
    */ 
    public function isSizeValid() 
    { 
     if($this->category->getCode() == 1 && is_null($this->size)) { 
      return false; 
     } 
     return true; 
    } 

} 

in meiner Auftragsart Form, ich habe eine Sammlung von Produkttypen hinzugefügt haben, mit error_bubbling auf falsch. Aber wenn mein isSizeValid falsch ist, habe ich keine Fehlermeldung in meinem Formular.

Aber wenn ich error_bubbling auf true festgelegt habe, wird der Fehler über meinem Formular angezeigt.

Wie kann ich den Fehler neben jedem Produkt in meiner Zweigvorlage anzeigen?

+0

Verwenden Sie 'form_widget' im Zweig für das Feld, das Fehler anzeigen soll? – Jeet

Antwort

1

Sie müssen die Option 'error_mapping' in Ihrem Formular festlegen.

http://symfony.com/doc/current/reference/forms/types/form.html#error-mapping

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'error_mapping' => array(
      'isSizeValid' => 'product', 
     ), 
    )); 
} 
+0

Ich habe dies meinem OrderType-Formular hinzugefügt, es hat nicht funktioniert. Ich habe es auch in meine Produkttyp-Form gebracht (mit 'isSizeValid' => 'Größe'), aber immer noch kein Glück ... – symdev

+0

Ich habe versucht, '.' statt 'isSizeValid' und dann funktioniert es ... Irgendeine Idee warum? – symdev

1

Verwenden Sie ein Assert \ Callback-Funktion, so dass Sie Ihren Domain-Logik setzen, wo es hingehört ... in Ihrem Entity. Und dann verwenden Sie error_bubbling = false, so dass der Fehler über "Größe" angezeigt wird.

use Symfony\Component\Validator\Context\ExecutionContextInterface; 
//... 

class product 
{ 
    //... 

    /** 
    * @param ExecutionContextInterface $context 
    * 
    * @Assert\Callback 
    */ 
    public function validate(ExecutionContextInterface $context) 
    { 
     //someLogic to define $thereIsAnError as true or false 
     if($this->category->getCode() == 1 && is_null($this->size)) { 
      $context->buildViolation('Please enter a size.') 
       ->atPath('size') 
       ->addViolation(); 
     } 
    } 
} 

Lesen Sie mehr über http://symfony.com/doc/current/reference/constraints/Callback.html

Wenn Sie noch Fragen haben, dann auch bei Assert \ Rückruf verwenden Sie bitte Ihre Twig-Vorlage erstellen.