Estoy construyendo una aplicación de silex (la fuente es here)
En el App\Form\DataTransformer
tengo una clase MetadataTransformer.
Pero el método transform
no funciona (la transformación inversa sí lo hace).
Se aplica a App\Form\Metadata AbstractType
, que forma parte de una colección en App\Form\ArticleForm AbstractType
.
La última forma se llama en el método de edición de mi App\Controller\Admin\ArticleAdminController
Mi transformador no funciona (de datos de modelo a datos de formulario)
El transformador de datos se supone que asignar una información como esta
{"key":"value"}
en un "formulario de datos" como:
[{"name":"key","value":"key"}]
Por lo tanto, se puede mostrar como una colección.
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";
}
}
Mi transformador de datos debe ser similar:
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;
}
}
}
El reverseTransform funciona, pero el transfom sí mismo no parece.
El objetivo aquí es ser capaz de mostrar una colección dinámica en una forma (añadir y eliminar metadatos de forma dinámica en mi página de formulario artículo)
En el repositorio agrego para cambiar el código para que funcione (es decir, la transformación de la datas en el controlador ArticleAdminController, en lugar de hacerlo en el Transformer)
Si registro el resultado de la transformación en tiempo de ejecución, el resultado es el esperado, pero el formulario no lo usará.
Probé la aplicación addViewforformer/addModelTransformer 2.1 pero no hizo ninguna diferencia.
Entonces, ¿qué ocurre con los datos de mi modelo -> a -> forma la transformación de datos?
No sé la respuesta, pero lamentablemente tienen un problema similar. :( – fazy