Как добавить категорию в 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(); 

После запуска этого скрипта у меня есть категория, созданная со всем моим значением, установленным в таблице EAV. Однако Flat Table будет отсутствовать displayMode, landingPage, pageLayout, customLayoutUpdate, даже если я повторно индексирую плоскую таблицу.

Странно то, что если я пойду в админ, я могу правильно установить все эти поля, но если я пойду в своем интерфейсе, большинство этих полей будут проигнорированы. Мне нужно перейти к администратору, отключить эти значения и сбросить их, чтобы каждый из них работал правильно.

Также предположим, что я использую setEnabled (1), моя категория будет «включать» в админа, но не появится в интерфейсе.

PS: У меня есть категория категории активирована, если я отключу, она работает нормально, но если я повторно проиндексирую ее, она все еще не работает.

Я наконец нашел это, я не уверен, почему, но эти поля не отображаются должным образом, потому что они были вставлены для хранилища по умолчанию (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(); 

Я столкнулся с той же проблемой при обновлении категории с помощью сценария установки данных. Решение, принятое в принятом ответе, действительно работало для обновления категории, но может быть улучшено следующим образом:

  • В решении пользователь, запускающий сценарий обновления, вынужден в среду администратора. Это можно устранить, сохранив текущий идентификатор магазина и вернувшись в конец скрипта.
  • Похоже, что добавление 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(); ?> 

Попробуй это

 <?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; ?> по <?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

Взгляните на это. Надеюсь, это поможет вам.
http://inchoo.net/ecommerce/magento/how-to-add-new-custom-category-attribute-in-magento/

Я создал несколько категорий через скрипт установщика.

 <?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();