Sonata Admin Bundle:列表视图中的可编辑建议字段

时间:2017-10-01 20:18:34

标签: symfony sonata-admin

在列表字段中,您可以通过在configureListFields操作中将属性“editable”设置为“true”来使字段可编辑。是否有可能(使用板载奏鸣曲管理工具)使字段可编辑,包含多个值,如一对多关系?

实施例: 我有一个列表视图中列出的学生列表。每个学生在学生列表视图的classes列中都有多个类。通过点击类我想要一个popover打开(就像它使用一个normale字符串)和一个建议字段,就像你可以在编辑视图中一样。

使用configFormFields操作中的属性不起作用:

FunctionalInterface

该片段是在configureListFields操作中的PupilsAdmin类中编写的。

是否可以创建自定义模板? 该文档没有指出我正确的方向:https://sonata-project.org/bundles/admin/2-2/doc/reference/field_types.html

2 个答案:

答案 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

现在您准备好内联编辑它了:)