2010-11-27 26 views
1

J'essaie d'ajouter un attribut EAV appelé «vendorping» au modèle sales/order_shipment. Pour ce faire, j'ai créé le fichier suivant dans mon module:Magento: Définition d'un attribut personnalisé sur le modèle sales/order_shipment

// app\code\local\Jb\Vendorping\sql\vendorping_setup\mysql4-install-0.1.0.php 

$this->startSetup(); 

$sql = 'SELECT entity_type_id FROM `'.$this->getTable('eav_entity_type').'` WHERE entity_type_code = \'shipment\''; 
$row = Mage::getSingleton('core/resource') 
    ->getConnection('core_read') 
    ->fetchRow($sql); 
$entityTypeId = $row['entity_type_id']; 

$c = array(
    'entity_type_id' => $entityTypeId, 
    'attribute_code' => 'vendorping', 
    'backend_type' => 'int', 
    'frontend_input' => 'text', 
    'is_global'  => '1', 
    'is_visible'  => '0', 
    'is_required'  => '0', 
    'is_user_defined' => '0', 
    'frontend_label' => 'Vendor Confirmed', 
    ); 
$attribute = new Mage_Eav_Model_Entity_Attribute(); 
$attribute->loadByCode($c['entity_type_id'], $c['attribute_code']) 
    ->setStoreId(0) 
    ->addData($c) 
    ->save(); 

$this->endSetup(); 

Maintenant, cela fonctionne bien - cet attribut est ajouté avec succès:

mysql> mysql> SELECT * FROM eav_attribute WHERE attribute_code LIKE 'vendorping'; 
+--------------+----------------+----------------+-----------------+---------------+--------------+---------------+----------------+----------------+------------------+----------------+--------------+-------------+-----------------+---------------+-----------+------+ 
| attribute_id | entity_type_id | attribute_code | attribute_model | backend_model | backend_type | backend_table | frontend_model | frontend_input | frontend_label | frontend_class | source_model | is_required | is_user_defined | default_value | is_unique | note | 
+--------------+----------------+----------------+-----------------+---------------+--------------+---------------+----------------+----------------+------------------+----------------+--------------+-------------+-----------------+---------------+-----------+------+ 
|   127 |    8 | vendorping  | NULL   | NULL   | int   | NULL   | NULL   | text   | Vendor Confirmed | NULL   | NULL   |   0 |    0 | NULL   |   0 |  | 
+--------------+----------------+----------------+-----------------+---------------+--------------+---------------+----------------+----------------+------------------+----------------+--------------+-------------+-----------------+---------------+-----------+------+ 
1 row in set (0.00 sec) 

Mais si je lance cette action du contrôleur, je peut ne pas sembler sauver avec succès le nouvel attribut:

// app\code\local\Jb\Vendorping\controllers\IndexController.php === 

class Jb_Vendorping_IndexController extends Mage_Core_Controller_Front_Action 
{ 
    public function pingAction() 
    { 
     // Get shipment 
     $shipmentId = 1; // Set manually for now 
     $shipment = Mage::getModel('sales/order_shipment')->load($shipmentId); 
     var_dump($shipment->getOrder()->getShippingDescription()); 
      // Outputs: 
      // string(17) "Flat Rate - Fixed" [So the shipment exists] 

     // Save "vendorping" field and save 
     $shipment->setVendorping(1); 
     $shipment->save(); 

     // Reload shipment from database 
     $shipment = Mage::getModel('sales/order_shipment')->load($shipmentId); 

     // Check "vendorping" field 
     var_dump($shipment->getVendorping()); 
      // Outputs: 
      // NULL [Why??] 
    } 
} 

Répondre

0

Cela a fonctionné:

// ModuleNamespace/ModuleName/sql/vendorping_setup/mysql4-install-0.1.0.php 

$this->startSetup(); 

if (version_compare(Mage::getVersion(), '1.4.1.0', '>=')) { // If sales data is stored flat 
    $w = $this->_conn; 
    $w->addColumn($this->getTable('sales_flat_shipment'), 'vendorping', 'int'); 
} else { 
    $eav = new Mage_Eav_Model_Entity_Setup('sales_setup'); 
    $eav->addAttribute('shipment', 'vendorping', array('type' => 'int')); 
} 

$this->endSetup(); 
2

Ajout d'une entité à un modèle EAV prend plus que l'ajout d'une ligne à la table eav_entity_type. Les ressources d'installation EAV (les classes qui exécutent les scripts d'installation) ont une méthode installEntities qui prend soin de cela pour vous. Il est préférable de traiter toute la chose comme une boîte noire, sauf si vous voulez vraiment tracer tout qui se passe. L'ajout aléatoire de données et de tables autour du système EAV jusqu'à ce que quelque chose fonctionne presque toujours conduit à un système qui est brisé de façon subtile. C'est similaire à jouer directement avec des valeurs de mémoire dans la RAM.

My article on EAV Les modèles doivent couvrir ce que vous devez savoir. Si vous avez encore des problèmes après cela, revenez avec des questions spécifiques.

+0

Après googler 'installEntities', j'ai trouvé [cette ressource] (http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/installing_custom_attributes_with_your_module). Merci pour votre aide et merci pour votre blog. –

+0

Cela fonctionne maintenant. Je vous remercie. –

+0

Attendez, cela ne fonctionne que pour la version 1.3.2.4, pas 1.4.1.1. –