2012-09-12 113 views
5

我實際上可以通過安裝腳本添加一個類別,但是由於某些原因,某些字段沒有正確設置。這裏是我的代碼如何通過安裝腳本添加類別到Magento?

$this->startSetup(); 
Mage::register('isSecureArea', 1); 

$category = Mage::getModel('catalog/category'); 
$category->setPath('1/2') // set parent to be root category 
    ->setName('Category Name') 
    ->setUrlKey('category-name') 
    ->setIsActive(0) 
    ->setIncludeInMenu(1) 
    ->setInfinitescroll(1) 
    ->setDisplayMode('PAGE') 
    ->setLandingPage($idToCmsBlock) 
    ->setPageLayout('anotherLayoutThanDefault') 
    ->setCustomUseParentSettings(0) 
    ->setCustomLayoutUpdate('<reference name="head"><action method="addCss"><stylesheet>css/somecss.css</stylesheet></action></reference>') 
->save(); 
$this->endSetup(); 

運行此腳本後,我有一個使用EAVs表中設置的所有值創建的類別。 但是,即使我重新編制扁平表,扁平表也會缺少displayMode,landingPage,pageLayout,customLayoutUpdate。

奇怪的是,如果我去管理員,我可以看到所有這些領域正確設置,但如果我在我的前臺去大多數這些領域被忽略。我將不得不去管理員,取消這些價值,並重新設置他們爲每個人正常工作。

也讓我說我使用setEnabled(1),我的類別將在管理中「啓用」,但不顯示在前端。

PS:我有平面類別激活,如果我禁用它似乎工作正常,但如果我重新索引它仍然無法正常工作。

+0

到目前爲止,我認爲我能夠發現它與平板電腦有關。如果我禁用他們,我的類別將正常工作。 – zzarbi

回答

9

我終於找到了,我不知道爲什麼,但這些字段沒有正確顯示出來,因爲他們被插入默認存儲(storeId = 1),因爲我的腳本正在更新腳本中運行。您需要使用STOREID 0

有了這些信息,你會認爲,解決辦法是這樣的:

$this->startSetup(); 
Mage::register('isSecureArea', 1); 

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 

$category = Mage::getModel('catalog/category'); 
$category->setPath('1/2') // set parent to be root category 
    ->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID) 
    ->setName('Category Name') 
    ... 
    ->save(); 
$this->endSetup(); 

但這種代碼也不起作用。事實上,在研究Mage :: app()(Mage_Core_Model_App Line 804)後,我注意到一個IF條件,如果您在設置腳本中,它總是會返回默認存儲。

訣竅是假的,你在安裝腳本不是,我的工作的解決方案是:

$this->startSetup(); 
Mage::register('isSecureArea', 1); 

// Force the store to be admin 
Mage::app()->setUpdateMode(false); 
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 

$category = Mage::getModel('catalog/category'); 
$category->setPath('1/2') // set parent to be root category 
    ->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID) 
    ->setName('Category Name') 
    ... 
    ->save(); 
$this->endSetup(); 
+4

這是因爲您正在使用升級腳本來處理您應該放入數據升級腳本(創建類別爲DML而非DDL)的內容。如果您使用的是數據安裝程序,則不需要進行破解 – Enrique

+0

這很有趣!我會研究這一點。 – zzarbi

+0

哇,你解決了我的問題。非常感謝 :) – zuzuleinen

-1
+0

這是在類別 – zzarbi

+0

oops中添加自定義屬性。我的錯。這應該是一個。 http://www.sonassi.com/knowledge-base/quick-script-batch-create-magento-categories/ –

+0

我也嘗試過,我也有同樣的效果。其實我甚至複製/粘貼保存類別的管理控制器的邏輯,它仍然無法正常工作。 – zzarbi

1

試試這個

<?php 
require_once "../app/Mage.php"; 
umask(0); 
Mage::app('default'); 
$proxy = new SoapClient("http://127.0.0.1/magento/index.php/api/soap/?wsdl"); 
$sessionId = $proxy->login($magento_webservices_username, $magento_webservices_passwd); 

$data = array('name'=>'Nokia', 
      'description'=>'', 
      'meta_description'=>'', 
      'meta_keywords'=>'', 
      'default_sort_by'=>'price', 
      'available_sort_by'=>'price', 
      'is_active'=>1 
); 
$newCategoryId = $proxy->call($sessionId, 'category.create', array(3, $data, 1)); 
echo "Category ID: ".$newCategoryId; 

?> 

而且也看看Magento create category

+0

是的,我可以使用Magento SOAP API,但我不喜歡。 – zzarbi

9

我通過更新數據的類別時,安裝腳本遇到了同樣的問題。在accepted answer提供的解決方案並更新類的工作,但如下可以改進:

  • 在上述方案中,觸發更新腳本被強制到管理環境中的用戶。這可以通過保存當前商店標識並在腳本結尾切換回來進行修復。
  • 似乎並未將isSecureArea添加到註冊表中,或者禁用更新模式有任何用處(至少對於更新類別的用例)。

我結束了以下數據安裝腳本更新類別(在這個例子中,一類是按名稱加載,名稱更新後):

<?php 
    $this->startSetup(); 

    //Switch to admin store (workaround to successfully save a category) 
    $originalStoreId = Mage::app()->getStore()->getId(); 
    Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 

    //update category 
    $category = Mage::getModel('catalog/category') 
     ->loadByAttribute('name', 'OLD_CATEGORY_NAME'); 
    if ($category) { 
     $category 
      ->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID) 
      ->setName('NEW_CATEGORY_NAME') 
      ->save(); 
    } 

    //Set store to original value 
    Mage::app()->setCurrentStore($originalStoreId); 

    $this->endSetup(); 
?> 
-1

我創建了多個通過安裝程序腳本分類。

<?php 
$installer = $this; 
$installer->startSetup(); 

Mage::register('isSecureArea', 1); 

$category = Mage::getModel('catalog/category'); 
$category->setPath('1/2/4') // set parent to be root category 
->setName('CAT NAME') //Category Name 
->setIsActive(1) // Category Status 
->setIncludeInMenu(1) // Show in Menu 
->setIsAnchor(1) // used for Layered navigation 
->setDisplayMode('PAGE') // Product Only 
->setPageLayout('one_column') // Page layout 
->save(); 

$installer->endSetup(); 
相關問題