Ajout d'une colonne à exporter mais masquage de la grille?


8

J'ai créé un rapport personnalisé. Le rapport contient un nombre important de champs qui sont requis pour son exportation au format CSV.

Ce que j'essaie de comprendre, c'est s'il existe un moyen d'omettre le rendu de certains des champs de la grille frontale. La plupart d'entre eux ne sont pas vraiment importants pour le processus de filtrage dans admin et ne sont utilisés que lorsque le rapport est téléchargé pour une analyse ultérieure en dehors de Magento.

Je m'attendrais à ce que ce type de fonctionnalité réside dans la classe de la grille, car c'est ce qui génère la grille réelle et, plus tard, le CSV exporté, mais je ne vois rien qui ressemble à de la visibilité.

Avant d'entrer et de remplacer les méthodes de cette classe pour notre rapport personnalisé, y a-t-il un moyen moins connu d'accomplir cela qui est plus facile que d'ajouter une sorte de propriété "showInGrid" via le tableau de propriétés addColumn?

TL, DR existe-t-il un moyen facile d'exporter des champs (par exemple, CSV ou XML) mais d'omettre de la grille d'administration?


Réponses:


3

Créez une définition de bloc séparée - par exemple, dupliquez le bloc Grid sur un autre bloc spécifique à votre CSV; J'appellerais cela Csvgrid.phpau lieu de Grid.php- il contiendrait toutes les mêmes fonctionnalités que la normale Grid.phpcontient, mais omettait une colonne.

Dans votre contrôleur:

public function exportCsvAction()
{
        $fileName = 'myreport_'.date('Y_m_d_h_i_s').'.csv';
        $content = $this->getLayout()->createBlock('mymodule/adminhtml_reports_csvgrid')->getCsv();
}

Lorsque vous dupliquez la grille, placez-la Csvgrid.phpdans le même répertoire physique que Grid.phpmais renommez-la en conséquence - n'oubliez pas de changer le nom de la classe!

Éditer:

Il s'avère donc qu'il Mage_Adminhtml_Block_Widget_Grida une méthode appelée removeColumn- définie comme:

/

**
     * Remove existing column
     *
     * @param string $columnId
     * @return Mage_Adminhtml_Block_Widget_Grid
     */
    public function removeColumn($columnId)
    {
        if (isset($this->_columns[$columnId])) {
            unset($this->_columns[$columnId]);
            if ($this->_lastColumnId == $columnId) {
                $this->_lastColumnId = key($this->_columns);
            }
        }
        return $this;
    }

Ma conjecture est que, car il Mage_Adminhtml_Block_Report_Gridétend Mage_Adminhtml_Block_Widget_Gridhérite de cette méthode et devrait pouvoir être utilisé. Je voudrais, dans ce cas, créer une nouvelle grille de bloc et étendre la grille dans laquelle se trouve votre rapport actuel. À partir de là, vous pouvez utiliser votre propre prepareColumnsméthode, appeler parent::_prepareColumns()puis appeler removeColumn..

Bonne chance.


