管理员中的可排序奏鸣曲类型模型
Sortable Sonata Type Model in Admin
有人试过关于 Sortable Sonata Type Model in Admin 的教程吗?
我一步步跟着做的,没有遗漏任何东西(我很确定),但最后没能得到一个好的结果。
基本上我要做的是:我有 3 个实体,文章、标签和文章标签(相当于教程中的用户、期望和 UserHasExpectation)
一切似乎都很好,直到 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中:
它启动了我的错误:
Attempted to call an undefined method named "create" of class "Main\CoreBundle\Form\DataTransformer\TagDataTransformer"
我认为应该添加 use 语句,但我不知道是哪一个。此外,假设我有正确的 use 语句我不知道作者的目的是什么,如果它正在创建 UserHasExpectation 记录,他为什么不添加 userHasExpectations->setUser($this->User) ???
我还想在“vardumping”之后添加 $this->Subject before :
$formMapper->get('userHasExpectations')->addModelTransformer(new ExpectationDataTransformer($this->getSubject(), $this->modelManager));
它似乎有一个正确的实体对象,所有字段都为 NULL 值...
终于解决了!
所以,教程的代码包含很多...错误
尽管尝试在 DataTransformer 中创建 'userHasExpectation',我们只是 return 在反向 DataTransformer 中创建对象 userHasExpectation,然后我们以这种方式在 Admin Class 的 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
对于 Sonata 3 添加 class 属性 'class'=> 'UserBundle\Entity\Expectation' 解决了我的问题。
有人试过关于 Sortable Sonata Type Model in Admin 的教程吗? 我一步步跟着做的,没有遗漏任何东西(我很确定),但最后没能得到一个好的结果。
基本上我要做的是:我有 3 个实体,文章、标签和文章标签(相当于教程中的用户、期望和 UserHasExpectation)
一切似乎都很好,直到 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中:
它启动了我的错误:
Attempted to call an undefined method named "create" of class "Main\CoreBundle\Form\DataTransformer\TagDataTransformer"
我认为应该添加 use 语句,但我不知道是哪一个。此外,假设我有正确的 use 语句我不知道作者的目的是什么,如果它正在创建 UserHasExpectation 记录,他为什么不添加 userHasExpectations->setUser($this->User) ???
我还想在“vardumping”之后添加 $this->Subject before :
$formMapper->get('userHasExpectations')->addModelTransformer(new ExpectationDataTransformer($this->getSubject(), $this->modelManager));
它似乎有一个正确的实体对象,所有字段都为 NULL 值...
终于解决了!
所以,教程的代码包含很多...错误 尽管尝试在 DataTransformer 中创建 'userHasExpectation',我们只是 return 在反向 DataTransformer 中创建对象 userHasExpectation,然后我们以这种方式在 Admin Class 的 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
对于 Sonata 3 添加 class 属性 'class'=> 'UserBundle\Entity\Expectation' 解决了我的问题。