turn this
foreach ($items as $itemCart) {
$tab[$itemCart->getUdropshipVendor()] += $itemCart->getPrice() * $itemCart->getQty();
}
into this
foreach ($items as $itemCart) {
$vendor = $itemCart->getUdropshipVendor();
if (!isset($tab[$vendor])) {
$tab[$vendor] = 0;
}
$tab[$vendor] += $itemCart->getPrice() * $itemCart->getQty();
}
I have facing same issue in export customer and fixed to override module-customer/Ui/Component/DataProvider/Document.php
file.
Follow below steps to create custom module for override Document.php file and updated code.
File path:magento/app/code/Vendor/CustomerExport/registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Vendor_CustomerExport',
__DIR__
);
File path: magento/app/code/Vendor/CustomerExport/etc/module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Vendor_CustomerExport" setup_version="1.0.0">
<sequence>
<module name="Magento_Customer"/>
</sequence>
</module>
</config>
File path: magento/app/code/Vendor/CustomerExport/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Customer\Ui\Component\DataProvider\Document" type="Vendor\CustomerExport\Ui\Component\DataProvider\Document"/>
</config>
File path:
magenot/app/code/Vendor/CustomerExport/Ui/Component/DataProvider/Document.php
<?php
namespace Vendor\CustomerExport\Ui\Component\DataProvider;
use Magento\Customer\Api\CustomerMetadataInterface;
use Magento\Customer\Model\AccountManagement;
use Magento\Framework\Api\AttributeValueFactory;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Customer\Api\GroupRepositoryInterface;
use Magento\Framework\App\ObjectManager;
use Magento\Store\Model\ScopeInterface;
use Magento\Store\Model\StoreManagerInterface;
/**
* Class Document
*/
class Document extends \Magento\Framework\View\Element\UiComponent\DataProvider\Document
{
/**
* @var string
*/
private static $genderAttributeCode = 'gender';
/**
* @var string
*/
private static $groupAttributeCode = 'group_id';
/**
* @var string
*/
private static $websiteAttributeCode = 'website_id';
/**
* @var string
*/
private static $websiteIdAttributeCode = 'original_website_id';
/**
* @var string
*/
private static $confirmationAttributeCode = 'confirmation';
/**
* @var string
*/
private static $accountLockAttributeCode = 'lock_expires';
/**
* @var CustomerMetadataInterface
*/
private $customerMetadata;
/**
* @var GroupRepositoryInterface
*/
private $groupRepository;
/**
* @var StoreManagerInterface
*/
private $storeManager;
/**
* @var ScopeConfigInterface
*/
private $scopeConfig;
/**
* Document constructor.
* @param AttributeValueFactory $attributeValueFactory
* @param GroupRepositoryInterface $groupRepository
* @param CustomerMetadataInterface $customerMetadata
* @param StoreManagerInterface $storeManager
* @param ScopeConfigInterface $scopeConfig
*/
public function __construct(
AttributeValueFactory $attributeValueFactory,
GroupRepositoryInterface $groupRepository,
CustomerMetadataInterface $customerMetadata,
StoreManagerInterface $storeManager,
ScopeConfigInterface $scopeConfig = null
) {
parent::__construct($attributeValueFactory);
$this->customerMetadata = $customerMetadata;
$this->groupRepository = $groupRepository;
$this->storeManager = $storeManager;
$this->scopeConfig = $scopeConfig ?: ObjectManager::getInstance()->create(ScopeConfigInterface::class);
}
/**
* @inheritdoc
*/
public function getCustomAttribute($attributeCode)
{
switch ($attributeCode) {
case self::$genderAttributeCode:
$this->setGenderValue();
break;
case self::$groupAttributeCode:
$this->setCustomerGroupValue();
break;
case self::$websiteAttributeCode:
$this->setWebsiteValue();
break;
case self::$confirmationAttributeCode:
$this->setConfirmationValue();
break;
case self::$accountLockAttributeCode:
$this->setAccountLockValue();
break;
}
return parent::getCustomAttribute($attributeCode);
}
private function setGenderValue()
{
$value = $this->getData(self::$genderAttributeCode);
if (!$value) {
$this->setCustomAttribute(self::$genderAttributeCode, 'N/A');
return;
}
try {
$attributeMetadata = $this->customerMetadata->getAttributeMetadata(self::$genderAttributeCode);
foreach ($attributeMetadata->getOptions() as $option) {
if ($option->getValue() == $value) {
$this->setCustomAttribute(self::$genderAttributeCode, $option->getLabel());
break;
}
}
} catch (NoSuchEntityException $e) {
$this->setCustomAttribute(self::$genderAttributeCode, 'N/A');
}
}
/**
* Update customer group value
* Method set group code instead id value
* @return void
*/
private function setCustomerGroupValue()
{
$value = $this->getData(self::$groupAttributeCode);
try {
$group = $this->groupRepository->getById($value);
$this->setCustomAttribute(self::$groupAttributeCode, $group->getCode());
} catch (NoSuchEntityException $e) {
$this->setCustomAttribute(self::$groupAttributeCode, 'N/A');
}
}
private function setWebsiteValue()
{
$value = $this->getData(self::$websiteAttributeCode);
$list = $this->storeManager->getWebsites(true);
$this->setCustomAttribute(self::$websiteAttributeCode, $list[$value]->getName());
$this->setCustomAttribute(self::$websiteIdAttributeCode, $value);
}
/**
* Update confirmation value
* Method set confirmation text value to match what is shown in grid
* @return void
*/
private function setConfirmationValue()
{
$value = $this->getData(self::$confirmationAttributeCode);
$websiteId = $this->getData(self::$websiteIdAttributeCode) ?: $this->getData(self::$websiteAttributeCode);
$isConfirmRequired = (bool)$this->scopeConfig->getValue(
AccountManagement::XML_PATH_IS_CONFIRM,
ScopeInterface::SCOPE_WEBSITES,
$websiteId
);
$valueText = __('Confirmation Not Required');
if ($isConfirmRequired) {
$valueText = $value === null ? __('Confirmed') : __('Confirmation Required');
}
$this->setCustomAttribute(self::$confirmationAttributeCode, $valueText);
}
/**
* Update lock expires value
* Method set account lock text value to match what is shown in grid
* @return void
*/
private function setAccountLockValue()
{
$value = $this->getDataByPath(self::$accountLockAttributeCode);
$valueText = __('Unlocked');
if ($value !== null) {
$lockExpires = new \DateTime($value);
if ($lockExpires > new \DateTime()) {
$valueText = __('Locked');
}
}
$this->setCustomAttribute(self::$accountLockAttributeCode, $valueText);
}
}
Best Answer
The array
$data
doesn't contain element with key0
. Try to use the following constructionThe code above will check is array has elements and set the first
$data
array element to$item
Also you can disable strict error reporting to suppress warnings. http://php.net/manual/en/migrating5.errorrep.php