Hinzufügen einer Spalte zum Exportieren, aber Ausblenden vor dem Raster?

8

Ich habe einen benutzerdefinierten Bericht erstellt. Der Bericht enthält eine erhebliche Anzahl von Feldern, die für den Export in CSV-Form erforderlich sind.

Ich versuche herauszufinden, ob es eine Möglichkeit gibt, das Rendern einiger Felder im Front-End-Raster wegzulassen. Die meisten davon sind für den Filterprozess in admin nicht wirklich wichtig und werden nur verwendet, wenn der Bericht zum weiteren Parsen außerhalb von Magento heruntergeladen wird.

Ich würde erwarten, dass sich diese Art von Funktionalität in der Rasterklasse befindet, da dies das eigentliche Raster und später die exportierte CSV generiert, aber ich sehe nichts, was so aussieht, als würde es sich um Sichtbarkeit handeln.

Gibt es eine weniger bekannte Möglichkeit, dies zu erreichen, bevor ich Methoden in dieser Klasse für unseren benutzerdefinierten Bericht überschreibe, die einfacher ist, als eine Art "showInGrid" -Eigenschaft über das Eigenschaftsarray addColumn hinzuzufügen?

TL, DR Gibt es eine einfache Möglichkeit, Felder zu exportieren (z. B. CSV oder XML), aber aus dem Admin-Raster wegzulassen?

wlvrn
quelle
Ähnliche Frage: magento.stackexchange.com/questions/4398/…
Mukesh Chapagain

Antworten:

3

Erstellen Sie eine separate Blockdefinition - z. B. duplizieren Sie den Grid-Block in einen anderen Block, der für Ihre CSV spezifisch ist. Ich würde dies Csvgrid.phpanstelle von Grid.php- es würde alle die gleichen Funktionen enthalten, die das Normal Grid.phpenthält, aber die eine Spalte weglassen.

In Ihrem Controller:

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

Wenn Sie das Grid duplizieren, platzieren Sie es Csvgrid.phpin demselben physischen Verzeichnis wie Grid.php, benennen Sie es jedoch entsprechend um - vergessen Sie nicht, den Klassennamen zu ändern!

Bearbeiten:

Es stellt sich also heraus, dass Mage_Adminhtml_Block_Widget_Grideine Methode namens removeColumn- definiert als:

/

**
     * 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;
    }

Ich vermute, dass es diese Methode erbt und verwendet werden sollte , weil es Mage_Adminhtml_Block_Report_Griderweitert Mage_Adminhtml_Block_Widget_Gridwird. In diesem Fall würde ich ein neues Blockraster erstellen und das Raster erweitern, in dem sich Ihr aktueller Bericht befindet. Von dort aus können Sie Ihre eigene prepareColumnsMethode verwenden, das aufrufen parent::_prepareColumns()und dann aufrufen removeColumn.

Viel Glück.

philwinkle
quelle
Obwohl dies definitiv funktioniert, hatte ich gehofft, dass es eine akzeptablere Möglichkeit gibt, die Sammlung gemeinsam zu nutzen, aber die Spalten, die für eine bestimmte Instanz des Blocks verwendet wurden (Anzeigen von Raster, Generieren von CSV / XML-Exporten usw.), einzuschränken. Ich habe den Bericht tatsächlich in der Methode implementiert, die Sie in Ihrer Antwort vorgeschlagen haben, aber ich dachte, ich würde nach einer eleganteren Lösung suchen.
wlvrn
Das Problem ist nicht die Sammlung, sondern _prepareColumnsein Index, der nicht mehr in der Sammlung vorhanden ist. Während es eine 'removeColumn'-Methode gibt, würde ich sagen, erweitern Sie die Grid-Klasse und rufen Sie auf und fügen Sie parent::_prepareColumns()dann Ihre eigene removeColumnsMethode ein.
Philwinkle
@philwinkle: Eigentlich verwende ich diese Methode magento.stackexchange.com/a/171754/51361 , um ein benutzerdefiniertes Feld im Kundenauftragsraster hinzuzufügen. Aber wenn ich exportiere, werden die benutzerdefinierten hinzugefügten Spaltenwerte nicht exportiert. Wie kann ich diesen Fehler beheben? Könnten Sie mir bitte helfen?
Gem
5

Sie können Satz verwenden column_css_classund header_css_classwie no-displayauf die Spalte , die Sie ausblenden möchten. Dadurch wird Ihre Spalte vor dem Admin-Raster ausgeblendet. Diese Spalte ist jedoch in der exportierten CSV- oder XML-Datei vorhanden.

$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',
  ));
Mukesh Chapagain
quelle
4

_afterLoadCollection()In Mage / Adminhtml / Block / Widget / Grid.php gibt es eine Methode , die überschrieben werden kann, um Spalten für den Export oder die Anzeige mit zu entfernen / hinzuzufügen $this->_isExport.

HINWEIS: Das Hinzufügen zu _prepareCollection()wird nicht funktionieren, da die Sammlungsfilter nicht gesendet wurden. Dies führt dazu , dass die gesamte Sammlung ohne Filterung ausgegeben wird.

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

Wenn Sie diese Felder nur für den Bericht benötigen, warum fügen Sie sie nicht nur für den Bericht hinzu? Rasterblöcke verfügen über die Methode getCollection, die das Erfassungsmodell zurückgibt, und Sie können Felder hinzufügen, die Sie für Ihren Bericht benötigen.

Petar Dzhambazov
quelle
Die Rasteransicht ist nützlich, damit der Benutzer Filter auf einen Bericht anwenden kann (Datumsbereich, SKU usw.). Während Filter es ihnen ermöglichen, den angezeigten Datensatz einzugrenzen, möchten sie möglicherweise, dass der tatsächliche Export beispielsweise Kundeninformationen oder die Bestandteile enthält, aus denen eine Bündelbestellung besteht. Es ist viel einfacher (man könnte meinen), die Sammlung zu erstellen, die alle benötigten Daten enthält, und dann nur einen Teil davon in der Rasteransicht für eine Administratoransicht anzuzeigen, aber beim Export alle Daten einzuschließen. Leider sind die Erfassungsmethoden eng mit der Rasteransicht verknüpft.
wlvrn
Ich verstehe, wie Grid funktioniert und warum es hilfreich ist. Ich meinte, dass der CSV-Export eine separate Aktion ist. Sie erstellen das Grid dort und verwenden seine getCsv, um die Ausgabe vorzubereiten. Die Felder, die Sie nur für CSV-Dateien benötigen, können direkt vor getCsv zur Grid-Sammlung hinzugefügt werden. Dies hat keine größeren negativen Auswirkungen auf die Leistung als für die allgemeine Grid-Anzeige, ohne sie tatsächlich anzuzeigen
Petar Dzhambazov,
0

Der einfache Weg, dies zu tun, ist

Greifen Sie auf die Datei Grid.php zurück (app / core / Mage / Adminhtml / Block / Sales / Order / Grid.php).

Fügen Sie dann Ihre benutzerdefinierte Spalte hinzu, wie ich es unten getan habe:

//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',
));

auch geändert in

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

Dies bedeutet, dass wir unseren benutzerdefinierten Spaltenwert zur Sammlung hinzufügen müssen. Dazu müssen wir unsere Tabelle mit der Grid Collection-Tabelle verbinden.

Überprüfen Sie nun das Backend und exportieren Sie die Bestellungen. Es wird unsere benutzerdefinierte Spalte hinzugefügt.

Priya Ponnusamy
quelle