/** * Export process. * * @return string */ public function export() { $collection = $this->_prepareEntityCollection(Mage::getResourceModel('customer/customer_collection')); $validAttrCodes = $this->_getExportAttrCodes(); $writer = $this->getWriter(); $defaultAddrMap = Mage_ImportExport_Model_Import_Entity_Customer_Address::getDefaultAddressAttrMapping(); // prepare address data $addrAttributes = array(); $addrColNames = array(); $customerAddrs = array(); foreach (Mage::getResourceModel('customer/address_attribute_collection')->addSystemHiddenFilter()->addExcludeHiddenFrontendFilter() as $attribute) { $options = array(); $attrCode = $attribute->getAttributeCode(); if ($attribute->usesSource() && 'country_id' != $attrCode) { foreach ($attribute->getSource()->getAllOptions(false) as $option) { foreach (is_array($option['value']) ? $option['value'] : array($option) as $innerOption) { if (strlen($innerOption['value'])) { // skip ' -- Please Select -- ' option $options[$innerOption['value']] = $innerOption['label']; } } } } $addrAttributes[$attrCode] = $options; $addrColNames[] = Mage_ImportExport_Model_Import_Entity_Customer_Address::getColNameForAttrCode($attrCode); } foreach (Mage::getResourceModel('customer/address_collection')->addAttributeToSelect('*') as $address) { $addrRow = array(); foreach ($addrAttributes as $attrCode => $attrValues) { if (null !== $address->getData($attrCode)) { $value = $address->getData($attrCode); if ($attrValues) { $value = $attrValues[$value]; } $column = Mage_ImportExport_Model_Import_Entity_Customer_Address::getColNameForAttrCode($attrCode); $addrRow[$column] = $value; } } $customerAddrs[$address['parent_id']][$address->getId()] = $addrRow; } // create export file $writer->setHeaderCols(array_merge($this->_permanentAttributes, $validAttrCodes, array('password'), $addrColNames, array_keys($defaultAddrMap))); foreach ($collection as $itemId => $item) { // go through all customers $row = array(); // go through all valid attribute codes foreach ($validAttrCodes as $attrCode) { $attrValue = $item->getData($attrCode); if (isset($this->_attributeValues[$attrCode]) && isset($this->_attributeValues[$attrCode][$attrValue])) { $attrValue = $this->_attributeValues[$attrCode][$attrValue]; } if (null !== $attrValue) { $row[$attrCode] = $attrValue; } } $row[self::COL_WEBSITE] = $this->_websiteIdToCode[$item['website_id']]; $row[self::COL_STORE] = $this->_storeIdToCode[$item['store_id']]; // addresses injection $defaultAddrs = array(); foreach ($defaultAddrMap as $colName => $addrAttrCode) { if (!empty($item[$addrAttrCode])) { $defaultAddrs[$item[$addrAttrCode]][] = $colName; } } if (isset($customerAddrs[$itemId])) { while ($addrRow = each($customerAddrs[$itemId])) { if (isset($defaultAddrs[$addrRow['key']])) { foreach ($defaultAddrs[$addrRow['key']] as $colName) { $row[$colName] = 1; } } $writer->writeRow(array_merge($row, $addrRow['value'])); $row = array(); } } else { $writer->writeRow($row); } } return $writer->getContents(); }
/** * Validate data row. * * @param array $rowData * @param int $rowNum * @return boolean */ public function validateRow(array $rowData, $rowNum) { static $email = null; // e-mail is remembered through all customer rows static $website = null; // website is remembered through all customer rows if (isset($this->_validatedRows[$rowNum])) { // check that row is already validated return !isset($this->_invalidRows[$rowNum]); } $this->_validatedRows[$rowNum] = true; $rowScope = $this->getRowScope($rowData); if (self::SCOPE_DEFAULT == $rowScope) { $this->_processedEntitiesCount++; } // BEHAVIOR_DELETE use specific validation logic if (Mage_ImportExport_Model_Import::BEHAVIOR_DELETE == $this->getBehavior()) { if (self::SCOPE_DEFAULT == $rowScope && !isset($this->_oldCustomers[$rowData[self::COL_EMAIL]][$rowData[self::COL_WEBSITE]])) { $this->addRowError(self::ERROR_EMAIL_SITE_NOT_FOUND, $rowNum); } } elseif (self::SCOPE_DEFAULT == $rowScope) { // row is SCOPE_DEFAULT = new customer block begins $email = $rowData[self::COL_EMAIL]; $website = $rowData[self::COL_WEBSITE]; if (!Zend_Validate::is($email, 'EmailAddress')) { $this->addRowError(self::ERROR_INVALID_EMAIL, $rowNum); } elseif (!isset($this->_websiteCodeToId[$website])) { $this->addRowError(self::ERROR_INVALID_WEBSITE, $rowNum); } else { if (isset($this->_newCustomers[$email][$website])) { $this->addRowError(self::ERROR_DUPLICATE_EMAIL_SITE, $rowNum); } $this->_newCustomers[$email][$website] = false; if (!empty($rowData[self::COL_STORE]) && !isset($this->_storeCodeToId[$rowData[self::COL_STORE]])) { $this->addRowError(self::ERROR_INVALID_STORE, $rowNum); } // check password if (isset($rowData['password']) && strlen($rowData['password']) && Mage::helper('core/string')->strlen($rowData['password']) < self::MAX_PASSWD_LENGTH) { $this->addRowError(self::ERROR_PASSWORD_LENGTH, $rowNum); } // check simple attributes foreach ($this->_attributes as $attrCode => $attrParams) { if (in_array($attrCode, $this->_ignoredAttributes)) { continue; } if (isset($rowData[$attrCode]) && strlen($rowData[$attrCode])) { $this->isAttributeValid($attrCode, $attrParams, $rowData, $rowNum); } elseif ($attrParams['is_required'] && !isset($this->_oldCustomers[$email][$website])) { $this->addRowError(self::ERROR_VALUE_IS_REQUIRED, $rowNum, $attrCode); } } } if (isset($this->_invalidRows[$rowNum])) { $email = false; // mark row as invalid for next address rows } } else { if (null === $email) { // first row is not SCOPE_DEFAULT $this->addRowError(self::ERROR_EMAIL_IS_EMPTY, $rowNum); } elseif (false === $email) { // SCOPE_DEFAULT row is invalid $this->addRowError(self::ERROR_ROW_IS_ORPHAN, $rowNum); } } // validate row data by address entity $this->_addressEntity->validateRow($rowData, $rowNum); return !isset($this->_invalidRows[$rowNum]); }
/** * Makes sure address model is using the proper data source model. * * @param Mage_ImportExport_Model_Import_Entity_Customer $customer */ public function __construct(Mage_ImportExport_Model_Import_Entity_Customer $customer) { parent::__construct($customer); $this->_dataSourceModel = Danslo_ApiImport_Model_Import::getDataSourceModel(); }