1

我正在使用脚本从 CSV 更新 Magento 中的产品价格。

目前 CSV 中的 SKU 与 Magento 中的 SKU 不完全匹配。例如 CSV 中的一个可能,33456但在 Magento 中它将是003456_01or 003456_02。所以我需要脚本只匹配 SKU 的中间部分,所以如果 Magento 中有SKU00_01在 SKU 之后,它仍然会在移动到下一行之前更新它们与该 SKU 匹配的所有内容。

$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;
4

2 回答 2

2

如果您只想匹配中间部分,请使用%

$sql = "SELECT sku FROM table WHERE item LIKE '%$code%'";
于 2013-06-20T14:16:10.313 回答
1

您必须将 DevZer0 中所说的类似条件放在两个函数中,因为它们都被调用。最后的代码行将首先调用_checkIfSkuExists($_data[0]),然后_updatePrices($_data)调用哪个$productId = _getIdFromSku($sku);

于 2013-06-20T15:00:35.073 回答