Categorie
Blog

Creare le categorie in modo automatico

Ciao a tutti.
in questo articolo vi mostrerò come creare una categoria prodotto all’interno di magento con del semplice codice php. Come ogni modifica ed estensione iniziate creando un modulo pulito in modo da contenere un Helper che potrete richiamare in qualunque modo.
Le domande che mi sono posto prima di creare questo codice di inserimento categorie sono le seguenti:

    Come si fa a creare le categorie con il codice magento?

      “Solitamente” in che modo i clienti mi forniscono la lista delle categorie?

        Sembrerà strano, ma ho trovato una grande difficoltà a rispondere alla seconda domanda; questo perchè ogni cliente fornisce le categorie in un modo “unico”: chi le fornisce assieme ai prodotti, chi le fornisce in un excel, chi le fornisce in modo sbagliato e chi non le fornisce.

        Ho pensato quindi di fare un po’ di chiarezza e di impostare delle regole.

        La prima regola è stabilire il formato delle nostre categorie in input.

        Il formato sarà il seguente:

        • un array di stringhe ognuna delle quali rappresenta una categoria
        • ogni stringa rappresenta il path di una categoria
        • la divisione tra padre e figlio (relazione tra categorie) viene fatta attraverso un carattere separatore, in questo caso “|”

        Faccio un esempio di 4 categorie:

        [sourcecode language=”php”]
        $categoriesList = array(
        "categoria padre1",
        "categoria padre1|sottocategoria1",
        "categoria padre1|sottocategoria2",
        "categoria padre1|sottocategoria1|sotto_sottocategoria1",
        );
        [/sourcecode]

        Questo array è l’array delle nostre future categorie nel nostro ecommerce. Come potete notare il formato è molto semplice, è un elenco che stabilisce le relazioni tra categorie padri e figli.

        Passiamo adesso al codice che inserisce una singola categoria:

        [sourcecode language=”php”]
        public function createCategory($name, $parentId) {
        Mage::log("createCategory method ".$name."-".$parentId);
        $category = Mage::getModel(‘catalog/category’);
        $parentId_load = $parentId;
        //imposta il tuo corretto default store id
        $category->setStoreId(0);
        if ($parentId == NULL)
        $parentId_load = Mage::app()->getStore(1)->getRootCategoryId();
        $parentCategory = Mage::getModel(‘catalog/category’)->load($parentId_load);
        //Controllo se la categoria esiste
        $subcats = $parentCategory->getAllChildren();
        $subcats_array = array();
        if ($subcats != "") {
        $subcats_array = explode(",", $subcats); $subcats = $parentCategory->getAllChildren();
        }
        foreach ($subcats_array as $_subcat) {
        if ($name == Mage::getModel(‘catalog/category’)->load($_subcat)->getName()) {
        return $_subcat;
        }
        }

        $category->setParentId($parentId_load);
        $category->setPath($parentCategory->getPath());
        $category->setName($name);
        $category->setIsActive(1);
        $category->setDysplayMode("PRODUCTS");
        $category->setIsAnchor(1);
        $category->setPosition(100);
        $category->save();
        return $category->getId();
        }
        [/sourcecode]

        Questo metodo crea una categoria se non esiste e ritorna l’id in ogni caso. Come parametri prende il nome della categoria ex: “category1” (nome alcun separatore “|”, l’array precedente lo utilizzeremo in seguito) ed l’id della sua categoria padre (se l’id del padre è nullo allora è una categoria di primo livello).

        Adesso che sappiamo creare una categoria andiamo a vedere come possiamo utilizzare l’array di categorie per crearle tutte assieme in una volta.
        Il metodo si chiamerà createCategories e prenderà in input l’array $categoriesList creato in precedenza.

        [sourcecode language=”php”]
        public function createCategories($categoriesList) {
        Mage::log("CreateCategories method");
        $lastCategory = null;
        foreach ($categoriesList as $category) {
        // il parametro 4 fa si che sia abbiano fino ad un massimo di 3 sottocategorie
        $cat_array = explode(Static_Data::$category_char_separator, $category, 4);
        if (isset($cat_array[0])) {
        $root_cat = trim($cat_array[0]);
        } else {
        $root_cat = null;
        }

        if (isset($cat_array[1])) {
        $sub_cat = trim($cat_array[1]);
        } else {
        $sub_cat = null;
        }

        if (isset($cat_array[2])) {
        $sub_sub_cat = trim($cat_array[2]);
        } else {
        $sub_sub_cat = null;
        }

        if (isset($cat_array[3])) {
        $sub_sub_sub_cat = trim($cat_array[3]);
        } else {
        $sub_sub_sub_cat = null;
        }

        if ($root_cat != null && $root_cat != "") {
        $root_cat_id = $this->createCategory($root_cat, null);
        $lastCategory = $root_cat_id;
        } else {
        echo "No root category at line: " . $category;
        continue;
        }

        if ($sub_cat != null && $sub_cat != "") {
        $sub_cat_id = $this->createCategory($sub_cat, $root_cat_id);
        $lastCategory = $sub_cat_id;
        } else {
        continue;
        }

        if ($sub_sub_cat != null && $sub_sub_cat != "") {
        $sub_sub_cat_id = $this->createCategory($sub_sub_cat, $sub_cat_id);
        $lastCategory = $sub_sub_cat_id;
        } else {
        continue;
        }

        if ($sub_sub_sub_cat != null && $sub_sub_sub_cat != "") {
        $sub_sub_sub_cat_id = $this->createCategory($sub_sub_sub_cat, $sub_sub_cat_id);
        $lastCategory = $sub_sub_sub_cat_id;
        } else {
        continue;
        }
        }
        return $lastCategory;
        }
        [/sourcecode]

        Questo è tutto, il metodo prende l’array, fa un semplice parsing delle categorie e le inserisce.
        Il metodo è stato testato in un magento 1.5.1.
        Nel prossimo articolo vi mostrerò come riuscire a passa un file csv dal backend di magento a questo nostro metodo in modo da creare un importatore custom di categorie.
        Alla prossima!