2012-09-19 6 views
5

मैं एक SILEX आवेदन (स्रोत here है)
App\Form\DataTransformer मैं एक MetadataTransformer वर्ग है में निर्माण कर रहा हूँ।
लेकिन transform विधि काम नहीं करती है (रिवर्स ट्रांसफॉर्म करता है)।
यह App\Form\Metadata AbstractType पर लागू होता है, जो App\Form\ArticleForm AbstractType में संग्रह का हिस्सा है।
पिछले प्रपत्र मेरी App\Controller\Admin\ArticleAdminControllerमेरे ट्रांसफार्मर (मॉडल डेटा से डेटा के रूप में) काम नहीं करता है

डेटा ट्रांसफार्मर की विधि संपादन में कहा जाता है एक "प्रपत्र डेटा" की तरह में इस

{"key":"value"} 

की तरह एक मानचित्र डेटा में माना जाता है:

[{"name":"key","value":"key"}] 

तो इसे संग्रह के रूप में प्रदर्शित किया जा सकता है।

Metadata.php

class MetaData extends AbstractType 
{ 
    protected $span4 = "span4"; 
    protected $span3 = "span3"; 

    public function buildForm(FormBuilderInterface $builder,array $options) 
    { 
     $builder 
      ->add('name', 'text', array(
       "label" => ' ', 
       "attr" => array(
        "class"  => $this->span3, 
        "placeholder" => "name" 
       ) 
      )) 
      ->add('value', 'text', array(
       'label' => ' ', 
       'attr' => array(
        "class"  => $this->span4, 
        'placeholder' => 'value' 
       ) 
      )) 
     ; 
    } 

    public function getName() 
    { 
     return "MetaData"; 
    } 
} 

ArticleForm.php

class ArticleForm extends AbstractType 
{ 
    // ...some code... 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new TagsToArrayTransformer(); 
     $metadataTransformer = new MetadataTransformer(); 

     $builder->add("title", "text", array(
      "required" => true, 
      "attr"  => array(
       "class"  => $this->defaultClass, 
       "placeholder" => "The title" 
      ) 
     )); 
     $builder->add("content", "textarea", array(
      "attr" => array(
       "placeholder" => "the content", 
       "rows"  => 20, 
       "class"  => $this->defaultClass 
      ) 
     )); 
     $builder->add(
      $builder->create('metadatas', 'collection', array(
       "type"   => new MetaData(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'by_reference' => false, 
      )) 
      ->addModelTransformer($metadataTransformer) 
     ); 

     // ...some code... 
    } 

    public function getName() 
    { 
     return "article"; 
    } 
} 

मेरे डेटा ट्रांसफार्मर दिखना चाहिए:

MetadataTransformer.php

namespace App\Form\DataTransformer; 

use Symfony\Component\Form\DataTransformerInterface; 

class MetadataTransformer implements DataTransformerInterface 
{ 
    function transform($metadatas) 
    { 
     foreach($metadatas as $key => $value) { 
      $result[] = array('name' => $key, 'value' => $value); 
     } 

     return $result; 
    } 

    function reverseTransform($metadatas) 
    { 
     if(is_array($metadatas)) { 
      foreach($metadatas as $value) { 
       $result[$value['name']] = $value['value']; 
      } 

      return $result; 
     } 
    } 
} 

reverseTransform काम करता है, लेकिन transfom ही प्रतीत नहीं होता है।
लक्ष्य यहाँ एक रूप में एक गतिशील संग्रह प्रदर्शित करने के लिए सक्षम होने के लिए है (जोड़ सकते हैं और metadatas मेरे लेख प्रपत्र पेज में गतिशील रूप से निकालने के लिए) (रेपो में

मैं इसे काम करने के लिए कोड को बदलने के लिए जोड़ने यानी बदलने ट्रांसफॉर्मर में इसे करने के बजाय नियंत्रक ArticleAdminController में डेटा)
यदि मैं रनटाइम पर ट्रांसफॉर्म का परिणाम लॉग करता हूं, तो परिणाम मैं अपेक्षा करता हूं, लेकिन फॉर्म इसका उपयोग नहीं करेगा।

मैं पहले से ही addViewTransformer/addModelTransformer 2.1 एपीआई की कोशिश की, लेकिन यह कोई फर्क नहीं किया।

तो क्या अपने मॉडल डेटा के साथ गलत क्या है -> करने के लिए -> प्रपत्र डेटा को बदलने?

+0

मैं उत्तर नहीं पता, लेकिन मैं दुर्भाग्य से एक समान समस्या है। :( – fazy

उत्तर

3

आपका फॉर्म प्रकार संग्रह है और आपका ट्रांसफॉर्मर एक सरणी देता है। आपको इसे पुन: लिखना होगा। प्रयास करें:

namespace App\Form\DataTransformer{ 
use Symfony\Component\Form\DataTransformerInterface; 
class MetadataTransformer implements DataTransformerInterface{ 

function transform($metadatas){ 
    foreach($metadatas as $key=>$value): 
    $result[]=array('name'=>$key,'value'=>$value); 
    endforeach; 
    $results=new \Doctrine\Common\Collections\ArrayCollection($result); 
    return $results; 
} 

function reverseTransform($metadatas){ 
    if(is_array($metadatas)){ 
    foreach($metadatas as $value){ 
     $result[$value['name']]=$value['value']; 
    } 
    return $result; 
    } 
    } 
} 
-1

था तो आप इस की कोशिश की:

function transform($metadatas) { 
    $results = array(); 
    foreach ($metadatas as $key => $value) { 
     $results['name'] = $key; 
     $results['value'] = $value; 
    } 
    return $results; 
} 
संबंधित मुद्दे