是否有人尝过有关Sortable Sonata Type Model in Admin的教程。 我一步一步地跟着它而没有遗漏任何东西(我很确定)但最后却无法取得好成绩。
基本上我要做的是:我有3个实体,Article,Tag和ArticleTag(eq to User,Expectation和UserHasExpectation in the tutorial)
在UserHasExpectationAdmin:
之前,一切似乎都很好protected function configureFormFields(FormMapper $formMapper){
// ...
$formMapper
->add('userHasExpectations', 'sonata_type_model', array(
'label' => 'User\'s expectations',
'query' => $this->modelManager->createQuery('UserBundle\Entity\Expectation'),
'required' => false,
'multiple' => true,
'by_reference' => false,
'sortable' => true,
))
;
$formMapper->get('userHasExpectations')->addModelTransformer(new ExpectationDataTransformer($this->getSubject(), $this->modelManager));}
我认为属性'class'=>应将“UserBundle \ Entity \ Expectation”添加到“userHasExpectations”字段中,否则Symfony会说它是无效值。
然后另一个问题出现在dataTransformer中: 它向我发出错误:
尝试调用类名为“Main \ CoreBundle \ Form \ DataTransformer \ TagDataTransformer”的名为“create”的未定义方法
我认为应该添加一个使用声明,但我不知道哪一个。更重要的是,假设我有正确的使用声明,我没有意识到作者的目的是什么,如果它正在创建UserHasExpectation记录,为什么他不添加userHasExpectations-> setUser($ this-> User)?? ?
此外,我想在“vardumping”之后添加$ this->主题之前:
$ formMapper-> get('userHasExpectations') - > addModelTransformer(new ExpectationDataTransformer($ this-> getSubject(),$ this-> modelManager));
似乎有一个正确的实体对象,所有字段都是NULL值...
有人可以帮我这个。
此致 Epixilog
答案 0 :(得分:2)
最终解决了它!
因此,本教程的代码包含许多......错误 尽管尝试创建了“userHasExpectation'在DataTransformer中我们只是在反向DataTransformer中返回对象userHasExpectation,然后我们在AdminPersist的postPersist和postUpdate中创建我们的记录:
/**
* {@inheritdoc}
*/
public function postUpdate($object)
{
$position = 0;
$uniqId = $this->getUniqId();
$request = $this->getRequest()->get($uniqId);
$qb = $this->modelManager->createQuery('MainCoreBundle:ArticleTag', 'at');
$TagsToRemove = $qb->where('at.article = :article')
->setParameter('article', $object)
->getQuery()
->getResult();
foreach ($TagsToRemove as $Tag) {
$this->modelManager->delete($Tag);
}
foreach($request["article_tags"] as $tag)
{
$Tag = $this->modelManager->find('MainCoreBundle:Tag', $tag);
$article_tags = new ArticleTag;
$article_tags->setTag($Tag);
$article_tags->setArticle($object);
$article_tags->setPosition($position++);
$this->modelManager->create($article_tags);
}
}
/**
* {@inheritdoc}
*/
public function postPersist($object)
{
$position = 0;
$uniqId = $this->getUniqId();
$request = $this->getRequest()->get($uniqId);
foreach($request["article_tags"] as $tag)
{
$Tag = $this->modelManager->find('MainCoreBundle:Tag', $tag);
$article_tags = new ArticleTag;
$article_tags->setTag($Tag);
$article_tags->setArticle($object);
$article_tags->setPosition($position++);
$this->modelManager->create($article_tags);
}
}
希望这会有助于遇到同样麻烦的人。 @ Sonata-admin-team:我希望你能读到这篇文章并有时间更新相关教程。
谢谢, Epixilog
答案 1 :(得分:0)
对于Sonata 3,添加了class属性' class' => ' UserBundle \实体\展望'为我解决了这个问题。