Bien que cela fonctionne définitivement, j'espérais qu'il y aurait un moyen plus accepté de partager la collection, mais en limitant les colonnes utilisées pour une instance donnée du bloc (affichage de la grille, génération d'export CSV / XML, etc.). J'ai en fait implémenté le rapport selon la méthode que vous avez suggérée dans votre réponse, mais j'ai pensé que je chercherais une solution plus élégante.
wlvrn

Le problème n'est pas tant la collection qu'elle l'est _prepareColumnsqui référencera un index qui n'existe plus dans la collection. Bien qu'il existe une méthode «removeColumn», je dirais étendre la classe Grid et appeler parent::_prepareColumns(), puis injecter votre propre removeColumnsméthode.
philwinkle

@philwinkle: En fait, j'utilise cette méthode magento.stackexchange.com/a/171754/51361 , pour ajouter un champ personnalisé sur la grille de commande client. mais lorsque j'exporte, les valeurs de colonne ajoutées personnalisées ne sont pas exportées, comment puis-je résoudre cette erreur, pourriez-vous m'aider.
Gem

5

Vous pouvez utiliser set column_css_classet header_css_classquant no-displayà la colonne que vous souhaitez masquer. Cela masquera votre colonne de la grille d'administration. Cependant, cette colonne sera présente dans le fichier csv ou xml exporté.

$this->addColumn('YOUR_COLUMN_ID', array(
        'header'    => Mage::helper('YOUR_HELPER_NAME')->__('YOUR_COLUMN_NAME'),
        'width'     => '150px',
        'index'     => 'YOUR_COLUMN_INDEX',
        'column_css_class'=>'no-display',
        'header_css_class'=>'no-display',
  ));

4

Il existe une méthode _afterLoadCollection()dans Mage / Adminhtml / Block / Widget / Grid.php qui peut être remplacée pour supprimer / ajouter des colonnes pour l'exportation ou l'affichage $this->_isExport.

REMARQUE: l' ajout de cela _prepareCollection()ne fonctionnera pas car les filtres de collection n'auront pas été soumis, ce qui entraînera le vidage de la collection entière moins tout filtrage.

protected function _afterLoadCollection() {
    if(!$this->_isExport) {
        $this->removeColumn('columnToRemove');
    }
}

1

Si vous n'avez besoin que de ces champs pour le rapport, pourquoi ne les ajoutez-vous que pour le rapport? Les blocs de grille ont la méthode getCollection qui retournera le modèle de collection et vous pouvez ajouter les champs dont vous avez besoin pour votre rapport.


La vue grille est utile pour permettre à l'utilisateur d'appliquer des filtres à un rapport (plage de dates, sku, etc.). Bien que les filtres leur permettent de restreindre l'ensemble de données affiché, ils peuvent souhaiter que l'exportation réelle inclue, par exemple, les informations client ou les éléments constitutifs qui ont constitué une commande groupée. Il est beaucoup plus simple (on pourrait penser) de créer la collection qui contient toutes les données dont vous avez besoin, puis de n'en afficher qu'une partie dans la vue de la grille pour une vue d'administration, mais autorisez l'exportation à inclure toutes les données. Malheureusement, les méthodes de collecte sont étroitement liées à la vue de la grille.
wlvrn

Je comprends comment fonctionne la grille et pourquoi elle est utile, ce que je voulais dire, c'est que l'exportation csv est une action distincte, vous créez la grille là-bas et utilisez son getCsv pour préparer la sortie. Ainsi, les champs dont vous n'avez besoin que pour les fichiers csv peuvent être ajoutés à la collection de grilles juste avant getCsv, cela n'aura pas plus d'impact négatif sur les performances que de le faire pour l'affichage général de la grille sans l'afficher réellement
Petar Dzhambazov

0

La façon la plus simple de le faire est

Repliez le fichier Grid.php (app / core / Mage / Adminhtml / Block / Sales / Order / Grid.php)

puis ajoutez votre colonne personnalisée comme je l'ai fait ci-dessous:

//New columns added but hidded

$this->addColumn('custom_column', array(
   'header' => Mage::helper('sales')->__('Custom Column'),
   'index' => 'custom_column',
   'column_css_class'=>'no-display',
   'header_css_class'=>'no-display',
));

a également changé

protected function _prepareCollection()
{
    $collection = Mage::getResourceModel($this->_getCollectionClass());
    $collection->getSelect()->joinLeft('sales_flat_order', 'main_table.entity_id = sales_flat_order.entity_id',array('custom_column'));     
    $this->setCollection($collection);
    return parent::_prepareCollection();
}

cela signifie que nous devons ajouter notre valeur de colonne personnalisée à la collection. Pour cela, nous devons joindre notre table avec une table de collecte de grille.

Maintenant, allez vérifier le backend, exportez les commandes. il y aura notre colonne personnalisée ajoutée.

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.