Tengo una entidad personalizada en mi instalación de magento 2.
Y uno de los campos en esta entidad es de tipo multiselección y contiene la lista de todos los países.
Estoy usando los componentes ui para mi formulario de administración.
Como hay alrededor de 200 registros en la selección, no quiero tener un campo de selección múltiple porque no es tan fácil de usar.
Así que creé una de esas multiselecciones elegantes similares al campo de categorías en la sección de administración de agregar / editar producto.
Se ve mejor, pero no puedo establecer un valor predeterminado.
Aquí está mi configuración (observe el default
elemento de configuración):
<field name="affected_countries" formElement="select" component="Magento_Ui/js/form/element/ui-select" sortOrder="100">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="source" xsi:type="string">article</item>
<item name="filterOptions" xsi:type="boolean">true</item>
<item name="chipsEnabled" xsi:type="boolean">true</item>
<item name="disableLabel" xsi:type="boolean">true</item>
<item name="default" xsi:type="string">RO,MD</item>
</item>
</argument>
<settings>
<elementTmpl>ui/grid/filters/elements/ui-select</elementTmpl>
<dataType>text</dataType>
<label translate="true">Affected Countries</label>
<dataScope>affected_countries</dataScope>
<componentType>field</componentType>
</settings>
<formElements>
<select>
<settings>
<options class="Magento\Config\Model\Config\Source\Locale\Country"/>
</settings>
</select>
</formElements>
</field>
Y espero que se seleccionen los 2 valores que coloqué en el campo predeterminado:
Si convierto el elemento en una simple selección múltiple, funciona muy bien.
<field name="affected_countries" formElement="multiselect" sortOrder="100">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="source" xsi:type="string">article</item>
<item name="default" xsi:type="string">RO,MD</item>
</item>
</argument>
<settings>
<dataType>text</dataType>
<label translate="true">Affected Countries</label>
<dataScope>affected_countries</dataScope>
</settings>
<formElements>
<multiselect>
<settings>
<options class="Magento\Config\Model\Config\Source\Locale\Country"/>
</settings>
</multiselect>
</formElements>
</field>
Atado con este formato para la default
configuración
<item name="default" xsi:type="string">RO,MD</item>
y este también:
<item name="default" xsi:type="array">
<item name="MD" xsi:type="string">MD</item>
<item name="RO" xsi:type="string">RO</item>
</item>
También probé con la etiqueta select
y multiselect
dentro de la formElements
etiqueta.
Todos mis intentos terminaron en fracaso.
El uso de la default
configuración en cualquier otro tipo de campos, como se indica aquí (texto, selección, fecha, ...) funciona bien.
¿Alguna sugerencia para los selectos elegantes? Algo que me perdí?
Nota: Sé que puedo proporcionar un valor predeterminado en el proveedor de datos que llena el formulario, pero estoy tratando de evitar esto, ya que se ve feo y no es tan extensible y no es consistente con el resto de los campos.
<options class="Magento\Config\Model\Config\Source\Locale\Country"/>
. Necesita una clase similar que implemente\Magento\Framework\Option\ArrayInterface
y tenga un método llamadotoOptionArray
que devuelva una matriz con sus valores. cada elemento de la matriz debe tener este aspecto['value' => ..., 'label' => ...]
Respuestas:
Trabajé para categorías personalizadas, pero en este método debe proporcionar datos de países a través de la base de datos, tomar una idea de este código y puede proporcionar datos de Db o datos estáticos extendiendo datos de magento, espero que pueda ayudar
El código xml
El código de Cofig
La salida se ve así
fuente