如何通过安装脚本向Magento添加类别?

时间:2012-09-12 01:07:29

标签: php 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表中设置了所有值的类别。 但是,即使我重新索引平面表,Flat表也会缺少displayMode,landingPage,pageLayout,customLayoutUpdate。

奇怪的是,如果我进入管理员,我可以看到所有这些字段都正确设置但是如果我进入我的前端,那么大部分字段都会被忽略。我将不得不去管理员,取消设置这些值并重置它们以使每个值正常工作。

另外请说我使用setEnabled(1),我的类别将在管理员中“启用”,但不会显示在前端。

PS:我已激活Flat Category,如果我禁用它似乎工作正常,但如果我重新索引它仍然无法正常工作。

5 个答案:

答案 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中提供的解决方案确实可用于更新类别,但可以按如下方式进行改进:

  • 在解决方案中,触发更新脚本的用户被强制进入管理环境。这可以通过保存当前商店ID并在脚本末尾切换回来来解决。
  • 似乎没有将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();
?>

答案 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;

?>

还可以查看Magento create category

答案 3 :(得分:-1)

答案 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();