管理员

时间:2016-08-18 12:53:06

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

是否有人尝过有关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

2 个答案:

答案 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 \实体\展望'为我解决了这个问题。