2010-12-03 3 views
8

현재 여러 제품을 magento로 가져올 수있는 스크립트를 작성 중입니다.Magento API : 새 제품을 추가 한 후 인덱스 다시 작성

$product = Mage::getModel('catalog/product'); 
$product->setSku($data['sku']); 
//etc etc 
$product->save(); 

제품은 완벽하게 작성되는하지만 나도 백엔드에 저장 때까지 (아무 것도 변경하지 않고!) 내 프론트 엔드에 표시되지 않습니다 또는 내가 백엔드에 인덱스를 다시 작성.

관련 데이터베이스 테이블에서 diff를 수행하여 제품을 저장하고 해당 필드를 가져 오기 스크립트에 추가했을 때 변경 사항을 확인했지만 아무런 효과가 없었습니다. 가져온 제품은 백엔드를 통해 인덱스를 수동으로 다시 빌드 할 때 나타나므로 확인해야합니다.

캐싱이 완전히 비활성화되어 있습니다.

제 질문은 : 제품을 가져온 후에 어떻게 인덱스를 다시 작성할 수 있습니까?

답변

34

색인 모듈에서 이러한 모델을 사용할 수 있습니다.

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
$processes->walk('reindexAll'); 

모든 색인을 다시 작성해야하므로 컬렉션에 적용된 필터가 없습니다. 그러나 addFieldToFilter($field, $condition) 방법을 통해 매개 변수 집합 (코드, 마지막 시간 재 인덱싱 등)을 기준으로 인덱스 프로세스 목록을 필터링 할 수 있습니다.

작은 제안이

그래서, 그들 중 일부는 이벤트를 절약 제품을 관찰하기 때문에, 당신은 제품을 가져 오는 동안, 당신이 가져 오기 프로세스를 가속화하는 데 도움이 될 것입니다 수동 모드로 인덱스를 설정하는 것이 좋을 것 걸리는 언젠가는. 다음과 같이 할 수 있습니다.

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL)); 
$processes->walk('save'); 
// Here goes your 
// Importing process 
// ................ 
$processes->walk('reindexAll'); 
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME)); 
$processes->walk('save'); 
+0

그건 훌륭하고 잘 작동합니다! 고맙습니다! – Alex

+0

멋진 스 니펫, 감사합니다. Ivan. 느린 수입은 Magento에 대한 공통적 인 불만입니다. 개선 방법을 알면 좋습니다! –

+0

정말 대단한 발췌 문장. 내 수입은 3/4의 속도로 빨라졌습니다! 고맙습니다! –

4

인덱서가 제품을 저장할 때 색인을 다시 생성하지 못하게하는 최소한 두 가지 경우가 있습니다.

1 : 시스템, 색인 관리에서 찾을 수있는 색인 속성의 "수동 업데이트"설정. 저장시 제품의 색인을 생성하려면 "저장시 업데이트"로 설정해야합니다.

Two : 예를 들어 DataFlow 일괄 가져 오기 절차에서 사용되는 setIsMassupdate 제품 플래그는 각 제품 저장 메서드 호출시 인덱서가 트리거되지 않도록합니다.

희망이 도움이됩니다. 감사합니다, Alessandro

관련 문제