通过 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 更改查询每个添加行