Cách lưu giá trị cho Thuộc tính sản phẩm [tùy chỉnh] cụ thể từ Mô hình sản phẩm


12

Làm cách nào để lưu giá trị cho Thuộc tính sản phẩm [tùy chỉnh] cụ thể từ Mô hình sản phẩm?

Tôi đã tìm thấy đoạn script dưới đây từ đây :

$product = Mage::getModel('catalog/product')->load(1); 

$product->setName('Some Random Name'); 

$product->getResource()->saveAttribute($product, 'name');

Câu trả lời:


32

Có 2 cách để giải quyết vấn đề này, một là bằng cách lấy catalog/productmô hình Magento và tải sản phẩm bằng ID sẽ cung cấp cho bạn toàn bộ sản phẩm, sau đó đặt tên và lưu nó.

$product = Mage::getModel('catalog/product')->load(1);
$product->setName('foobar!');

try {
   $product->save();
} catch(Exception $e) {
  echo "{$e}";
}

Như OP đã chỉ ra, điều này khá nặng nề khi chỉ thay đổi một thuộc tính. Tôi hình dung rằng công cụ cập nhật hàng loạt thuộc tính nên sử dụng một cách sạch hơn để làm điều này và tìm thấy Mage_Catalog_Model_Resource_Product_Actionlớp

$product_id = 1;
$store_id = 0;

$action = Mage::getModel('catalog/resource_product_action');
$action->updateAttributes(array($product_id), array(
    'name' => 'foobar!'
), $store_id);

[CẬP NHẬT] điểm chuẩn

Một kịch bản điểm chuẩn nhanh chóng và kết quả đã nói lên điều đó.

$starttime = microtime(true);

for ($i=20; $i>0; $i--)
{
    $action = Mage::getModel('catalog/resource_product_action');
    $action->updateAttributes(array(1), array(
        'name' => 'foobar!'
    ), 0);
}

echo "Time: " . (microtime(true) - $starttime) . " seconds\n";

$starttime = microtime(true);

for ($i=20; $i>0; $i--)
{
    $product = Mage::getModel('catalog/product')->load(1);
    $product->setName('foobar!');
    $product->save();
    unset($product);
}

echo "Time: " . (microtime(true) - $starttime) . " seconds\n";

Thời gian: 0,076527833938599 giây

Thời gian: 4.757472038269 giây


Cảm ơn đã trả lời Nhưng tập lệnh trên mất nhiều thời gian hơn kể từ khi tải mô hình. Cảm ơn đã trả lời Nhưng tập lệnh trên mất nhiều thời gian hơn kể từ khi tải mô hình.
Roney

Tôi đã thực hiện cập nhật mã
Sander Mangel

Không có gì. Tôi thực sự đã thực hiện trong 2 tập lệnh nhập và nó tiết kiệm rất nhiều thời gian.
Sander Mangel

Câu hỏi nhỏ: đây không phải là câu trả lời bạn đang tìm kiếm? Nếu không cho tôi biết, nếu vậy hãy đóng câu hỏi để giữ tỷ lệ câu hỏi đã trả lời của chúng tôi :)
Sander Mangel

11

Nếu bạn chỉ cần lưu một thuộc tính và bạn đã tải sản phẩm, bạn cũng có thể sử dụng phương pháp này:

$product->setData('attribute_code',$someData);
$product->getResource()->saveAttribute($product,'attribute_code');

Phương pháp này nhanh hơn nhiều catalog/resource_product_action


Cảm ơn bạn cho bài viết và giữ cho nó cập nhật. Nhưng tôi thấy một hành vi kỳ lạ. Như tiết kiệm này luôn cho tôi thời gian tốt nhất. Nhưng gần đây trong 2 trường hợp Magento EE, điều này cũng mất thời gian để hoàn thành Lưu. Nó có thể là do một số phần mở rộng trên các trường hợp này. Tôi có thể nghĩ không có vấn đề khác. Các phiên bản Magento này hiện đang được bật bởi hệ thống dev cục bộ và chưa chuyển nó sang phiên bản máy chủ thử nghiệm.
hạ gục

@Fra bạn nên chạy cùng điểm chuẩn mà Sander đã chạy - sẽ là một so sánh tốt!
Robbie Averill
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.