0

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)"} []
0

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.

3
  • but how to get value from renderer class. like if i added this code.. only yes value is visible... its not change if ($item['addresstype'] == 1) { $item['addresstype'] = 'Yes'; } else { $item['addresstype'] = 'No'; } – sam Feb 23 at 13:49
  • if i use your above code.. i am getting error: Column not found: 1054 Unknown column 'main_table.addresstype' in 'field list', query was: SELECT main_table.addresstype FROM customer_address_entity AS main_table WHERE (parent_id = '103674') LIMIT 20 {"exception":"[object] (Zend_Db_Statement_Exception(code: 42): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'main_table.addresstype' in 'field list', query was: SELECT main_table.addresstype FROM customer_address_entity AS main_table WHERE (parent_id = '103674') LIMIT 20 – sam Feb 23 at 14:00
  • Hi, in your case, you don't need a source class, as its a customer address attribute and it shows up in the address edit form already. How did you add the address attribute. through backend or through setup class ? if from backend, check your attribute settings, make sure you have set Yes for Add to Column Options and Use in Filter Options – Haijerome Feb 23 at 14:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.