Ajout de champs personnalisés à sales_flat_order


14

J'ai fait pas mal de recherches sur Google, d'essais et d'erreurs, mais je ne trouve pas de solution au problème.

  1. La possibilité de modifier les champs et l'ordre de sales_order_grid; et
  2. La possibilité d'afficher deux champs personnalisés sur cette grille (filtrable).

Le premier (point 1) a été résolu, en étendant le Mage_Adminhtml_Block_Widget_Griddans mon module personnalisé (je connais les observateurs, mais d'autres modules installés remplaçaient mes changements avec leurs observateurs).

Quoi qu'il en soit, ce dernier est mon problème actuel, voici les deux méthodes qui m'ont échoué jusqu'à présent.

Méthode 1

<?php
/*  @var $this Mage_Sales_Model_Mysql4_Setup  */
$this->startSetup();
$connection = $this->getConnection();

/**
 * Create the payment method dropdown field, because this field _may_ be
 * used for searching we will create an index for it.
 */
$connection->addColumn(
    $this->getTable('sales/order_grid'),
    'x_payment_method',
    "ENUM('PayPal', 'SagePay') DEFAULT NULL"
);
$connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');

/**
 * Create the order channel field to identify where the order was originally
 * generated from. Also add an index for this field for additional filtering.
 */
$connection->addColumn(
    $this->getTable('sales/order_grid'),
    'x_sale_channel',
    "ENUM('Amazon', 'Play', 'eBay', 'Website') NOT NULL DEFAULT 'Website'"
);
$connection->addKey($this->getTable('sales/order_grid'), 'x_sale_channel','x_sale_channel');

$this->endSetup();

Méthode 2

À ce stade, j'étais fatigué de lire les 7 mêmes articles qui n'ont pas aidé, alors j'ai essayé de faire travailler UN champ; J'ai également vérifié les journaux d'erreurs dans Magento et trouvé "$ this-> getTable ()" était erroné, donc je l'ai supprimé.

<?php
/*  @var $this Mage_Sales_Model_Mysql4_Setup  */
$this->startSetup();
$connection = $this->getConnection();

/**
 * Create the payment method dropdown field, because this field _may_ be
 * used for searching we will create an index for it.
 */
$this->addAttribute('sales_flat_order', 'x_test_option', array(
    'label' => 'X Test Option',
    'type' => 'varchar',
    'input' => 'select',
    'visible' => true,
    'required' => false,
    'position' => 1,
    'visible_on_front'  => false,
    'option' => array('value' => array('web', 'test 1', 'test 2')),
    'default' => array('web'),
));

$this->endSetup();

Ce qui fait qu'on se pose la question, quelle est la différence entre une colonne et un attribut? Ma présomption initiale était que, une colonne est ajoutée à une table principale existante tandis qu'un attribut est ajouté aux tables EAV_ * et associé de manière appropriée.


Même si cette table est plate, le modèle de ressource pour elle est EAV, donc l'attribut doit être enregistré dans la configuration EAV pour y être écrit. Plusieurs entités commerciales étaient auparavant des EAV mais ont été aplaties pour des raisons de performance.
benmarks

Réponses:


11

Votre présomption est correcte.
Mais pour la sales_table, ils sont une seule et même chose.
Initialement, les entités de vente étaient EAV. Ils ont changé en tables plates à partir de la version 1.4.0.1 (je pense). Et pour une compatibilité ascendante, les deux méthodes ont été conservées.
Pour toutes les autres entités à plat (pages cms, blocs, sondages) que vous ne pouvez pas utiliser addAttributeuniquement addColumn, mais pour les ventes, cela fonctionne dans les deux sens.
Si vous prévoyez de faire une extension qui doit être compatible avec les versions antérieures à 1.4 addAttribute, utilisez-la , sinon je n'y vois aucun intérêt.


Merci pour l'info, je trouve cela vraiment utile. En fait, maintenant que j'y pense, je suppose que la bonne façon est d'utiliser la addColumnméthode? Tout en n'utilisant pas «getTable» comme sales_flat_order, c'est juste cela. Je vais l'essayer sous peu et je reviendrai avec un virdict :)
ash

2
Il s'avère que j'ai eu deux problèmes (un que j'ai négligé); L'une était tout $this->getTable('sales/flat_order')aussi bien réglée sales_flat_order; le second était $connection->addKey($this->getTable('sales/order_grid'), 'x_payment_type', 'x_payment_type');; x_payment_typeaurait dû être x_payment_method.
ash
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.