Question

I have added one customer address custom attribute. it is showing in the customer address form as a dropdown field. Now I want to show that as a column in customer address grid in admin with value.

I have added this code:

<column name="addresstype" class="xxx\xxx\Customer\Ui\Component\Listing\Address\Column\Addresstype" sortOrder="95">
        <settings>
            <filter>text</filter>
            <label translate="true">addresstype</label>
            <editor>
                <editorType>text</editorType>
            </editor>
        </settings>
    </column>

The column is added but the value is not showing in this. how to get the value which was set in form? I tried in the following way, but getting an error:

xxx/xxx/Customer/Ui/Component/Listing/Address/Column/Addresstype.php

 public function prepareDataSource(array $dataSource): array
{
    if (isset($dataSource['data']['items'])) {
        foreach ($dataSource['data']['items'] as &$item) {

            if ($item['addresstype'] == 1) {
                $item['addresstype'] = 'Yes';
            } else {
                $item['addresstype'] = 'No';
            }
        }
    }

    return $dataSource;
}

But i ma getting error :

Undefined index: addresstype in /var/www/html/zest-anchor/app/code/Zest/Integration/Customer/Ui/Component/Listing/Address/Column/Addresstype.php on line 75 {"exception":"[object] (Exception(code: 0): Notice: Undefined index: addresstype in /var/www/html/zest-anchor/app/code/Zest/Integration/Customer/Ui/Component/Listing/Address/Column/Addresstype.php on line 75 at /var/www/html/zest-anchor/vendor/magento/framework/App/ErrorHandler.php:61)"} []

No correct solution

OTHER TIPS

To get your value in the admin grid, the code should be

in your ui_component xml file

<column name="addresstype" component="Magento_Ui/js/grid/columns/select" sortOrder="95">
            <settings>
                <addField>true</addField>
                <options class="Zest\Integration\Model\Customer\Attribute\Source\AddressType"/>
                <filter>select</filter>
                <sortable>false</sortable>
                <dataType>select</dataType>
                <label translate="true">Address Type</label>
            </settings>
        </column>

You dont need a source class as its a customer address attribute, check your customer address attribute settings, make sure you have set Yes for Add to Column Options and Use in Filter Options

In your customer address type source file

Zest\Integration\Model\Customer\Attribute\Source\AddressType.php

<?php

namespace Zest\Integration\Model\Customer\Attribute\Source;

use Magento\Eav\Model\Entity\Attribute\Source\AbstractSource;
use Magento\Eav\Model\Entity\Attribute\Source\SourceInterface;
use Magento\Framework\Data\OptionSourceInterface;

/**
 *  returns customer's address type source
 *
 */
class AddressType extends AbstractSource implements SourceInterface, OptionSourceInterface
{
    
   
    /**
     * Retrieve option array
     *
     * @return string[]
     */
    public static function getOptionArray()
    {
        return [ 0 => __('No'), 1 => __('Yes')];
    }

    /**
     * Retrieve option array with empty value
     *
     * @return string[]
     */
    public function getAllOptions()
    {
        $result = [];

        foreach (self::getOptionArray() as $index => $value) {
            $result[] = ['value' => $index, 'label' => $value];
        }

        return $result;
    }

    /**
     * Retrieve option text by option value
     *
     * @param string $optionId
     * @return string
     */
    public function getOptionText($optionId)
    {
        $options = self::getOptionArray();

        return isset($options[$optionId]) ? $options[$optionId] : null;
    }

}

To get your option values in the grid for select type columns , you need an attribute source class like the one above

To modify the value in the grid you need a renderer class like the one that you've added in the question.

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top