2

Anyone has any clue on how to add custom product attribute to order export?

Cant realy show any code, cause I have only been googling so far, as I have no clue on how to handle something like this.

Much appreciated!

0

Modify or override Mage230/vendor/magento/module-ui/Model/Export/MetadataProvider File of Core Magento

like This...

enter code herenamespace Magento\Ui\Model\Export;

use Emipro\AdminSalesOrderGrid\Ui\Component\Listing\Column\Attribute;
use Magento\Framework\Api\Search\DocumentInterface;
use Magento\Framework\Locale\ResolverInterface;
use Magento\Framework\Stdlib\DateTime\TimezoneInterface;
use Magento\Framework\View\Element\UiComponentInterface;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Ui\Component\Filters;
use Magento\Ui\Component\Filters\Type\Select;
use Magento\Ui\Component\Listing\Columns;
use Magento\Ui\Component\MassAction\Filter;

/** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class MetadataProvider { /** * @var Filter */ protected $filter;

/**
 * @var array
 */
protected $columns;

/**
 * @var TimezoneInterface
 */
protected $localeDate;

/**
 * @var string
 */
protected $locale;

/**
 * @var string
 */
protected $dateFormat;

/**
 * @var array
 */
protected $data;

/**
 * @param Filter $filter
 * @param TimezoneInterface $localeDate
 * @param ResolverInterface $localeResolver
 * @param string $dateFormat
 * @param array $data
 */
public function __construct(
    Filter $filter,
    TimezoneInterface $localeDate,
    ResolverInterface $localeResolver,
    OrderInterface $order,
    Attribute $attribute,
    $dateFormat = 'M j, Y h:i:s A',
    array $data = []
) {
    $this->attribute = $attribute;
    $this->filter = $filter;
    $this->order = $order;
    $this->localeDate = $localeDate;
    $this->locale = $localeResolver->getLocale();
    $this->dateFormat = $dateFormat;
    $this->data = $data;
}

/**
 * Returns Columns component
 *
 * @param UiComponentInterface $component
 * @return UiComponentInterface
 * @throws \Exception
 */
protected function getColumnsComponent(UiComponentInterface $component) {
    foreach ($component->getChildComponents() as $childComponent) {
        if ($childComponent instanceof Columns) {
            return $childComponent;
        }
    }
    throw new \Exception('No columns found');
}

/**
 * Returns columns list
 *
 * @param UiComponentInterface $component
 * @return UiComponentInterface[]
 */
protected function getColumns(UiComponentInterface $component) {
    if (!isset($this->columns[$component->getName()])) {
        $columns = $this->getColumnsComponent($component);
        foreach ($columns->getChildComponents() as $column) {
            if ($column->getData('config/label') && $column->getData('config/dataType') !== 'actions') {
                $this->columns[$component->getName()][$column->getName()] = $column;
            }
        }
    }
    return $this->columns[$component->getName()];
}

/**
 * Retrieve Headers row array for Export
 *
 * @param UiComponentInterface $component
 * @return string[]
 */
public function getHeaders(UiComponentInterface $component) {
    $row = [];
    foreach ($this->getColumns($component) as $column) {
        $row[] = $column->getData('config/label');
    }

    array_walk($row, function (&$header) {
        if (mb_strpos($header, 'ID') === 0) {
            $header = '"' . $header . '"';
        }
    });

    return $row;
}

/**
 * Returns DB fields list
 *
 * @param UiComponentInterface $component
 * @return array
 */
public function getFields(UiComponentInterface $component) {
    $row = [];
    foreach ($this->getColumns($component) as $column) {
        $row[] = $column->getName();
        $row[] = $column->getTitle();
    }
    return $row;
}

/**
 * Returns row data
 *
 * @param DocumentInterface $document
 * @param array $fields
 * @param array $options
 * @return array
 */
public function getRowData(DocumentInterface $document, $fields, $options) {
    $row = [];
    foreach ($fields as $column) {
        if (isset($options[$column])) {
            $key = $document->getCustomAttribute($column)->getValue();
            if (isset($options[$column][$key])) {
                $row[0] = $this->attribute->getOrderDetails($row[2]);
                $row[] = $options[$column][$key];
            } else {
                $row[] = '';
            }
        } else {
            $row[] = $document->getCustomAttribute($column)->getValue();
        }
    }
    return $row;
}

/**
 * Returns complex option
 *
 * @param array $list
 * @param string $label
 * @param array $output
 * @return void
 */
protected function getComplexLabel($list, $label, &$output) {
    foreach ($list as $item) {
        if (!is_array($item['value'])) {
            $output[$item['value']] = $label . $item['label'];
        } else {
            $this->getComplexLabel($item['value'], $label . $item['label'], $output);
        }
    }
}

/**
 * Returns array of Select options
 *
 * @param Select $filter
 * @return array
 */
protected function getFilterOptions(Select $filter) {
    $options = [];
    foreach ($filter->getData('config/options') as $option) {
        if (!is_array($option['value'])) {
            $options[$option['value']] = $option['label'];
        } else {
            $this->getComplexLabel(
                $option['value'],
                $option['label'],
                $options
            );
        }
    }
    return $options;
}

/**
 * Returns Filters with options
 *
 * @return array
 */
public function getOptions() {
    $options = [];
    $component = $this->filter->getComponent();
    $childComponents = $component->getChildComponents();
    $listingTop = $childComponents['listing_top'];
    foreach ($listingTop->getChildComponents() as $child) {
        if ($child instanceof Filters) {
            foreach ($child->getChildComponents() as $filter) {
                if ($filter instanceof Select) {
                    $options[$filter->getName()] = $this->getFilterOptions($filter);
                }
            }
        }
    }
    return $options;
}

/**
 * Convert document date(UTC) fields to default scope specified
 *
 * @param \Magento\Framework\Api\Search\DocumentInterface $document
 * @param string $componentName
 * @return void
 */
public function convertDate($document, $componentName) {
    if (!isset($this->data[$componentName])) {
        return;
    }
    foreach ($this->data[$componentName] as $field) {
        $fieldValue = $document->getData($field);
        if (!$fieldValue) {
            continue;
        }
        $convertedDate = $this->localeDate->date(
            new \DateTime($fieldValue, new \DateTimeZone('UTC')),
            $this->locale,
            true
        );
        $document->setData($field, $convertedDate->format($this->dateFormat));
    }
}

}

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.