2010-12-06 15 views
13

Je dois ajouter une colonne à la page des commandes, ce qui signifie ajouter une colonne à sales_flat_order_grid. Les deux sont possibles mais je ne sais pas comment ajouter une valeur pour qu'elle soit enregistrée dans ma nouvelle colonne.Enregistrement de données supplémentaires avec une commande dans Magento

Dois-je aussi enregistrer un nouvel attribut?
La valeur n'est pas présente dans le devis, donc je suppose que je n'ai pas besoin de m'inscrire sous config/global/fieldsets/sales_convert_quote car la valeur n'est pas là pour être convertie.

Utilisation de Magento Enterprise 1.8.

Répondre

23

Après beaucoup d'essais et d'erreurs - beaucoup d'erreur - je pense avoir maintenant.

Pour commencer par le sales_flat_order_grid est mis à jour en Mage_Sales_Model_Mysql4_Order_Abstract::updateGridRecords(), en suivant la piste que je travaillais sur elle inspecte aussi bien la table « principale » (sales_flat_order) et la table principale + « _grid » (sales_flat_order_grid), prend la Intersection de leurs colonnes et construit une requête à partir de cela. Ainsi, toute colonne dont vous avez besoin dans la table de la grille doit également figurer dans la table principale. Ce n'est pas une entité de style EAV, donc les attributs n'ont pas besoin d'être créés.
Voici mon script d'installation:

<?php 

/* @var $this Nexxt_Booth_Model_Entity_Setup */ 
$installer = $this; 

$installer->getConnection()->addColumn($installer->getTable('sales_flat_order'), 'box_num', 'varchar(255)'); 
$installer->getConnection()->addColumn($installer->getTable('sales_flat_order_grid'), 'box_num', 'varchar(255)'); 

Ensuite, je avais besoin la colonne supplémentaire pour afficher dans toutes les tables de commande en administration. Pour ce faire, je surpasse chaque bloc pertinent.

<?xml version="1.0"?> 
<config> 
    .... 

    <global> 
     <blocks> 
      <adminhtml> 
       <rewrite> 
        <customer_edit_tab_view_orders> 
        <!-- Recent 5 orders on customer page --> 
         My_Module_Block_Adminhtml_Customer_Edit_Tab_View_Orders 
        </customer_edit_tab_view_orders> 
        <customer_edit_tab_orders> 
        <!-- All orders on customer tab --> 
         My_Module_Block_Adminhtml_Customer_Edit_Tab_Orders 
        </customer_edit_tab_orders> 
        <sales_order_grid> 
        <!-- All orders in Sales menu --> 
         My_Module_Block_Adminhtml_Sales_Order_Grid 
        </sales_order_grid> 
       </rewrite> 
      </adminhtml> 
     </blocks> 
    </global> 
</config> 

En My/Module/Block/Adminhtml/Sales/Order/Grid.php je fait ce qui suit:

<?php 

class My_Module_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid 

    protected function _prepareColumns() 
    { 
     $this->addColumn('box_num', array(
      'header' => $this->__('Box #'), 
      'index'  => 'box_num', 
      'width'  => '100px' 
     )); 
     $this->addColumnsOrder('box_num', 'shipping_name'); 
     return parent::_prepareColumns(); 
    } 

} 

De même, dans My/Module/Block/Adminhtml/Customer/Edit/Tab/Orders.php et My/Module/Block/Adminhtml/Customer/Edit/Tab/View/Orders.php j'ai ajouté cette fonction:

protected function _prepareColumns() 
    { 
     $this->addColumn('box_num', array(
      'header' => $this->__('Box #'), 
      'index'  => 'box_num', 
      'width'  => '100px' 
     )); 
     $this->addColumnsOrder('box_num', (Mage::app()->isSingleStoreMode() ? 'grand_total' : 'store_id')); 
     return parent::_prepareColumns(); 
    } 

Enfin, pour terminer, en cas sales_convert_quote_to_order I peuplé le nouveau champ. Ce bit n'est pas aussi important, du moment que vous ajoutez les données à un point avant que la commande ne soit enregistrée.

$order->setBoxNum('DATA GOES HERE'); 
+0

Je suis en train de faire exactement la même chose, je me suis fait une nouvelle colonne dans sales_flat_order_grid comme code à barres_no et en utilisant Grid.php j'ai affiché cette colonne dans la grille des commandes magento.Maintenant, comment puis-je stocker la valeur de barcode_no du backend magento dans la table sales_flat_order_grid? –

+0

@ShujaatShaikh avec qui avez-vous des problèmes? – clockworkgeek

+0

Non où je peux trouver un tuturial, expliquant comment insérer une valeur personnalisée à ma base de données php à partir de backend d'administration magento. Tout article serait une aide précieuse! –

1

vous devez ajouter des attributs, la meilleure façon de le faire est via la mise à jour de vos extensions ou le script de configuration. Comme la commande et devis sont basés sur des structures de table à plat, cela signifie vraiment l'ajout de champs à ces tables

voir aussi ALTER TABLE in Magento setup script without using SQL

0

En outre, vous pouvez utiliser cette option pour ajouter le nouveau « attribut » (à est vraiment une colonne parce est plat) à la fois, la sales_flat et la sales_flat_ _grid

$installer->addAttribute('order', 'box_num', array(
'label' => 'Box Number', 
'type'  => 'varchar', 
'grid'  => true  // this is important 
)); 

votre installateur doit être : Mage_Sales_Model_Entity_Setup pour utiliser la clé de grille.

Et rappelez-vous si vous ajoutez un ColumnD existant de sales_flat_order à sales_flat_order_grid, alors vous devez resynchroniser la table sales_flat_order_grid:

In Magento, how do I populate a new column in sales_order_grid with data from sales_flat_order?

+0

Dans mon cas, j'ai dû utiliser la classe 'Mage_Sales_Model_Resource_Setup' pour cela. La création d'attributs avec la classe 'Mage_Sales_Model_Entity_Setup' semblait ne rien faire (pas de nouvelles colonnes db créées, mais pas d'erreurs non plus). – Eric