2012-01-18 10 views
7

Desidero aggiungere un nuovo attributo di prodotto che esegue il rendering di un elenco a discesa con tutte le pagine CMS come opzioni. Ho creato un'estensione e volevo aggiungere questo attributo tramite lo script di installazione. ma dopo l'esecuzione di questo, Magento danneggiato la tabella eav_entity_type ...Magento: attributo del prodotto personalizzato per selezionare una pagina CMS

Quello che ho provato finora:

MySQL4-install-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(); 

sorgente per cmspageselect/classe 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; 
    } 
} 

Come ho detto, invece di creare il nuovo "test_report" attributo, Magento solo danneggiato l'eav_entity_type ta ble. Non c'era nessun messaggio di errore, né la voce di registro su ciò che è successo.

Come posso creare tale attributo?

Grazie, Aeno

+0

puoi fornire il codice sorgente per la classe cmspageselect/entity_source? –

+0

ho modificato la domanda per includere l'origine – aeno

+0

come si determina la tabella è corrotta? –

risposta

4

Il $installer classe stessa dovrebbe essere in grado di aggiungere l'attributo, non credo è necessario caricare la classe 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(); 

Diverso da quello che penso che il tuo valore di origine non è corretto, a giudicare dal elemento di origine della matrice, si dovrebbe essere chiamare il vostro modello di Mandarin_CMSPageSelect_Model_Entity_Source. Suppongo che tu abbia aggiunto l'elemento appropriato <models> in config.xml, per dire a Magento da dove caricare il tuo modello.

+0

Grazie per la risposta, Cags. Ma questo non fa il trucco. Quando si utilizza il codice, si ottiene 'Chiama al metodo non definito Mage_Core_Model_Resource_Setup :: addAttribute()'. Ho persino ribattezzato il mio modello sorgente come hai fatto notare. – aeno

+0

Quando si utilizza $ setup-> addAttribute() ha finalmente funzionato. Ho dovuto modificare leggermente il mio modello sorgente, in quanto setPositionOrder() e setStoreFilter() non possono essere utilizzati in cms/page_collection. – aeno

Problemi correlati