Sep 25, 2013
48 Views

[Magento] Cập nhật nhanh sản phẩm qua file csv

Written by

Giá thành sản phẩm dù được cập nhật thông qua hồ sơ cá nhân nhập khẩu mặc định mặc nhưng điều này là rất chậm và đòi hỏi rất nhiều fields csv (ngoài sku và prices) để có thể cập nhật.
Hôm nay tôi sẽ nói chuyện về việc cập nhật giá sản phẩm chỉ bằng cách sử dụng csv với hai fiefds: sku giá (mới) mà là rất nhanh đủ ngay cả đối với hàng ngàn sản phẩm. Các bước thực hiện:

1> Chuẩn bị tập tin CSV (prices.csv) với hai fields: sku và price và tải lên trong thư mục gốc của Magento installation.
với 2 cột
sku             price
sku11         30000
sku134       50000
Lưu ý: Field / giá trị nên được kèm theo trong dấu ngoặc kép (“) và cách nhau bằng một dấu phẩy (,). Tôi muốn OpenOffice cho định dạng csv.
2> Tạo một tập tin: update_prices.php trong thư mục gốc của magento installation và dán đoạn mã sau:

$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('prices.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] . ').
';

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

 

3> Mở trình duyệt của bạn và chạy các url sau đây:

http://your-magento-url/update_prices.php

Bạn sẽ thấy giá của SKU tương ứng được cập nhật nhanh như thế nào.
Tôi đã thử nghiệm với 2000 proudcts và cập nhật được thực hiện trong vòng vài giây.

Article Tags:
Article Categories:
Code/Web
    http://linholiver.com

    https://linholiver.com/diary/about/