Фильтрация полей выбора, зависящих от Magento2


Я могу использовать поля страны и штата в форме администратора, просто вставив XML-файл формы, описанный здесь ui_component обновление поля состояния/региона формы после выбора страны (M 2.1) Теперь мой вопрос заключается в том, что я создаю пользовательский модуль, в котором есть города и регионы, и я хочу, чтобы регионы фильтровались на основе выбранных городов. Я составляю форму, а также перечисляю все данные в городе и регионе, используя модели, которые работают нормально. Ниже приведен мой код для app/code/Vendor/Storemap/view/adminhtml/ui_component/vendor_branch_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <argument name="data" xsi:type="array">
        <item name="js_config" xsi:type="array">
            <item name="provider" xsi:type="string">Vendor_branch_form.storemap_branch_form_data_source</item>
            <item name="deps" xsi:type="string">Vendor_branch_form.storemap_branch_form_data_source</item>
        </item>
        <item name="label" xsi:type="string" translate="true">General</item>
        <item name="layout" xsi:type="array">
            <item name="type" xsi:type="string">tabs</item>
            <item name="navContainerName" xsi:type="string">left</item>
        </item>
        <item name="buttons" xsi:type="array">
            <item name="save" xsi:type="array">
                <item name="name" xsi:type="string">save</item>
                <item name="label" xsi:type="string" translate="true">Save</item>
                <item name="class" xsi:type="string">primary</item>
                <item name="url" xsi:type="string">*/*/save</item>
            </item>
        </item>
    </argument>
    <dataSource name="storemap_branch_form_data_source">
        <argument name="dataProvider" xsi:type="configurableObject">
            <argument name="class" xsi:type="string">Vendor\Storemap\Ui\DataProvider</argument>
            <argument name="name" xsi:type="string">storemap_branch_form_data_source</argument>
            <argument name="primaryFieldName" xsi:type="string">id_store</argument>
            <argument name="requestFieldName" xsi:type="string">id_store</argument>
            <argument name="collectionFactory" xsi:type="object">Vendor\Storemap\Model\ResourceModel\Branch\CollectionFactory</argument>
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="submit_url" xsi:type="url" path="storemap/branch/save"/>
                </item>
            </argument>
        </argument>
        <argument name="data" xsi:type="array">
            <item name="js_config" xsi:type="array">
                <item name="component" xsi:type="string">Magento_Ui/js/form/provider</item>
            </item>
        </argument>
    </dataSource>
    <fieldset name="general">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="label" xsi:type="string" translate="true">General</item>
            </item>
        </argument>
        <field name="store_number">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Store Number</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                </item>
            </argument>
        </field>
        <field name="id_city">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Vendor\Storemap\Model\System\City</item>
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">City</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">select</item>
                    <item name="source" xsi:type="string">general</item>
                    <item name="dataScope" xsi:type="string">id_city</item>
                    <!--<item name="component" xsi:type="string">Vendor_Storemap/js/city</item>-->
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                    <!--<item name="imports" xsi:type="array">-->
                        <!--<item name="default" xsi:type="string">${ $.provider }:data.customer.website_id</item>-->
                    <!--</item>-->
                </item>
            </argument>
        </field>

        <field name="id_region">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Vendor\Storemap\Model\ResourceModel\Region\Collection</item>
                <item name="config" xsi:type="array">
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Region</item>
                    <item name="formElement" xsi:type="string">select</item>
                    <item name="source" xsi:type="string">general</item>
                    <item name="sortOrder" xsi:type="number">20</item>
                    <item name="dataScope" xsi:type="string">id_region</item>
                    <!--<item name="customEntry" xsi:type="string">region</item>-->
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">true</item>
                    </item>
                    <item name="filterBy" xsi:type="array">
                        <item name="target" xsi:type="string">${ $.provider }:${ $.parentScope }.id_city</item><!-- 'country' - db table column name where country code is saved -->
                        <item name="field" xsi:type="string">id_city</item><!-- country_id field name -->
                    </item>
                </item>
            </argument>
        </field>

        <field name="store_mail">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Store mail</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">false</item>
                    </item>
                </item>
            </argument>
        </field>
        <field name="lat_lan">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">lat_lan</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="formElement" xsi:type="string">input</item>
                    <item name="validation" xsi:type="array">
                        <item name="required-entry" xsi:type="boolean">false</item>
                    </item>
                </item>
            </argument>
        </field>

        <field name="active">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="array">
                    <item name="0" xsi:type="array">
                        <item name="value" xsi:type="number">0</item>
                        <item name="label" xsi:type="string" translate="true">In-Acive</item>
                    </item>
                    <item name="1" xsi:type="array">
                        <item name="value" xsi:type="number">1</item>
                        <item name="label" xsi:type="string" translate="true">Active</item>
                    </item>
                </item>
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Status</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="dataType" xsi:type="string">number</item>
                    <item name="formElement" xsi:type="string">select</item>
                    <item name="dataScope" xsi:type="string">active</item>
                    <item name="sortOrder" xsi:type="number">60</item>
                </item>
            </argument>
        </field>
    </fieldset>
</form>
Author: Siarhey Uchukhlebau, 2017-10-29

1 answers

После проверки выбора страны и региона по умолчанию я нашел решение. Решение в моем случае заключалось в том, что я не возвращал id_city в коллекцию регионов. Как и в вышеупомянутом xml, о котором я упоминал

<item name="filterBy" xsi:type="array">
    <item name="target" xsi:type="string">${ $.provider }:${ $.parentScope }.id_city</item><!-- 'country' - db table column name where country code is saved -->
    <item name="field" xsi:type="string">id_city</item><!-- country_id field name -->
</item>

Так что он будет ожидать id_country и в регионах. Ниже приведен мой код для файла RegionCollection, расположенного по адресу Vendor\Storemap\Model\ResourceModel\Region\Collection:

namespace Vendor\Storemap\Model\System;

use Magento\Framework\Data\OptionSourceInterface;
use Vendor\Storemap\Model\ResourceModel\Region\Collection;
use Vendor\Storemap\Model\ResourceModel\Region\CollectionFactory;

class Region implements OptionSourceInterface
{
    private $collectionFactory;

    public function __construct(CollectionFactory $collectionFactory)
    {
        $this->collectionFactory = $collectionFactory;
    }

    /**
     * Return array of options as value-label pairs
     *
     * @return array Format: array(array('value' => '<value>', 'label' => '<label>'), ...)
     */
    public function toOptionArray()
    {
        $options = [];
        $cities = $this->collectionFactory->create()->getItems();
        foreach ($cities as $key=>$value)
        {
            $options[] = ['label' => $value['region_en'], 'value' => $value['id_region'], 'id_city' => $value['id_city']];
        }
        return $options;
    }
}
 2
Author: AbdulBasit, 2017-11-09 08:30:09