管理员中的可排序奏鸣曲类型模型

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' 解决了我的问题。