2012-01-18 5 views
7

Quiero agregar un nuevo atributo de producto que presente una lista desplegable con todas las páginas de CMS como sus opciones. Creé una extensión y quería agregar este atributo a través del script de instalación. pero después de la ejecución de este, Magento dañado la tabla eav_entity_type ...Magento: atributo de producto personalizado para seleccionar una página de CMS

Lo he intentado hasta ahora:

MySQL4-instalación-0.1.0.php:

$installer = $this; 

$setup = new Mage_Eav_Model_Entity_Setup('core_setup'); 

$installer->startSetup(); 

$setup->addAttribute('catalog_product', 'test_report', array(
    'label' => 'Test report', 
    'required' => false, 
    'input' => 'select', 
    'source' => 'cmspageselect/entity_source', 
    'default' => 'none', 
    'position' => 1, 
    'sort_order' => 3, 
)); 

$installer->endSetup(); 

Fuente de cmspageselect/clase entity_source:

class Mandarin_CMSPageSelect_Model_Source extends Mage_Eav_Model_Entity_Attribute_Source_Abstract { 
    /** 
    * Retrieve Full Option values array 
    * 
    * @param bool $withEmpty  Add empty option to array 
    * @return array 
    */ 
    public function getAllOptions($withEmpty = true) 
    { 
     $storeId = $this->getAttribute()->getStoreId(); 
     if (!is_array($this->_options)) { 
      $this->_options = array(); 
     } 
     if (!isset($this->_options[$storeId])) { 
      $collection = Mage::getResourceModel('cms/page_collection') 
       ->setPositionOrder('asc') 
       ->setStoreFilter($this->getAttribute()->getStoreId()) 
       ->load(); 
      $this->_options[$storeId] = $collection->toOptionIdArray(); 
     } 

     $options = $this->_options[$storeId]; 
     if ($withEmpty) { 
      array_unshift($options, array('label' => '', 'value' => '')); 
     } 

     return $options; 
    } 

    /** 
    * Get a text for option value 
    * 
    * @param string|integer $value 
    * @return string 
    */ 
    public function getOptionText($value) 
    { 
     $isMultiple = false; 
     if (strpos($value, ',')) { 
      $isMultiple = true; 
      $value = explode(',', $value); 
     } 

     $options = $this->getAllOptions(false); 

     if ($isMultiple) { 
      $values = array(); 
      foreach ($options as $item) { 
       if (in_array($item['value'], $value)) { 
        $values[] = $item['label']; 
       } 
      } 
      return $values; 
     } 

     foreach ($options as $item) { 
      if ($item['value'] == $value) { 
       return $item['label']; 
      } 
     } 
     return false; 
    } 
} 

Como ya he dicho, en lugar de crear el nuevo "test_report" atributo, Magento simplemente corrompió la eav_entity_type ta ble. No hubo mensaje de error ni entrada de registro sobre lo sucedido.

¿Cómo puedo crear dicho atributo?

Gracias, AENO

+0

¿Puede proporcionar su código fuente para la clase cmspageselect/entity_source? –

+0

He editado la pregunta para incluir la fuente – aeno

+0

¿Cómo está determinando que la tabla está dañada? –

Respuesta

4

La clase $installer sí mismo debería ser capaz de añadir el atributo, no creo que necesita para cargar la clase Entity_Setup.

$installer = $this; 
$installer->startSetup(); 

$installer->addAttribute('catalog_product', 'test_report', array(
    'label' => 'Test report', 
    'required' => false, 
    'input' => 'select', 
    'source' => 'cmspageselect/entity_source', 
    'default' => 'none', 
    'position' => 1, 
    'sort_order' => 3, 
)); 

$installer->endSetup(); 

Aparte de eso creo que su valor de origen es incorrecta, a juzgar por el elemento de origen en la matriz, debe ser el nombramiento de su modelo de Mandarin_CMSPageSelect_Model_Entity_Source. Supongo que ha agregado el elemento <models> apropiado en config.xml, para decirle a Magento de dónde cargar su modelo.

+0

Gracias por su respuesta, Cajas. Pero eso no funciona. Cuando uso su código, obtengo 'Llamar al método indefinido Mage_Core_Model_Resource_Setup :: addAttribute()'. Incluso cambié el nombre de mi modelo fuente como usted señaló. – aeno

+0

Al usar $ setup-> addAttribute() finalmente funcionó. Tuve que modificar un poco mi modelo fuente, porque setPositionOrder() y setStoreFilter() no se pueden usar en cms/page_collection. – aeno

Cuestiones relacionadas