【问题标题】:Sortable Sonata Type Model in Admin管理员中的可排序奏鸣曲类型模型
【发布时间】:2016-12-25 10:04:27
【问题描述】:

有人试过关于Sortable Sonata Type Model in Admin 的教程吗? 我一步一步地跟着它,没有遗漏任何东西(我很确定),但最终无法获得好的结果。

基本上我要做的是:我有 3 个实体,文章、标签和文章标签(教程中的用户、期望和 UserHasExpectation 的eq)

在 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”的未定义方法

我认为应该添加一个 use 语句,但我不知道是哪一个。此外,假设我有正确的使用声明,我不知道作者的目标是什么,如果它正在创建 UserHasExpectation 记录,他为什么不添加 userHasExpectations->setUser($this->User) ???

我还想在 "vardumping" $this->Subject before 之后添加:

$formMapper->get('userHasExpectations')->addModelTransformer(new ExpectationDataTransformer($this->getSubject(), $this->modelManager));

它似乎有一个适当的实体对象,所有字段都为 NULL 值...

【问题讨论】:

    标签: symfony many-to-many sonata-admin


    【解决方案1】:

    终于解决了!

    因此,本教程的代码包含许多...错误 尽管尝试在 DataTransformer 中创建“userHasExpectation”,但我们只是在反向 DataTransformer 中返回对象 userHasExpectation,然后我们以这种方式在管理类的 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 :我希望你能阅读这篇文章并有时间更新相关教程。

    谢谢, 结语

    【讨论】:

      【解决方案2】:

      对于 Sonata 3,添加类属性 'class'=> 'UserBundle\Entity\Expectation' 为我解决了这个问题。

      【讨论】:

        猜你喜欢
        • 2018-08-03
        • 1970-01-01
        • 2016-10-09
        • 2018-04-30
        • 2018-03-22
        • 2017-08-09
        • 2012-01-07
        • 2014-12-04
        • 1970-01-01
        相关资源
        最近更新 更多