Magento 2 Adminhtml formularze rozkładające się na wiele kart

42

Próbuję utworzyć moduł zaplecza, w którym na stronie edycji używam admin-2column-leftukładu.

Chcę mieć formularz na każdej karcie, ale nie rozumiem, jak to zrobić.
Idealnie chciałbym wiedzieć, jak przypisać różne formularze uiComponentsdo różnych kart lub jak zdefiniować jeden uiComponentdla mojego formularza, ale być w stanie przypisać, który zestaw pól pasuje do której karty.

Moja konkretna sytuacja, która prowokuje to pytanie, polega na tym, że chcę mieć standardowy formularz na jednej karcie (wielokrotne wprowadzanie tekstu), a na innej karcie chcę mieć dynamicRowskomponent interfejsu użytkownika. Nazwaliśmy te zakładki Elementami głównymi i Elementami zamówienia.

Obecnie implementuję to w następujący sposób: Main jest zdefiniowany w _prepareFormmetodzie w jej bloku, który jest rozszerzeniem klasy Form\Generic. Ten formularz pojawia się i działa poprawnie, dopóki nie dodam dynamicznych wierszy.

Mój plik układu ma kod, aby dodać kartę główną i przypisać blok zawartości. Ma również nazwany kontener line_items, który zawiera uiComponentformularz zawierający dynamiczne wiersze.

Zakładka Elementy liniowe jest tworzona _beforeToHtmlmetodą Widget\Tab, a jej zawartość jest przypisywana za pomocą wywołania do getChildHtmlkontenera line_items.

Karta działa i jest wypełniona odpowiednią strukturą, co pozwala mi dodawać i usuwać wiersze.

Problem polega na tym, że kiedy przesyłam stronę, przesyłane są tylko dane wejściowe na karcie Elementy zamówienia.

Wiem, że nie skonfigurowałem tego poprawnie i potrzebuję jakiegoś sposobu, aby poinstruować go, aby śledził i przesyłał wszystkie elementy formularza. Większość tej implementacji pochodzi z moich prób inżynierii wstecznej konfiguracji formularza Atrybuty produktu kategorii, który jest podobny do tego, co chcę zrobić.

Czy ktoś ma o tym pomysł?

Stephen Fritz
źródło
Czy kiedykolwiek to rozgryzłeś?
jamil
1
Stephen - Zakładam, że po tylu latach znalazłeś rozwiązanie? Jeśli tak, czy możesz to zaktualizować o swoje rozwiązanie?
brentwpeterson
@Stephen Fritz - Czy możesz podać zrzut ekranu, jak szukasz?
Praful Rajput
Czy mogę zapytać, czy to pytanie nadal wymaga odpowiedzi? Jeśli tak, mogę sprawdzić, czy rozumiem problem: czy próbujemy zbudować ekran zaplecza z oddzielnymi formularzami? czy ekran z wieloma kartami (moda uiComponent) może być rozwiązaniem tego problemu?
Herve Tribouilloy
1
@stephen Fritz - Spróbuj zmienić nazwę zestawu pól, ponieważ musi być unikalny, ponieważ może powodować konflikt w innym miejscu. Mam to samo wydane i jego rozwiązanie poprzez zmianę nazwy zestawu pól
Abdul Kadir

Odpowiedzi:

0

Użyj poniższego kodu, aby utworzyć karty z pojedynczym formularzem przy użyciu komponentu interfejsu użytkownika

<argument name="data" xsi:type="array">
    <item name="js_config" xsi:type="array">
        <item name="provider" xsi:type="string">custom_form.custom_form_data_source</item>
        <!--This is for tab -->
        <item name="deps" xsi:type="string">custom_form.custom_form_data_source</item>
    </item>

    <!--following tag add the tab into form-->
    <item name="label" xsi:type="string" translate="true">Test Details</item>
    <item name="reverseMetadataMerge" xsi:type="boolean">true</item>
   <item name="layout" xsi:type="array">
        <item name="type" xsi:type="string">tabs</item>
        <item name="navContainerName" xsi:type="string">left</item>
    </item>

</argument>

Utwórz element formularza

 <fieldset name="general">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="label" xsi:type="string">General Information</item>
        </item>
    </argument>

    <field name="name">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="source" xsi:type="string">general</item>
                <item name="label" xsi:type="string">Name</item>
                <item name="formElement" xsi:type="string">input</item>
                <item name="dataType" xsi:type="string">text</item>
                <item name="dataScope" xsi:type="string">name</item>
                <item name="validation" xsi:type="array">
                    <item name="required-entry" xsi:type="boolean">true</item>
                </item>
            </item>
        </argument>
    </field>
 </fieldset>
 <fieldset name="address">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="label" xsi:type="string">Address and Contact</item>
        </item>
    </argument>
    <field name="address_line1">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="source" xsi:type="string">address</item>
                <item name="label" xsi:type="string">Address Line1</item>
                <item name="formElement" xsi:type="string">input</item>
                <item name="datatype" xsi:type="string">text</item>
                <item name="datascope" xsi:type="string">address_line1</item>
            </item>
        </argument>
    </field>

    <field name="address_line2">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="source" xsi:type="string">address</item>
                <item name="label" xsi:type="string">Address Line2</item>
                <item name="formElement" xsi:type="string">input</item>
                <item name="datatype" xsi:type="string">text</item>
                <item name="datascope" xsi:type="string">address_line2</item>
            </item>
        </argument>
    </field>
  </fieldset>

Ten kod wyświetli 2 zakładki w formularzu z powiązanymi polami formularza.

Mam nadzieję, że to rozwiązanie będzie dla Ciebie odpowiednie

Mitro
źródło