2013-06-20 1 views
1

J'utilise un script pour mettre à jour les prix des produits dans Magento à partir d'un fichier CSV.Comme une déclaration pour correspondre à une partie de la chaîne

Actuellement, les SKU du CSV ne correspondent pas exactement aux SKU de Magento. Par exemple un dans le CSV peut-être 33456 mais dans Magento ce sera 003456_01 ou 003456_02. J'ai donc besoin que le script ne corresponde qu'à la partie centrale du SKU, donc s'il y a 00 ou _01 après le SKU dans Magento, il les mettra à jour tout ce qui correspond à ce SKU avant de passer à la ligne suivante.

$mageFilename = 'app/Mage.php'; 
    require_once $mageFilename; 
    Mage::setIsDeveloperMode(true); 
    ini_set('display_errors', 1); 
    umask(0); 
    Mage::app('admin'); 
    Mage::register('isSecureArea', 1); 
    Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 

    set_time_limit(0); 
    ini_set('memory_limit','1024M'); 

    /***************** UTILITY FUNCTIONS ********************/ 
    function _getConnection($type = 'core_read'){ 
     return Mage::getSingleton('core/resource')->getConnection($type); 
    } 

    function _getTableName($tableName){ 
     return Mage::getSingleton('core/resource')->getTableName($tableName); 
    } 

    function _getAttributeId($attribute_code = 'price'){ 
     $connection = _getConnection('core_read'); 
     $sql = "SELECT attribute_id 
        FROM " . _getTableName('eav_attribute') . " 
       WHERE 
        entity_type_id = ? 
        AND attribute_code = ?"; 
     $entity_type_id = _getEntityTypeId(); 
     return $connection->fetchOne($sql, array($entity_type_id, $attribute_code)); 
    } 

    function _getEntityTypeId($entity_type_code = 'catalog_product'){ 
     $connection = _getConnection('core_read'); 
     $sql  = "SELECT entity_type_id FROM " . _getTableName('eav_entity_type') . " WHERE entity_type_code = ?"; 
     return $connection->fetchOne($sql, array($entity_type_code)); 
    } 

    function _getIdFromSku($sku){ 
     $connection = _getConnection('core_read'); 
     $sql  = "SELECT entity_id FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?"; 
     return $connection->fetchOne($sql, array($sku)); 

    } 

    function _checkIfSkuExists($sku){ 
     $connection = _getConnection('core_read'); 
     $sql  = "SELECT COUNT(*) AS count_no FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?"; 
     $count  = $connection->fetchOne($sql, array($sku)); 
     if($count > 0){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 

    function _updatePrices($data){ 
     $connection  = _getConnection('core_write'); 
     $sku   = $data[0]; 
     $newPrice  = $data[1]; 
     $productId  = _getIdFromSku($sku); 
     $attributeId = _getAttributeId(); 

     $sql = "UPDATE " . _getTableName('catalog_product_entity_decimal') . " cped 
        SET cped.value = ? 
       WHERE cped.attribute_id = ? 
       AND cped.entity_id = ?"; 
     $connection->query($sql, array($newPrice, $attributeId, $productId)); 
    } 
    /***************** UTILITY FUNCTIONS ********************/ 

    $csv    = new Varien_File_Csv(); 
    $data    = $csv->getData('price-update/PRDAH014.csv'); //path to csv 
    array_shift($data); 

    $message = ''; 
    $count = 1; 
    foreach($data as $_data){ 
     if(_checkIfSkuExists($_data[0])){ 
      try{ 
       _updatePrices($_data); 
       $message .= $count . '> Success:: While Updating Price (' . $_data[1] . ') of Sku (' . $_data[0] . '). <br />'; 

      }catch(Exception $e){ 
       $message .= $count .'> Error:: While Upating Price (' . $_data[1] . ') of Sku (' . $_data[0] . ') => '.$e->getMessage().'<br />'; 
      } 
     }else{ 
      $message .= $count .'> Error:: Product with Sku (' . $_data[0] . ') does\'t exist.<br />'; 
     } 
     $count++; 
    } 
    echo $message; 

Répondre

1

Vous devez mettre la condition comme comme dit de DevZer0 dans les deux fonctions parce qu'ils sont tous deux appelés. Les lignes de codes à la fin seront d'abord appel _checkIfSkuExists($_data[0]), puis _updatePrices($_data) qui appelle $productId = _getIdFromSku($sku);

+0

J'ai essayé cela mais pour l'instant c'est 'WHERE sku =?' Alors je mets 'WHERE sku = '%?%'' Mais ne fonctionne pas encore. – KMW

+0

Vous devez changer 'WHERE sku =?' Dans 'WHERE sku LIKE? 'Puis ajouter une ligne au début de la fonction en faisant une transformation comme' $ sku = "%". $ sku. "%"; ' – Aleeeeee

+0

Je l'ai déjà fait fonctionner, mais il s'arrête après seulement un correspondant où il peut y avoir plusieurs par exemple. CSV avait '1234' Magenot a' 1234_01' et '1234_02' et' 1234_03' j'en ai besoin pour les mettre à jour avec les informations de la rangée dans le CSV avec '1234' avant de passer à la rangée suivante. En ce moment, il passe à la ligne suivante après chaque mise à jour au lieu de chercher plus. – KMW

2

si vous voulez faire correspondre la partie médiane seulement, utilisez %

$sql = "SELECT sku FROM table WHERE item LIKE '%$code%'"; 
+0

Je ne suis pas sûr où placer ce serait-il dans les deux fonctions '' _getIdFromSku' et _checkIfSkuExists'? – KMW

Questions connexes