0

条件が true の場合は magento で価格表を更新する必要があり、false の場合はスキップします。

問題は、関数 _checkIfSkuInStock がすべてに対して 1 を返す理由がわからないことです。

1 つの製品を在庫あり、もう 1 つの製品を在庫なしに設定します。

以下は、SKU が存在する場合に価格表を更新するコードです。製品が在庫にある場合は条件も追加し、そうでない場合はスキップします。

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 = 'special_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 _checkIfSkuInStock($sku){
    $connection = _getConnection('core_read');
    $sql        = "SELECT COUNT(*) AS count_no FROM " . _getTableName('cataloginventory_stock_item') . " WHERE is_in_stock = 1";
    $count      = $connection->fetchOne($sql, array($sku));
    if($count > 0){
        return true;
    }else{
        return false;
    }
}

function _updatePrices($data){
    $connection     = _getConnection('core_write');
    $sku            = $data[0];
    $newspecial_price       = $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($newspecial_price, $attributeId, $productId));
    }

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

    $message = '';
$count   = 1;
foreach($data as $_data){
    if(_checkIfSkuExists($_data[0]) and _checkIfSkuInStock($_data[0]) == 0){
        try{
            _updatePrices($_data);
            $message .= $count . '> Success:: (' . $_data[1] . ') product code  (' . $_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 code   (' . $_data[0] . ')  not in database<br />';
    }
    $count++;
}
echo $message;

どんな助けでも大歓迎です。

4

1 に答える 1

1

このコードでは:

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

}

sku を入力しようとしました: $connection->fetchOne($sql, array($sku)); しかし、リクエストに準備済みフィールド (?) がありません。

次のようなものを追加します。

"SELECT COUNT(*) AS count_no FROM " . _getTableName('cataloginventory_stock_item') . " WHERE is_in_stock = 1 AND product_id=?"

そして、使用します

$connection->fetchOne($sql, array($this->_getIdFromSku($sku)));

それはもっとうまくいくはずです;)

于 2013-02-28T13:16:23.217 に答える