我实际上可以通过设置脚本添加一个类别,但由于某些原因,某些字段无法正确设置。这是我的代码
$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表中设置了所有值的类别。 但是,即使我重新索引平面表,Flat表也会缺少displayMode,landingPage,pageLayout,customLayoutUpdate。
奇怪的是,如果我进入管理员,我可以看到所有这些字段都正确设置但是如果我进入我的前端,那么大部分字段都会被忽略。我将不得不去管理员,取消设置这些值并重置它们以使每个值正常工作。
另外请说我使用setEnabled(1),我的类别将在管理员中“启用”,但不会显示在前端。
PS:我已激活Flat Category,如果我禁用它似乎工作正常,但如果我重新索引它仍然无法正常工作。
答案 0 :(得分:10)
我终于找到了它,我不确定为什么但是这些字段没有正确显示,因为它们是为默认存储(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第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();
答案 1 :(得分:9)
通过数据安装脚本更新类别时遇到了同样的问题。 accepted answer中提供的解决方案确实可用于更新类别,但可以按如下方式进行改进:
我最终得到了以下用于更新类别的数据安装脚本(在此示例中,类别按名称加载,之后名称已更新):
<?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();
?>
答案 2 :(得分: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;
?>
答案 3 :(得分:-1)
看看这个。希望它会对你有所帮助。 <是/> http://inchoo.net/ecommerce/magento/how-to-add-new-custom-category-attribute-in-magento/
答案 4 :(得分:-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();