2014-01-13 32 views
0

我正在寫一個模塊,將從一個Magento實例中提取對象,如網站,組,類別和產品,序列化它們的屬性並將所有內容寫入文本文件,序列化和在另一臺服務器上。然後使用這些屬性以編程方式在新服務器上重新創建這些對象。我們的想法是,我們將能夠提取組成Magento網上商店的所有對象,並將它們移動到另一臺服務器。 (不,我們不希望將整個實例移動到另一臺服務器,我們只是希望能夠移動一個商店及其相關對象)。Magento:正確的方法來創建類別對象

顯然,由於我們在新服務器上創建類別,因此它們entity_id將會改變。我已經完成了這部分工作,並確保子類別具有正確的父級ID。直到我嘗試重新創建類別和子類別對象時,該項目一直很直接。我遇到各種各樣的問題。新的類別對象保存數據庫。但是,有時它們不會顯示在類別樹中,有時它們的parent_id會更改爲0,有時整個類別樹會消失。我一直在爲此工作大約一週。我已經讀過,您必須在保存之前將「路徑」屬性設置爲父路徑。我已經讀過,你必須使用「移動」方法將類別設置爲其父項的子項。有很多理論,但沒有人似乎有答案。

所以我的問題:你如何創建實際工作的類別和子類別記錄,是否正確鏈接到他們的父類別,在類別樹中顯示,並且不要啄住事物?我從存儲在名爲$ aryData()的數組中的原始源類別中獲得以下屬性。

[entity_id] => 127  //This usually changes on new server 
[parent_id] => 1   //Lookup NEW entity_id of parent and use it 
[path] =>    //Not sure how to properly set this. Tried a few things 
[position] => 8   //Leave this alone, hope for the best 
[children_count] => 0 //Have to zero this out when you create new category object 
[name] => Best Test  
[url_key] => best-test 
[is_active] => 1 
[include_in_menu] => 1 

這裏一般是我在做什麼,以簡化的方式:

$objNewCat = Mage::getModel('catalog/category'); //Create new object to populate 

$parent_id = getNewParent($data['name'], $data['url-key']; //Get new parent id by name and URL key. (This works) 
$objParentCat = Mage::getModel('catalog/category')->load($parent_id); 

$aryData(['parent_id']) = $parent_id; //Update parent ID in data array 
$aryData(['children_count']) = 0; //Must set to 0. Updated as children are added 


$objNewCat->setData($data); //Set all data parameters from our save array 
$objNewCat->setPath($objParentCat->getPath()); //Is this correct? Read you have to do this 
$objNewCat->save(); //Save object to populate entity_id field 

//--- Now assign object to be child of the parent. 
$objCat = Mage::getModel('catalog/category')->load($newCat->getId()); //reloading to set 'current category' 
Mage::unregister('category'); 
Mage::unregister('current_category'); 
Mage::register('category', $objCat); 
Mage::register('current_category', $objCat); 
$objCat->move($parent_id); 
$objCat->save(); 

是,一些這段代碼是那種粗糙。這是一個簡化的,我一直在嘗試很多事情來實現它的工作。這非常令人沮喪。幫助我Obi-Wan Knobi。你我唯一的希望。

回答

1

唐!我花了很多時間研究和解決這個問題。在互聯網上有許多關於這個問題的提法,但是到現在爲止還沒有人提出可靠的解決方案。

Magento使用對象模型來處理所有的數據庫I/O。這應該讓你不必做繁瑣的工作,比如更新相關領域。例如,如果您添加新的子類別,則Magento對象模型將自動更新父記錄中的'children_count'。 Magento對象模型基本上可以讓您關注自己希望編寫的數據,同時爲您管理家務。但是,當對象模型沒有做到應有的東西時,事情真的很糟糕。這是'parent_id'字段和'路徑'字段的情況。 Magento不會按照它應該的方式更新它們。

解決方法是通過對象模型進行所需的更改,保存對象,然後通過數據庫查詢強制更改'parent_id'和'path'的正確值。我發現'parent_id'和'path'字段似乎在第一次創建記錄時被正確保存,但是如果對象被更新,它們會變得混亂。此代碼假定您正在更新現有的類別對象。

$catId = 127; //ID of category record you wish to edit 
$objCat = Mage::getModel('catalog/category')->load($catId); 
if(!is_object($objCat)) { 
    throw new Exception("ERROR: Could not find category id: " .$catId); 
} 

//--- Make sure we have proper parent_id and path values 
$parentId = $objCatParent->getId(); 
$path = $objCatParent->getPath() ."/" .$objCat->getId(); 

$objCatParent = $objCat->getParentCategory(); //We will need this parent category 
$data = array('name'  => 'My Cool Category', 
       'parent_id => $parentId, 
       'path'  => $path; 
$objCat->addData($data); //Use 'addData' rather than 'setData' 
$objCat->save(); //Save to update record and break parent_id, path fields 

//--- Now we get a connection to the database, build a query, and update record 
$resource = Mage::getSingleton('core/resource'); 
$objCon = $resource->getConnection('core_write'); 
$tableName = "catalog_category_entity"; //Well, it's the name of the Category table 
$query = "UPDATE {$table} SET parent_id = {$parentId}, path = '{$path}' " 
     . " WHERE entity_id = " .$catId; 
$objCon->query($query); //Force proper values directly into table 

是的,是的,是的,你當你繞過對象模型和直接修改數據庫記錄要非常小心。但是,Magento對象模型在這裏似乎不起作用,所以我們沒有多少選擇。而且由於我們正在通過對象的'save()'方法保存記錄,所以它在做任何'幕後'工作之前都應該這樣做。我們正在糾正一個錯誤。

我希望這可以幫助你。這是一個棘手的問題。我希望有更好的解決方案,但是當他們修復API時,我將停止使用數據庫。對於那些會說第三個人回答自己的問題的人來說,我會說「哈!」

相關問題