Magento2: New Customer grid column breaks the export functionality
-
21-12-2020 - |
سؤال
I am working on a Magento2 extension. I added a column called "exported_to_stannp" to my customer grid using the following code:
app\code\Namespace\Module\Setup\InstallData.php
use Magento\Customer\Model\Customer;
use Magento\Customer\Setup\CustomerSetupFactory;
use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface;
use Magento\Eav\Model\Entity\Attribute\SetFactory;
use Magento\Eav\Model\Entity\Attribute\Source\Boolean;
use Magento\Eav\Model\Entity\Type;
use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
private $customerSetupFactory;
private $attributeSetFactory;
public function __construct(CustomerSetupFactory $customerSetupFactory, SetFactory $attributeSetFactory)
{
$this->customerSetupFactory = $customerSetupFactory;
$this->attributeSetFactory = $attributeSetFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
$customerSetup = $this->customerSetupFactory->create(['setup'=>$setup]);
$customerSetup->removeAttribute(Customer::ENTITY, 'exported_to_stannp');
$customerEntity = $customerSetup->getEavConfig()->getEntityType(Customer::ENTITY);
$attributeSetId = $customerEntity->getDefaultAttributeSetId();
$attributeSet = $this->attributeSetFactory->create();
$attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);
$entityTypeId = $customerSetup->getEntityTypeId(Customer::ENTITY);
$customerSetup->addAttribute(
Customer::ENTITY, 'exported_to_stannp', [
// 'type' => 'int',
'backend' => \Magento\Customer\Model\Attribute\Backend\Data\Boolean::class,
'frontend' => '',
'label' => 'Exported to Stannp',
'input' => 'select',
'source' => \Magento\Eav\Model\Entity\Attribute\Source\Boolean::class,
'required' => false,
'visible' => true,
'user_defined' => true,
'system' => false,
'adminhtml_only' => true,
'default' => 0,
'global' => ScopedAttributeInterface::SCOPE_STORE,
'value' => 0,
'is_used_in_customer_segment' => true,
"is_used_in_grid" => true,
"is_visible_in_grid" => true,
"is_filterable_in_grid" => true,
"is_searchable_in_grid" => false
]
);
$customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'exported_to_stannp')
->addData(
[
'attribute_set_id' => $attributeSetId,
'attribute_group_id' => $attributeGroupId,
'used_in_forms' => ['adminhtml_customer']
]
)->save();
$installer->endSetup();
}
}
app\code\Namespace\Module\view\adminhtml\ui_component\customer_listing.xml
<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<columns name="customer_columns">
<column name="exported_to_stannp">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Magento\Config\Model\Config\Source\Yesno</item>
<item name="config" xsi:type="array">
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
<item name="filter" xsi:type="string">select</item>
<item name="visible" xsi:type="boolean">true</item>
<item name="editor" xsi:type="string">select</item>
<item name="dataType" xsi:type="string">select</item>
<item name="label" xsi:type="string" translate="true">Exported to Stannp</item>
<item name="source" xsi:type="string">customer</item>
<item name="sortOrder" xsi:type="number">166</item>
</item>
</argument>
</column>
</columns>
</listing>
app\code\Namespace\Module\etc\indexer.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
<indexer id="customer_grid">
<fieldset name="customer" source="Magento\Customer\Model\ResourceModel\Customer\Collection" provider="Magento\Customer\Model\Indexer\AttributeProvider">
<field name="exported_to_stannp" xsi:type="filterable" dataType="int"/>
</fieldset>
</indexer>
</config>
Everything works fine, except for the export functionality in grid. I get the following error:
Fatal error: Uncaught TypeError: Argument 2 passed to Magento\Framework\View\Element\UiComponentFactory::argumentsResolver() must be of the type array, null given, called in /Users/iunia/Sites/magento2/vendor/magento/framework/View/Element/UiComponentFactory.php on line 213 and defined in /Users/iunia/Sites/magento2/vendor/magento/framework/View/Element/UiComponentFactory.php on line 164
I put logs in 2 files: vendor/magento/framework/View/Element/UiComponentFactory.php line 212 $rawComponentData and vendor/magento/module-ui/Component/Listing/Columns/Column.php line 73 $this->getName() and $dataType.
/Users/iunia/Sites/magento2/vendor/magento/module-ui/Component/Listing/Columns/Column.php:73:string 'exported_to_stannp' (length=18)
/Users/iunia/Sites/magento2/vendor/magento/module-ui/Component/Listing/Columns/Column.php:74:string 'select' (length=6) /Users/iunia/Sites/magento2/vendor/magento/framework/View/Element/UiComponentFactory.php:212:
array (size=4)
'arguments' =>
array (size=1)
'data' =>
array (size=1)
'config' =>
array (size=2)
...
'attributes' =>
array (size=3)
'class' => string 'Magento\Ui\Component\Form\Element\Select' (length=40)
'component' => string 'Magento_Ui/js/form/element/select' (length=33)
'template' => string 'ui/form/field' (length=13)
'children' =>
array (size=0)
empty
'uiComponentType' => string 'select' (length=6)
/Users/iunia/Sites/magento2/vendor/magento/module-ui/Component/Listing/Columns/Column.php:73:string 'exported_to_stannp' (length=18)
/Users/iunia/Sites/magento2/vendor/magento/module-ui/Component/Listing/Columns/Column.php:74:string 'varchar' (length=7)
/Users/iunia/Sites/magento2/vendor/magento/framework/View/Element/UiComponentFactory.php:212:null
If I add the ($this->getName() != 'exported_to_stannp') to the condition at line 74, it works as expected.
$dataType is null the second time in the logs, and only for any export.
Please help.
المحلول
Commenting out/removing the following code fixed my problem. I still have to test it on a fresh install, but for now it seems to be working.
app\code\Namespace\Module\view\adminhtml\ui_component\customer_listing.xml
<columns name="customer_columns">
<column name="exported_to_stannp">
<argument name="data" xsi:type="array">
<item name="options" xsi:type="object">Magento\Config\Model\Config\Source\Yesno</item>
<item name="config" xsi:type="array">
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
<item name="filter" xsi:type="string">select</item>
<item name="visible" xsi:type="boolean">true</item>
<item name="editor" xsi:type="string">select</item>
<item name="dataType" xsi:type="string">select</item>
<item name="label" xsi:type="string" translate="true">Exported to Stannp</item>
<item name="source" xsi:type="string">customer</item>
<item name="sortOrder" xsi:type="number">166</item>
</item>
</argument>
</column>
</columns>