2012-12-27 79 views
1

我創建了一個自定義表單類型和一個與之配合的轉換器。 我的數據庫中的數據保存在1個文本字段中。 「<EN>English text</EN><FR>Frenc text</FR>Symfony2變壓器沒有收到價值

因此,我創建了一個formtype,爲每個輸入添加單獨的文本,並將變換器置於輸入內的標記之間。

問題是我回應了應該在轉換函數中傳遞的值,但它是空的,我找不到原因。

這裏是我的multilang型

class MultiLangType extends AbstractType 
{ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'type' => 'text', 
      'compound' => 'true' 
     )); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $langs = array('EN', 'FR', 'DE'); 
     $transformer = new StringToMultiTransformer($langs); 
     $builder->prependClientTransformer($transformer); 
     //$builder->addModelTransformer(new StringToMultiTransformer($langs)); 
     foreach($langs as $l) 
     { 
      $builder->add($l, 'text', $options); 
     } 

    } 

    public function getParent() 
    { 
     return 'field'; 
    } 

    public function getName() 
    { 
     return 'multilang'; 
    } 
} 

,現在我的變壓器

class StringToMultiTransformer implements DataTransformerInterface 
{ 
    private $langs; 

    public function __construct(array $langs) 
    { 
     $this->langs = $langs; 
    } 

    public function transform($value) 
    { 
     // var_dump($value); exit; 
     $result = array(); 

     foreach ($this->langs as $l) { 
      $ret = preg_match("/<$l>(.*?)<\/$l>/", $value); 
      $result[$l] = $ret[1]; 
     } 
     return $result; 
    } 

    public function reverseTransform($array) 
    { 
     if (!is_array($array)) { 
      throw new UnexpectedTypeException($array, 'array'); 
     } 

     $result = ""; 
     $emptyKeys = array(); 

     foreach ($this->langs as $l) { 
      $val = $array[$l]; 
      $result .= "<$l>$val</$l>"; 
     } 

     return $result; 
    } 

預先感謝任何建議

回答

3

你的變壓器被多次調用。所以,我認爲你應該通過檢查傳遞的$值是否爲空來使用提前返回。

添加在您的transform()方法邏輯的頂部,

if (!$value) { 
    return null; 
} 

你也應該做同樣的reverseTransform()方法內,以避免考慮到空和空值。

+0

謝謝!你只是挽救了我的夜間休息,現在它全部正常工作。我不知道它被多次調用,但仍然不是一個真正的想法。 – tmas