2014-07-15 8 views
10

मैं रूप है जो डेटा ट्रांसफार्मर की आवश्यकता है बनाया है, लेकिन अपने आप को एक समस्या में मिल गया: मैं स्ट्रिंग विस्फोट से डेटा को बदलने (स्ट्रिंग 3 भागों में विस्फोट किया जाना चाहिए), सब कुछ काम करता है, अगर मैं आपूर्ति सही प्रारूप स्ट्रिंग, लेकिन अन्यथा यह डेटा ट्रांसफार्मर के अंदर त्रुटि फेंकता है, क्योंकि अगर गलत स्ट्रिंग प्रारूप की आपूर्ति की जाती है तो रूपांतरण तब नहीं हो सकता है (यह व्यवहार की उम्मीद है)।Symfony2 प्रपत्र क्षेत्र की कमी सत्यापन से पहले डाटा ट्रांसफार्मर

तो सवाल यह है वहाँ डेटा परिवर्तन से पहले सही स्ट्रिंग के लिए प्रपत्र क्षेत्र को मान्य करने के लिए एक रास्ता है? मुझे पता है कि डिफ़ॉल्ट रूप से डेटा रूपांतरण सत्यापन से पहले होता है, लेकिन शायद इसे अन्य तरीकों से करने का कोई तरीका है?

मैं एक समाधान है कि इस धागे पर काम कर सकते हैं पाया: Combine constraints and data transformers, लेकिन इसके बिना, किसी न किसी समाधान की तरह लग रहा है के अलावा मैं सत्यापन संदेश का अनुवाद करने की जरूरत है, और मैं वास्तव में सिम्फोनी रूपों के लिए डिफ़ॉल्ट अनुवाद तरीकों का उपयोग कर यह करना चाहते हैं (अनुवाद सेवा का उपयोग कर)

मैंने सोचा, और सिम्फनी आईआरसी (इल्टर) के किसी भी व्यक्ति ने घटनाओं का उपयोग करके ऐसा करने का सुझाव दिया है, लेकिन मुझे यकीन नहीं है कि इस बारे में कैसे जाना है - डेटा ट्रांसफॉर्मर को गतिशील रूप से फ़ील्ड बनाने के लिए कैसे संलग्न करें? या शायद दूसरा रास्ता है?

+0

आप अभी भी हल नहीं किया, तो आपके समस्या यह सवाल देखने का प्रयास करें: http://stackoverflow.com/questions/25201919/apply-validation-before-data-transform –

+0

मैं इस समस्या का समाधान किया कुछ समय पहले, एक आप का सुझाव दिया की तरह एक समाधान के साथ है, लेकिन मैं इस सवाल को खुला छोड़ दिया, क्योंकि मेरी राय में इस तरह के समाधान भारी है, और, decoupled कोड की सिम्फोनी priciples के खिलाफ जाता है के रूप में मैं उपयोग करने की आवश्यकता प्रमाणीकरण संदेशों का अनुवाद करने के लिए मैन्युअल रूप से अनुवाद सेवा। –

उत्तर

0

शायद आप अपने ट्रांसफार्मर के लिए अपने रूप का उदाहरण दे सकते हैं। स्ट्रिंग सही ढंग से पार्स नहीं है, तो बस, फार्म के लिए एक प्रमाणीकरण त्रुटि जोड़ सकते हैं ताकि तरह:

<?php 
// src/Acme/MyBundle/Form/DataTransformer/StringTransformer.php 
namespace Acme\MyBundle\Form\DataTransformer; 

use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 
use Doctrine\Common\Persistence\ObjectManager; 
use Acme\MyBundle\Entity\MyEntity; 
use Acme\MyBundle\Entity\AnotherEntity; 
use Acme\MyBundle\Type\MyEntityType; 

class StringTransformer implements DataTransformerInterface 
{ 
    /** 
    * @var MyEntityType 
    */ 
    private $form; 

