我创建了一个自定义表单类型和一个随附的变换器。
我的数据库中的数据保存在1个文本字段中。 &#34; <EN>English text</EN><FR>Frenc text</FR>
&#34;
所以我创建了一个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;
}
提前感谢任何建议
答案 0 :(得分:3)
您的变压器被多次调用。所以,我认为你应该通过检查传递的$值是否为null来使用早期返回。
在transform()
方法逻辑的顶部添加
if (!$value) {
return null;
}
您还应该在reverseTransform()
方法中执行相同的操作,以避免考虑空值和空值。