2012-09-12 6 views
5

De hecho, puedo agregar una categoría a través de la secuencia de comandos de configuración; por algún motivo, algunos de los campos no se configuran correctamente. He aquí es mi código¿Cómo agregar una categoría a Magento mediante el script de configuración?

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

Después de ejecutar este script, tengo una categoría creada con todo el valor establecido en la tabla Eavs. Sin embargo, en la tabla plana faltarán displayMode, landingPage, pageLayout, customLayoutUpdate incluso si vuelvo a indexar la tabla plana.

Lo extraño es que si entro en el administrador, puedo ver todos los campos correctamente configurados, pero si voy a mi interfaz la mayoría de esos campos se ignoran. Tendré que recurrir al administrador, deshacer esos valores y restablecerlos para que cada uno de ellos funcione correctamente.

También decir que utilizo setEnabled (1), mi categoría será "habilitar" en el administrador pero no aparecerá en la interfaz.

PD: tengo la Categoría plana activada, si la desactivo parece funcionar bien, pero si la vuelvo a indexar, todavía no funciona.

+0

Hasta ahora creo que pude descubrir que estaba relacionado con las tablas planas. Si los desactivo, mis categorías funcionarán correctamente. – zzarbi

Respuesta

9

Finalmente lo encontré, no estoy seguro de por qué, pero estos campos no se muestran correctamente, ya que se insertaron para el almacenamiento predeterminado (storeId = 1) porque mi script se ejecuta en un script de actualización. Es necesario utilizar el StoreID 0.

Con esta información se podría pensar que la solución sería algo así como:

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

Pero este código no funciona bien. De hecho, después de investigar Mage :: app() (Mage_Core_Model_App Line 804) noté una condición IF que siempre devolvería la tienda predeterminada si está en una secuencia de comandos de instalación.

El truco es falso que no estás en una secuencia de comandos de configuración, mi solución de trabajo es:

$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(); 
+4

eso se debe a que está utilizando un script de actualización para algo que debe colocar dentro de un script de actualización de datos (la creación de una categoría es DML no DDL). Si está utilizando un instalador de datos, no necesita ese truco – Enrique

+0

¡Eso es interesante! Voy a investigar eso. – zzarbi

+0

Wow, has resuelto mi problema. Muchas gracias :) – zuzuleinen

-1
+0

Esto es para agregar un atributo personalizado en una categoría – zzarbi

+0

¡Uy! mi error. este debería ser el elegido. http://www.sonassi.com/knowledge-base/quick-script-batch-create-magento-categories/ –

+0

Intenté eso también, y tengo el mismo efecto. En realidad, incluso copio/pegué la lógica del controlador de administración que guarda las categorías y aún no funciona. – zzarbi

1

Prueba este

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

?> 

Y también tener una mirada Magento create category

+0

Sí, podría usar Magento SOAP API pero prefiero no. – zzarbi

9

me encontré con el mismo problema al actualizar una categoría de datos a través de un script de instalación. La solución proporcionada en el accepted answer funcionaba para la actualización de la categoría, pero puede ser mejorado de la siguiente manera:

  • En la solución, el usuario que activa el script de actualización es forzado al entorno de administración. Esto puede remediarse guardando la identificación de la tienda actual y volviendo al final de la secuencia de comandos.
  • No parece que la adición de isSecureArea al registro o la desactivación del modo de actualización haya tenido algún uso (al menos para el caso de uso de la actualización de una categoría).

que terminó con los datos siguientes script de instalación para actualizar una categoría (en este ejemplo, una categoría se carga por su nombre, después de lo cual el nombre se actualiza):

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

que han creado múltiples categorías a través del script del instalador.

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