Buduję aplikację silex (źródło: here)
W klasie App\Form\DataTransformer
mam klasę MetadataTransformer.
Ale metoda transform
nie działa (robi się transformacja odwrotna).
Stosuje się do App\Form\Metadata AbstractType
, który jest częścią kolekcji w postaci App\Form\ArticleForm AbstractType
.
Ostatnią formą nazywa się metodą edycji mojego App\Controller\Admin\ArticleAdminController
Mój transformator nie działa (od danych modelu do danych formularza)
transformatora danych ma mapować dane jak ten
{"key":"value"}
w „danych Form”, takich jak:
[{"name":"key","value":"key"}]
Dzięki temu może być wyświetlany jako kolekcja.
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";
}
}
Mój transformator dane powinny wyglądać następująco:
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;
}
}
}
Działa funkcja reverseTransform, ale wydaje się, że sam transfom nie występuje.
Naszym celem jest, aby być w stanie wyświetlić dynamiczną kolekcję w postaci (dodawać i usuwać metadatas dynamicznie na mojej stronie artykuł Kształt)
W repo dodam, aby zmienić kod, aby to działało (czyli przekształcania datas w kontrolerze ArtykułAdminController, zamiast robić to w transformatorze)
Jeśli loguję wynik transformacji w czasie wykonywania, wynik jest tym, czego się spodziewam, ale formularz go nie użyje.
Próbowałem już api addViewTransformer/addModelTransformer 2.1, ale nie robiło to żadnej różnicy.
A jak źle z danymi modelu -> do -> przekształcić dane?
ja nie znam odpowiedzi, ale niestety mają podobny problem. :( – fazy