2010-11-27 16 views
1

Ich versuche, ein EAV-Attribut namens "vendingping" zum sales/order_shipment-Modell hinzuzufügen. Um dies zu erreichen, habe ich die folgende Datei in meinem Modul:Magento: Festlegen eines benutzerdefinierten Attributs für das Verkaufs-/Auftragsversandmodell

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

Nun, dies funktioniert gut - dieses Attribut erfolgreich hinzugefügt:

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) 

Aber wenn ich diese Controller-Aktion ausführen, ich scheint nicht erfolgreich das neue Attribut zu speichern:

// 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??] 
    } 
} 

Antwort

0

Das funktionierte:

// 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

eine Einheit zu einem EAV-Modell mehr Hinzufügen dauern als nur eine Zeile in die eav_entity_type Tabelle hinzugefügt wird. EAV-Setup-Ressourcen (die Klassen, die die Installer-Skripts ausführen) haben eine installEntities-Methode, die das für Sie erledigt. Es ist am besten, die ganze Sache als eine Blackbox zu behandeln, es sei denn, Sie wollen wirklich herausfinden, was los ist alles. Zufälliges Hinzufügen von Daten und Tabellen rund um das EAV-System, bis etwas fast immer funktioniert, führt zu einem System, das auf eine subtile Weise unterbrochen ist. Es ist ähnlich, direkt mit Speicherwerten im RAM zu spielen.

My article on EAV Modelle sollten abdecken, was Sie wissen müssen. Wenn Sie danach immer noch Probleme haben, kommen Sie mit spezifischen Fragen zurück.

+0

Nach Googeln 'installEntities', fand ich [diese Ressource] (http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/installing_custom_attributes_with_your_module). Danke für deine Hilfe und danke auch für deinen Blog. –

+0

Das funktioniert jetzt. Vielen Dank. –

+0

Warten Sie, es funktioniert nur für Version 1.3.2.4, nicht 1.4.1.1. –

Verwandte Themen