Скоро ни се наложи да изработим онлайн магазин с Magento с над 400 категории. Създаването на толкова категории ръчно е доста китайски труд. За целта използвахме скрипт, с който динамично създадохме всички категории.

1. Създайте CSV файл, например catsImport.csv със следната структура:

categoryID, categoryName
————————
6, Принтери
7, Тонери
8, Мастила

и т.н.

Качете CSV файла в папката var/import на вашата Magento инсталация. Ако папката не съществува, създайте я и не забравяйте chmod 777.

2. Използвайте този скрипт, за импорт на категориите от CSV файла:

<?php

	define('MAGENTO', realpath(dirname(__FILE__)));
	require_once MAGENTO . '/app/Mage.php';

	umask(0);
	Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
        $count = 0;

	$file = fopen('./var/import/catsImport.csv', 'r');
	while (($line = fgetcsv($file)) !== FALSE) { $count++;
	  //$line is an array of the csv elements

	  if (!empty($line[0]) && !empty($line[1])) {

		  $data['general']['path'] = $line[0];
		  $data['general']['name'] = $line[1];
		  $data['general']['meta_title'] = "";
		  $data['general']['meta_description'] = "";
		  $data['general']['is_active'] = "";
		  $data['general']['url_key'] = "";
		  $data['general']['display_mode'] = "PRODUCTS";
		  $data['general']['is_anchor'] = 0;

		  $data['category']['parent'] = $line[0]; // 3 top level
		  $storeId = 0;

		  createCategory($data,$storeId);
		  sleep(0.5);
		  unset($data);
		}

	}

  function createCategory($data,$storeId) {

  	echo "Starting {$data['general']['name']} [{$data['category']['parent']}] ...";

      $category = Mage::getModel('catalog/category');
      $category->setStoreId($storeId);

      # Fix must be applied to run script
      #http://www.magentocommerce.com/boards/appserv/main.php/viewreply/157328/

		  if (is_array($data)) {
		      $category->addData($data['general']);

		      if (!$category->getId()) {

		          $parentId = $data['category']['parent'];
		          if (!$parentId) {
		              if ($storeId) {
		                  $parentId = Mage::app()->getStore($storeId)->getRootCategoryId();
		              }
		              else {
		                  $parentId = Mage_Catalog_Model_Category::TREE_ROOT_ID;
		              }
		          }
		          $parentCategory = Mage::getModel('catalog/category')->load($parentId);
		          $category->setPath($parentCategory->getPath());

		      }

					/**
					 * Check "Use Default Value" checkboxes values
					 */
					if ($useDefaults = $data['use_default']) {
					    foreach ($useDefaults as $attributeCode) {
					        $category->setData($attributeCode, null);
					    }
					}

		      $category->setAttributeSetId($category->getDefaultAttributeSetId());

		      if (isset($data['category_products']) &&
		          !$category->getProductsReadonly()) {
		          $products = array();
		          parse_str($data['category_products'], $products);
		          $category->setPostedProducts($products);
		      }

		      try {
		          $category->save();
		          echo "Suceeded <br /> ";
		      }
		      catch (Exception $e){
		      		echo "Failed <br />";

		      }
		  }

  }

Запазете файла като QuickCreateCats.php в главната директория на инсталацията и го изпълнете през браузъра.

По подразбиране новосъздадените категории са неактивни, ако искате категориите да бъдат активирани при създаването им, променете:

$data['general']['is_active'] = "";

на

$data['general']['is_active'] = "1";

Съветваме ви да не използвате скрипта на „жив“ магазин, винаги първо изпробвайте на тестова инсталация. Също така е добре да проверите вече наличните категории, като използвате скрипта за Експорт на категории в Magento с техните ID-та.

Поради малък бъг в оригиналния код на Magento, ето един бърз фикс в:

./app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Category.php line #110

protected function _getTree()
{
//if (!$this->_tree) {
$this->_tree = Mage::getResourceModel(‘catalog/category_tree’)
->load();
//}
return $this->_tree;
}

Успех!