4

次のスクリプトを使用してインベントリを更新しています。更新後、更新された値qtyが製品ページに設定されていないため、キャッシュを消去してデータのインデックスを再作成したいと考えています。これどうやってするの?

$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 _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 _getIdFromSku($sku){
    $connection = _getConnection('core_read');
    $sql        = "SELECT entity_id FROM " . _getTableName('catalog_product_entity') . " WHERE sku = ?";
    return $connection->fetchOne($sql, array($sku));
}

function _updateStocks($data){
    $connection     = _getConnection('core_write');
    $sku            = $data[0];
    $newQty         = $data[1];
    $productId      = _getIdFromSku($sku);
    $attributeId    = _getAttributeId();

    $sql            = "UPDATE " . _getTableName('cataloginventory_stock_item') . " csi,
                       " . _getTableName('cataloginventory_stock_status') . " css
                       SET
                       csi.qty = ?,
                       csi.is_in_stock = ?,
                       css.qty = ?,
                       css.stock_status = ?
                       WHERE
                       csi.product_id = ?
                       AND csi.product_id = css.product_id";
    $isInStock      = $newQty > 0 ? 1 : 0;
    $stockStatus    = $newQty > 0 ? 1 : 0;
    $connection->query($sql, array($newQty, $isInStock, $newQty, $stockStatus, $productId));
}
/***************** UTILITY FUNCTIONS ********************/

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

$message = '';
$count   = 1;
foreach($data as $_data){
    if(_checkIfSkuExists($_data[0])){
        try{
            _updateStocks($_data);
            $message .= $count . '> Success:: Qty (' . $_data[1] . ') of Sku (' . $_data[0] . ') has been updated. <br />';

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

これを試していますが、更新が非常に遅かったです。以前にこのスクリプトを実行しましたecho $message.

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('reindexAll');
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');
4

4 に答える 4

3

次のコードを使用してルートフォルダに1つのファイルを作成し、http://www.domain.com/indexing.phpなどのブラウザから実行します。

<?php

// when you get status "Processing" instead of "Ready" in your index management run    this script and it's working fine
 // change the index order as per your requirement currently it's 7 for Catalog Search Index  you can set as per your requirement

 require_once 'app/Mage.php';
 umask( 0 );
 Mage :: app( "default" );

 $indexingProcesses = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
 foreach ($indexingProcesses as $process) {
  $process->reindexEverything();
}

?>

または、このコードをコードに入れます

 $indexingProcesses = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
 foreach ($indexingProcesses as $process) {
  $process->reindexEverything();
}

これがあなたを助けるかもしれません!

于 2012-10-03T11:24:38.963 に答える
1

おそらく、cron (ヘルプ:リンク 1リンク 2リンク 3 ) を使用して/shell/indexer.php、適切と思われる時間に実行してください。

インデックス作成には時間がかかります。あなたが経験した更新の遅さは自然なことです。バックエンドからインデックスを更新するときも同じことが起こります。結局のところ、同じプロセスです。

セットアップで cron を動作させることに関しては、環境によって異なる可能性があるため、いくつかのチュートリアルを見つけることをお勧めします。

于 2012-10-03T09:27:59.433 に答える
0

与えられた回答は 2 つの有効な解決策です。ここでは、数千の製品を操作するときに興味深いものになる可能性のある 3 つ目の解決策を示します。

多くの製品がある場合、インデックスの再作成にかなりの時間がかかる場合があります。これを短縮する 2 つの方法があります。

  1. マグミインポーターを使用。最初の理由: スクリプトが行うことを行うことができ、magmi に置き換えることができます。私はmagento 1.7.0.2でそれを使用しています。2 番目の理由: url_rewrites および category_products インデックスを自動的に更新するオンザフライ インデクサーがあり、すべての製品を更新した場合でも、完全な再インデックスよりも高速です。

  2. Magento は個々の製品を再インデックス化できます。これは、特に増分インポートを行う場合に、完全な再インデックス化よりも高速です。私はproducts_price_indexのためにこれを行います

    Mage::app('admin')->setUseSessionInUrl(false);
    Mage::getConfig()->init();
    $product_indexer_price = Mage::getResourceSingleton('catalog/product_indexer_price');
    $product_indexer_price->reindexProductIds(array($this->m_products[$res['products_id']]));
    
于 2013-05-13T11:09:30.587 に答える
0

代わりにreindexEverything()から試す必要がありますMage_index_Model_Process

于 2012-10-03T09:23:11.213 に答える