在列表字段中,您可以通过在configureListFields操作中将属性“editable”设置为“true”来使字段可编辑。是否有可能(使用板载奏鸣曲管理工具)使字段可编辑,包含多个值,如一对多关系?
实施例: 我有一个列表视图中列出的学生列表。每个学生在学生列表视图的classes列中都有多个类。通过点击类我想要一个popover打开(就像它使用一个normale字符串)和一个建议字段,就像你可以在编辑视图中一样。
使用configFormFields操作中的属性不起作用:
FunctionalInterface
该片段是在configureListFields操作中的PupilsAdmin类中编写的。
是否可以创建自定义模板? 该文档没有指出我正确的方向:https://sonata-project.org/bundles/admin/2-2/doc/reference/field_types.html
答案 0 :(得分:1)
如果我理解你,你想在奏鸣曲的列表视图中内联编辑一对多关系。据我所知,这只适用于简单类型,如text,int或choice等。他们在你的链接中指出了18号
这些类型接受可编辑参数来编辑列表操作中的值。目前仅限于标量类型(text,integer,url ...)。
所以相关对象不能在该列表中,只能是它们的标量属性。对于所有其他事情,你必须编写自己的模板......
我不知道你想用这个建议列表实现什么,但对我来说,在编辑视图中编辑列表视图中的一对多属性是没有意义的。
答案 1 :(得分:1)
您只需要创建新类型。诸如“实体”之类的东西
'header_class' => 'col-lg-1',
'class' => Employee::class,
'editable' => true,
])
下一步是在listBuilder中覆盖fixFieldDescription方法并对其进行处理
class EntityListBuilder extends ListBuilder
{
/**
* @var Registry
*/
private $doctrine;
/**
* @param AdminInterface $admin
* @param FieldDescriptionInterface $fieldDescription
*/
public function fixFieldDescription(AdminInterface $admin, FieldDescriptionInterface $fieldDescription)
{
parent::fixFieldDescription($admin, $fieldDescription);
if ($fieldDescription->getType() === 'entity') {
$class = $fieldDescription->getOption('class');
if (!$class) {
throw new RuntimeException("Type entity must contain 'class' argument");
}
$objects = $this->doctrine->getRepository($class)->findAll();
$choices = [];
foreach ($objects as $object) {
$choices[$object->getId()] = $object->__toString();
}
$fieldDescription->setOption('choices', $choices);
$fieldDescription->setType('choice');
}
}
/**
* @param Registry $doctrine
*/
public function setDoctrine(Registry $doctrine)
{
$this->doctrine = $doctrine;
}
/**
* @param string $type
*
* @return string
*/
private function getTemplate($type)
{
return $this->templates[$type] ?? '';
}
现在,您必须为“实体”类型覆盖模板
{% extends '@SonataAdmin/CRUD/list_choice.html.twig' %}
{% set value = admin.id(value) %}
需要将已经选择的值设置为选择框 好的,最后是将我们的类型添加到Twig的可编辑类型中 将其添加到OverrideServiceCompilerPass中:
$definition = $container->getParameter('sonata.admin.twig.extension.x_editable_type_mapping');
$definition['entity'] = 'select';
$container->setParameter('sonata.admin.twig.extension.x_editable_type_mapping', $definition);
最后一个恰好与您的模板类型匹配
templates:
types:
list:
...
entity: AppBundle:CRUD:list_entity.html.twig
现在您准备好内联编辑它了:)