제품 모델에서 특정 [사용자 정의] 제품 속성에 대한 값을 저장하는 방법


12

제품 모델에서 특정 [사용자 정의] 제품 속성에 대한 가치를 저장하는 방법은 무엇입니까?

아래 스크립트를 여기 에서 찾았습니다 .

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

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

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

답변:


32

이 작업을 수행하는 두 가지 방법이 있습니다. 하나는 Magento catalog/product모델 을 가져와 ID별로 제품을로드하여 전체 제품을 제공 한 다음 이름을 설정하고 저장하는 것입니다.

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

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

OP가 지적했듯이 하나의 속성을 변경하는 것만으로도 무겁습니다. 나는 속성 대량 업데이트 도구가 더 깔끔한 방법으로 이것을 수행하고 Mage_Catalog_Model_Resource_Product_Action클래스를 찾아야한다고 생각했습니다.

$product_id = 1;
$store_id = 0;

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

[업데이트] 벤치 마크

빠른 벤치 마크 스크립트도 마찬가지였으며 결과는 그 자체입니다.

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

시간 : 0.076527833938599 초

시간 : 4.757472038269 초


답장을 보내 주셔서 감사합니다. 그러나 위의 스크립트는 모델을로드 한 이후 더 많은 시간이 걸립니다.
Roney

코드를 업데이트했습니다
Sander Mangel

천만에요. 실제로 2 개의 가져 오기 스크립트로 이미 구현했으며 많은 시간을 절약합니다.
Sander Mangel

작은 질문 : 이것은 당신이 찾고있는 대답이 아니 었습니까? 알려주세요. 그렇다면, 우리의 답변 된 질문 속도를 유지하기 위해 질문을 닫으십시오 :)
Sander Mangel

11

하나의 속성 만 저장해야하고 이미 제품을로드 한 경우이 방법을 사용할 수도 있습니다.

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

이 방법은보다 훨씬 빠릅니다 catalog/resource_product_action


게시물을 최신 상태로 유지해 주셔서 감사합니다. 그러나 나는 이상한 행동을 봅니다. 이처럼 항상 저에게 최고의 시간을주었습니다. 그러나 최근 2 개의 Magento 인스턴스 EE 인스턴스에서 저장을 완료하는 데 시간이 걸립니다. 이 인스턴스의 확장으로 인한 것일 수 있습니다. 다른 문제는 생각할 수 없습니다. 이 Magento 인스턴스는 현재 로컬 개발 시스템에서 사용 중이며 아직 테스트 서버 인스턴스로 전송하지 않았습니다.
zapping

@Fra는 Sander가 실행 한 것과 동일한 벤치 마크를 실행해야합니다.
로비 애 버릴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.