通过 sonata_type_collection 字段将 sonata_media_type 用作 1:N 时出现 500 错误

Posted

技术标签:

【中文标题】通过 sonata_type_collection 字段将 sonata_media_type 用作 1:N 时出现 500 错误【英文标题】:500 error when using sonata_media_type as a 1:N via a sonata_type_collection field 【发布时间】:2013-10-29 08:10:21 【问题描述】:

我正在使用 SonataAdminBundle 来管理我正在处理的项目的后端。在这种情况下,我想将一个或多个图像添加到“项目”。这是实体的相关位

src/My/Bundle/Entity/Item.php

/**
 * Item
 *
 * @ORM\Table(name="item")
 * @ORM\Entity()
 */
class Item

  /**
   * @var Media
   *
   * @ORM\OneToMany(targetEntity="\Application\Sonata\MediaBundle\Entity\Media", mappedBy="item")
   * ORM\JoinTable(name="item_media",
   *     joinColumns=@ORM\JoinColumn(name="item_id", referencedColumnName="id")
   *   , inverseJoinColumns=@ORM\JoinColumn(name="media_id", referencedColumnName="id", unique=true)
   * )
   */
  protected $media;

现在是管理类的相关部分:

src/My/Bundle/Entity/Item.php

class ItemAdmin extends Admin

  protected function configureFormFields(FormMapper $formMapper)
  
    $formMapper
        ->add('media', 'sonata_type_collection'
        , array(
              'required' => false
            , 'type' => 'sonata_media_type'
            , 'by_reference' => false
            , 'type_options' => array(
                  'provider' => 'sonata.media.provider.image'
                , 'context'  => 'default'
                , 'auto_initialize' => false
              )
          )
        , array(
              'edit' => 'inline'
            , 'inline' => 'table'
            , 'allow_delete' => true
            , 'sortable' => 'position'
        ))
    ;
  

现在在 UI 本身中,当我单击 + Add New 按钮时,AJAX 响应为 500 错误,并显示以下消息:

不可能在 NULL 变量 ("") 上调用方法 ("trans") SonataDoctrineORMAdminBundle:CRUD:edit_orm_one_to_many.html.twig at 第 30 行

我不确定从这里去哪里。我对 SonataAdminBundle 没有太多经验,尤其是在这种类型的其他实体的内联编辑/创建方面。

版本信息:

php 5.4.19 Symfony 2.3.4 SonataAdminBundle 2.2.3 奏鸣曲媒体包 2.2.3

【问题讨论】:

看起来您需要“一对多,单向与连接表”关联,但做错了。查看官方文档:docs.doctrine-project.org/en/latest/reference/… 【参考方案1】:

此问题似乎与sonata-users google 组中的this question 有关。

问题似乎是媒体类型的标签没有传递给模板,这导致在此处调用翻译器/调用模板中的trans 方法时出错:

 nested_field.vars['sonata_admin'].admin.trans(nested_field.vars.label) 

在SonataDoctrineORMAdminBundle/Resources/views/CRUD/edit_orm_one_to_many.html.twig.

我建议您先尝试为您的表单类型添加标签。

'label' => 'Media' 

如果这不起作用,您可以分叉存储库并在之后克隆它:

git clone https://github.com/yourusername/SonataDoctrineORMAdminBundle.git

然后使用 2.2.3 标签创建一个新分支:

git branch bugfix-2.2.3 2.2.3
git checkout bugfix-2.2.3

现在将 edit_orm_one_to_many.html.twig 中的 line 30 更改为(或将其完全删除,这将导致标签根本不被呈现)

% if nested_field.vars.label %
     nested_field.vars['sonata_admin'].admin.trans(nested_field.vars.label) 
% endif %

然后提交您的更改并...

...要么覆盖标签(请注意标签通常不应该被覆盖)

git commit
git tag -f 2.2.3

... 或 (better) 在您的 composer.json 中创建一个别名

"require": 
    "sonata/doctrine-orm-admin-bundle" : "bugfix-2.2.3#<commit-sha> as 2.2.3"

然后将其添加到您的composer.json:

"repositories": [
     "type": "vcs", "url": "http://github.com/yourusername/doctrine-orm-admin-bundle"
],

之后运行

composer update sonata/doctrine-orm-admin-bundle

我不确定它是否有帮助,但在 this commit 中添加了对内联编辑的多对多支持。您可以尝试将关联更改为多对多并测试异常是否消失。

如果这也不起作用,请回来报告,我会更深入地研究这一点。

【讨论】:

谢谢。这个答案很彻底,看起来很有希望。不过,我要等到今晚晚些时候我在家时才有机会检查。 好的,我尝试在 builder/mapper 中添加标签(在 ItemAdmin::configureFormFields 中),但没有成功。但是,当我按照您的建议修改管理包时,它起作用了。但是,它并没有让我走得太远,因为我认为您在链接的拉取请求中观察到,该捆绑包不支持一对多的内联编辑。我将尝试更新捆绑包,然后将我的关系更改为多对多。 好的,如果更改为多对多作品,请回来报告,然后我将仔细研究一对多实现的差异,也许会提出一个 PR。跨度>

以上是关于通过 sonata_type_collection 字段将 sonata_media_type 用作 1:N 时出现 500 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何动态修改sonata_type_collection的子形式?

如何在 Sonata Admin 中正确配置“sonata_type_collection”字段

sonata_type_collection btn_add 不工作

Symfony 3 / sonata_type_collection 更改查询每个添加行

Sonata Admin Bundle - 表单类型:sonata_type_collection - 自定义模板?

sonata_type_collection 设置页面加载时的默认行数