    /** 
    * @param ObjectManager $om 
    */ 
    public function __construct(MyEntityType $form) 
    { 
    $this->form = $form; 
    } 

    /** 
    * Transforms an object (entity) to a string (number). 
    * 
    * @param MyEntity|null $entity 
    * @return string 
    */ 
    public function transform($value) 
    { 
    // ... 
    } 

    /** 
    * Transforms a string (number) to an object (entity). 
    * 
    * @param string $number 
    * 
    * @return MyEntity|null 
    * 
    * @throws TransformationFailedException if object (entity) is not found. 
    */ 
    public function reverseTransform($value) 
    { 
    $collection = new ArrayCollection(); 

    try{ 
     $vals = explode(',', $value); 

     foreach($vals as $v){ 
     $entity = new AnotherEntity(); 
     $entity->setValue($v); 
     $collection->add($v); 
     } 

    } catch(\Exception $e){ 
     $this->form 
     ->get('my_location') 
     ->addError(new FormError('error message')); 
    } 

    return $collection; 
    } 
} 
6

यह शायद बहुत देर हो चुकी है, लेकिन मैं अंत में यह करने के लिए लेते हैं। शायद यह आपकी मदद करेगा।

class PersonType extends AbstractType{ 

    public function buildForm(FormBuilderInterface $builder, array $options){ 
     $builder->add('mother', 'personSelector', array('personEntity' => $options['personEntity'])); 

    } 
} 

यहाँ मेरी customField जहां सत्यापन हो रहा है:

यहाँ मेरी FormType है

class PersonSelectorType extends AbstractType{ 

    public function buildForm(FormBuilderInterface $builder, array $options){ 
     $transformer = new PersonByFirstnameAndLastnameTransformer($this->entityManager,$options); 
     $builder->addModelTransformer($transformer); 
     $builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'onPreSubmitForm')); 
    } 

    public function onPreSubmitForm(FormEvent $event){ 
     $mother  = $event->getData(); 
     $form  = $event->getForm(); 
     $options = $form->getConfig()->getOptions(); 
     if (!empty($mother)){ 
      preg_match('#(.*) (.*)#', $mother, $personInformations); 
      if (count($personInformations) != 3){ 
       $form->addError(new FormError('[Format incorrect] Le format attendu est "Prénom Nom".')); 
      }else{ 
       $person = $this->entityManager->getRepository($options['personEntity'])->findOneBy(array('firstname' => $personInformations[1],'lastname' =>$personInformations[2])); 
       if ($person === null) { 
        $form->addError(new FormError('Il n\'existe pas de person '.$personInformations[1].' '.$personInformations[2].'.')); 
       } 
      } 
     } 
    } 
} 

यहाँ मेरी ट्रांसफार्मर है:

class PersonByFirstnameAndLastnameTransformer implements DataTransformerInterface{ 

    public function reverseTransform($firstnameAndLastname) { 
     if (empty($firstnameAndLastname)) { return null; } 
     preg_match('#(.*) (.*)#', $firstnameAndLastname, $personInformations); 
     $person = $this->entityManager->getRepository($this->options['personEntity'])->findOneBy(array('firstname' =>$personInformations[1],'lastname' =>$personInformations[2])); 
     if (count($personInformations) == 3){ 
      $person = $this->entityManager->getRepository($this->options['personEntity'])->findOneBy(array('firstname' =>$personInformations[1],'lastname' =>$personInformations[2])); 
     } 
     return $person; 
    } 

    public function transform($person) { 
     if ($person === null) { return ''; } 
     return $person->getFirstname().' '.$person->getLastname(); 
    } 
} 
+0

अगर आप 'PersonSelectorType' में, एक विशिष्ट रूप तत्व के खिलाफ मान्य करने के लिए कर रहे हैं,' $ घटना> setData ($ तत्व) 'कॉल करने की आवश्यकता नहीं है? – thoroc

संबंधित मुद्दे