2014-07-03 16 views
6

Sono un novizio in Magento. Fondamentalmente, voglio assegnare più prodotti a più categorie. Ho seguito this post e ho fatto il seguente codice che sta lavorando bene:Come assegnare categorie per i prodotti in magento Programmaticamente

$collection = Mage::getModel('catalog/product')->getCollection();//my coustom collection 
     $categorys_ids = array(1,2,3,4,5);//Array of ids etc 
     if ($categorys_ids != NULL && $collection->getData()!= NULL) 
      { 
       foreach ($collection as $product) 
       { 
         $categories_pd = $product->getCategoryIds();        
         $product->setCategoryIds(array_merge($product->getCategoryIds(),array($categorys_ids))); 
         $product->save(); 
       } 
      } 

Ora, il problema principale è che quando ho assegnare Set Categoria id per i prodotti che ci vuole un sacco di tempo. Ho 200 prodotti e questo richiede circa due minuti, il che è molto tempo.

Mi chiedevo se esiste un modo per assegnare categorie a un array di prodotti anziché assegnare prodotti a categorie o qualcosa che può essere ottimizzato e richiedere meno tempo.

risposta

8

Ecco come è possibile assegnare più prodotti a una categoria e unire con i prodotti esistenti.
L'esempio è per una categoria ma è possibile trasformarlo in un ciclo per farlo funzionare di più.

$categoryId = 6; 
$category = Mage::getModel('catalog/category')->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID)->load($categoryId); 
//get the current products 
$products = $category->getProductsPosition(); 
//now attach the other products. 
$newProductIds = array(1,2,3,4,5); 
foreach ($newProductIds as $id){ 
    $products[$id] = 1;//you can put any other position number instead of 1. 
} 
//attach all the products to the category 
$category->setPostedProducts($products); 
//save the category. 
$category->save(); 

Se vuoi un modo ancora più veloce di farlo è possibile eseguire inserimenti diretti nella tabella catalog_category_product.
Assicurati di reindicizzare quando hai finito.

+0

grazie marius. Ho avuto l'idea, :) –

0

Ecco come ho fatto, l'utilizzo di alcune funzioni di gestione serie veloci da versioni di PHP più recenti:

<?php 
require_once '../../app/Mage.php'; 
Mage::app(); 
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); 
$storeCode = Mage::app()->getStore()->getStoreId(); 

function addProductsToCategoryId($mergeProductIds, $categoryId, $storeCode) { 
    // load the $category by $categoryId 
    $category = Mage::getModel('catalog/category')->setStoreId($storeCode)->load($categoryId); 
    // build a flipped array of two merged arrays (1) array keys from flipped $mergeProductIds, (2) array keys from product_id keyed array in $category 
    $categoryProductIds = array_flip(array_merge(array_keys(array_flip($mergeProductIds)),array_keys($category->getProductsPosition()))); 
    // combine array_keys from resulting merge with a matched index array filled with '0' 
    // THIS resets position of product within category, change this logic if desired 
    $categoryProductIds = array_combine(array_keys($categoryProductIds), array_fill(0, count($categoryProductIds), '0')); 

    $category->setPostedProducts($categoryProductIds); 
    $category->save(); 

    // optional 
    // return $categoryProductIds; 
} 

// optional array of category IDs to test against for nin (not in) or in a find_in_set array test 
// in the optional example line below, nin (not in) is used 
$categoryIds = array(5,8,9,10,11,12,45,46); 

$collectionIds = Mage::getModel('catalog/product')->getCollection() 
    ->setStoreId($storeCode) 
    // optional inclusion of join for category_id 
    ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left') 
    // optional logic to only gather ids that are, or are not in a given categoryIds array, nin (not in) is shown in example 
    // ->addAttributeToFilter('category_id', array('nin' => array('finset' => $categoryIds))) 
    // optional line to test whether product is associated to ANY category 
    ->addAttributeToFilter('category_id', array('null' => true)) 
    // example qualifiers to affect gathered IDs 
    ->addAttributeToFilter('sku', array('like' => 'M-H%')) 
    ->addAttributeToFilter('sku', array('nlike' => '%E')) 
    ->addAttributeToFilter('sku', array('nlike' => '%E#')) 
    ->addAttributeToFilter('sku', array('nlike' => '%Euro')) 
    ->addAttributeToFilter('sku', array('nlike' => '%Euro#')) 
    ->getAllIds() 
    ; 

// if using a return value, you can set the results of this to a variable 
// to perform further operations against the resulting data 
addProductsToCategoryId($collectionIds, 8, $storeCode); 

Si prega di notare, per impostazione predefinita il mio metodo non conserva tutte le posizioni per i prodotti all'interno delle categorie che si era prefissata. RIMETTERÀ tutte le posizioni su un valore predefinito di '0'.

Funziona magnificamente. Richiede un reindex dopo l'aggiunta rapida di massa. Il codice è un po 'complesso, quindi spiegare il codice in commenti contestuali diretti mi sembrava più sensato in questo caso.

Ho incluso molti extra facoltativi qui, ma sono tutti contrassegnati come tali e spiegati completamente.

0

Il seguente codice ha lavorato per me:

include '../../app/Mage.php'; 
Mage::app('admin'); 
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 

$product_id = Mage::getModel("catalog/product")->getIdBySku($sku); 
$product = Mage::getModel('catalog/product')->load($product_id); 
$product->setCategoryIds($category_id); 
$product->save(); 
Problemi correlati