簡體   English   中英

Sonata Admin Bundle:列表視圖中的可編輯建議字段

[英]Sonata Admin Bundle: Editable suggest field in list view

在列表字段中,您可以通過在 configureListFields 操作中將屬性“editable”設置為“true”來使字段可編輯。 是否有可能(使用板載奏鳴曲管理工具)使包含多個值的字段可編輯,如一對多關系?

示例:我在列表視圖中列出了一個學生列表。 每個學生在學生列表視圖的班級列中都有多個班級列表。 通過單擊類,我想要一個彈出窗口打開(就像它與普通字符串一起工作)和一個建議字段,就像你可以在編輯視圖中一樣。

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

$listMapper->add(
                'classes',null, array(
                    'editable' => true,
                    'type' => 'sonata_type_model_autocomplete',
                    'multiple' => true,
                    'property' => 'name'
                )
            );

該代碼段寫在 configureListFields 操作中的 PupilsAdmin 類中。

是否可能或我必須創建自定義模板? 文檔沒有指出我正確的方向: https : //sonata-project.org/bundles/admin/2-2/doc/reference/field_types.html

如果我理解正確,您想在奏鳴曲的列表視圖中內聯編輯一對多關系。 據我所知,這僅適用於文本、整數或選擇等簡單類型。 他們在你的鏈接中指出了沒有 18.

這些類型接受可編輯參數以從列表操作中編輯值。 目前僅限於標量類型(文本、整數、url...)。

因此相關對象不能在該列表中,只能是它們的標量屬性。 對於所有其他事情,您必須編寫自己的模板......

我不知道你想用這個建議的列表實現什么,但對我來說,在列表視圖中編輯一對多屬性是沒有意義的,就像在編輯視圖中所做的那樣。

您只需要創建新類型。 類似“實體”的東西

                '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

現在您准備好內聯編輯它:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM