Symfony / Sonata Admin:编辑表单上的列表表单
Posted
技术标签:
【中文标题】Symfony / Sonata Admin:编辑表单上的列表表单【英文标题】:Symfony / Sonata Admin: List form on Edit form 【发布时间】:2015-09-05 22:09:26 【问题描述】:我设置了一个(类别)对多(产品)的关系,我希望在编辑类别页面的底部显示一个产品列表。
这似乎是一件很常见的事情,但我还没有找到任何方法(或任何例子)。我已经设法使用 sonata_type_collection 显示产品,但这给了我一个完整的产品编辑表单,而我真的只想要一个与该类别相关的产品列表。
这里有两个问题,真的:
这可能吗?
是否不鼓励(这可以解释缺乏示例)?如果有,为什么?
【问题讨论】:
“有产品清单”到底是什么意思?这些一般信息是否与您提交的表单或您正在编辑的类别的输入无关? 该信息与表单的提交无关,但我想在类别详细信息页面的底部提供相关产品的直接链接。例如。如果类别是 iPhone,那么我想在页面底部有一个 iPhone 产品列表。 【参考方案1】:完成您正在寻找的最快的方法是覆盖编辑模板。在您的管理员服务声明中,您可以这样做:
services:
sonata.admin.mail:
class: %sonata.admin.category.class%
tags:
- name: sonata.admin, manager_type: orm, group: "Categories", label: "Category"
arguments:
- ~
- %skooli.category.class%
- ~
calls:
- [ setTemplate, ["edit", "AcmeAdminBundle:CategoryAdmin:edit.html.twig"] ]
然后,在AcmeBundle/Resources/views/CategoryAdmin/edit.html.twig
下你可以有这样的东西:
% extends 'SonataAdminBundle:CRUD:base_edit.html.twig' %
# Override any block from the parent view if necessary #
% block products %
<ul>
% for product in object.products%
<li> product.name </li>
% endfor %
</ul>
% endblock products %
【讨论】:
谢谢。这看起来非常接近我想要做的事情。我遇到的唯一问题是我目前在我的 CategoryAdmin.php configureFormFields 函数中有->add('product','sonata_type_collection', array( 'type_options' => array( 'delete' => false, 'read_only' => true, 'btn_add' => false, ) ))
,尽管尝试了一些不同的变体,但我找不到任何会导致它拉入那个新的自定义模板的东西。
模板与您的类别管理员相关,而不是您的产品管理员
模板位于 Resources/views/CategoryAdmin/edit.html.twig,在我的 services.yml 我有 sonata.admin.category:.... 但是在 configureFormFields 中的 CategoryAdmin.php 我对 add() 进行链式调用,以确定编辑表单中显示的内容。如果我没有在其中放置与“产品”相关的任何内容,则表单将呈现没有我希望的列表,并且我为包含产品的 add() 所做的所有尝试都没有成功。这是我第一次尝试自定义模板,所以我可能在这里遗漏了一些基本的东西。
您是否正在尝试创建一个类别或编辑您确定与某些产品相关的现有类别?
我正在尝试编辑现有类别,该类别具有与之关联的产品。我希望所有这些产品都显示在页面底部的列表中。看看我拼凑的这个例子:i.imgur.com/wZv2qpu.jpg【参考方案2】:
在您最初的问题中,您谈论的是类别的 edit 模板。在您的评论中,您希望列表出现在 show 操作中。 后者很容易。一旦您将关系添加到 showFields 操作,它们就会显示出来:
use Sonata\AdminBundle\Show\ShowMapper;
class CategoryAdmin extends Admin
protected function configureShowFields(ShowMapper $showMapper)
$showMapper
->add('products')
;
如果您不喜欢该外观,可以创建自定义模板。这适用于 show 和 edit: https://sonata-project.org/bundles/admin/master/doc/reference/action_show.html#setting-up-a-custom-show-template-very-useful
【讨论】:
感谢您的回复,并对措辞不准确表示歉意。当我查看给定类别(例如 foobar.com/bundle/category/1234/edit)的编辑屏幕时,我正在寻找相关产品的列表。 这听起来很奇怪,因为大多数时候你想内联编辑子实体而不是只显示它们。但是您可以使用自定义编辑模板。 子实体的内联编辑是一种可能性,但现在我只想对它们有一个连贯的表示。默认显示是与类别关联的所有产品的整个编辑表单,这绝对不是我想要的。我认为覆盖模板是我需要做的,但到目前为止我还不能让它工作。这似乎很接近:php-jotter.blogspot.com.es/2013/01/…,但它不能按原样工作,而且我没有调整它的知识。 我现在有一个类似的任务。我需要在新项目的编辑表单中显示现有项目的列表视图。我刚刚意识到您可以在每个模板(甚至是编辑模板)上使用用于仪表板页面的块。我很快就会发布一个要点示例! 感谢@webDEVILopers - 完成后我很乐意看到这个要点。以上是关于Symfony / Sonata Admin:编辑表单上的列表表单的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 4 覆盖 Sonata Admin CRUD 控制器
Symfony Sonata Admin 仅将属性显示为只读文本
阻止 SonataAdmin / Symfony2 使用 sonata_type_admin 嵌入式管理员创建空对象
Symfony 3 Sonata Admin 使用注释创建管理员
Symfony 4 + Sonata + Sonata Doctrine ORM Admin Bundle:错误:没有要处理的元数据类