Exemplo n.º 1
0
 /**
  * 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]);
 }
Exemplo n.º 3
0
 /**
  * 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();
 }