Aggiungere una colonna da esportare ma nascondersi dalla griglia?


8

Ho creato un rapporto personalizzato. Il rapporto contiene un numero significativo di campi richiesti per l'esportazione in formato CSV.

Quello che sto cercando di capire è se c'è un modo per omettere il rendering di alcuni dei campi sulla griglia del front-end. Molti di questi non sono molto importanti per il processo di filtraggio in admin e vengono utilizzati solo quando il report viene scaricato per ulteriori analisi al di fuori di Magento.

Mi aspetto che questo tipo di funzionalità risieda nella classe della griglia poiché è ciò che genera la griglia effettiva e, in seguito, il CSV esportato, ma non vedo nulla che assomigli alla visibilità.

Prima di entrare e sovrascrivere i metodi in questa classe per il nostro rapporto personalizzato, esiste un modo meno noto per ottenere ciò che è più semplice della mia aggiunta di un tipo di proprietà "showInGrid" tramite l'array di proprietà addColumn?

TL, DR esiste un modo semplice per esportare i campi (ad esempio CSV o XML) ma ometterli dalla griglia di amministrazione?


Risposte:


3

Creare una definizione di blocco separata, ad esempio duplicare il blocco Grid su un altro blocco specifico per il proprio CSV; Chiamerei questo Csvgrid.phpinvece di Grid.php- conterrebbe tutte le stesse funzionalità che Grid.phpcontiene il normale , ma omettere una colonna.

Nel tuo controller:

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

Quando si duplica la griglia, posizionarla Csvgrid.phpnella stessa directory fisica Grid.phpma rinominarla di conseguenza - non dimenticare di cambiare il nome della classe!

Modificare:

Quindi si scopre che Mage_Adminhtml_Block_Widget_Gridha un metodo chiamato removeColumn- definito come:

/

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

La mia ipotesi è che, poiché Mage_Adminhtml_Block_Report_Gridestende Mage_Adminhtml_Block_Widget_Grid, eredita questo metodo e dovrebbe essere in grado di essere utilizzato. Vorrei, in tal caso, creare un nuovo blocco Grid ed estendere la griglia in cui si trova il report corrente. Da lì è possibile utilizzare il proprio prepareColumnsmetodo, chiamare parent::_prepareColumns()e quindi chiamare removeColumn..

Buona fortuna.


Mentre questo funziona sicuramente, speravo che ci sarebbe stato un modo più accettato di condividere la raccolta ma limitando le colonne utilizzate per una determinata istanza del blocco (visualizzazione della griglia, generazione di esportazioni CSV / XML, ecc.). Ho effettivamente implementato il rapporto nel metodo che hai suggerito nella tua risposta, ma ho pensato di cercare una soluzione più elegante.
wlvrn,

Il problema non è la raccolta tanto quanto è _prepareColumnsche farà riferimento a un indice che non esiste più nella raccolta. Mentre esiste un metodo 'removeColumn', direi di estendere la classe Grid e chiamare parent::_prepareColumns(), quindi iniettare il tuo removeColumnsmetodo.
Filwinkle,

@philwinkle: In realtà sto usando questo metodo magento.stackexchange.com/a/171754/51361 , per aggiungere un campo personalizzato sulla griglia degli ordini di vendita. ma quando esporto, i valori della colonna aggiunta personalizzata non esportati, come posso risolvere questo errore, potresti aiutarmi.
Gemma

5

È possibile utilizzare insieme column_css_classe header_css_classcome no-displayalla colonna che si desidera nascondere. Questo nasconderà la tua colonna dalla griglia di amministrazione. Tuttavia, questa colonna sarà presente nel file CSV o XML esportato.

$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

Esiste un metodo _afterLoadCollection()in Mage / Adminhtml / Block / Widget / Grid.php che può essere ignorato per rimuovere / aggiungere colonne per l'esportazione o la visualizzazione con $this->_isExport.

NOTA: L'aggiunta di questo _prepareCollection()non funzionerà poiché i filtri di raccolta non saranno stati inviati, con il risultato di scaricare l'intera raccolta meno i filtri.

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

1

Se hai bisogno solo di quei campi per il rapporto, perché non li aggiungi solo per il rapporto? I blocchi griglia hanno il metodo getCollection che restituirà il modello di raccolta ed è possibile aggiungere i campi necessari per il report.


La visualizzazione griglia è utile per consentire all'utente di applicare filtri a un report (intervallo di date, sku, ecc.). Sebbene i filtri consentano loro di restringere il set di dati visualizzato, potrebbero volere che l'esportazione effettiva includa, ad esempio, le informazioni sui clienti o gli elementi costitutivi che hanno costituito un ordine di raggruppamento. È molto più semplice (si potrebbe pensare) creare la raccolta contenente tutti i dati necessari, quindi mostrarne solo alcuni nella vista griglia per una vista amministratore, ma consentire all'esportazione di includere tutti i dati. Sfortunatamente, i metodi di raccolta sono strettamente legati alla vista a griglia.
wlvrn,

Capisco come funziona la griglia e perché è utile, ciò che intendevo è che l'esportazione CSV è un'azione separata, si crea la griglia lì e si usa getCsv per preparare l'output. Quindi quei campi che ti servono solo per i file CSV possono essere aggiunti alla raccolta della griglia subito prima di getCsv, questo non avrà un impatto negativo sulle prestazioni rispetto a farlo per la visualizzazione generale della griglia senza visualizzarlo effettivamente
Petar Dzhambazov,

0

Il modo semplice per farlo è

Fallback del file Grid.php (app / core / Mage / Adminhtml / Block / Sales / Order / Grid.php)

quindi aggiungi la tua colonna personalizzata come ho fatto di seguito:

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

anche fatto il cambiamento 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();
}

questo significa che dobbiamo aggiungere il nostro valore di colonna personalizzato alla raccolta. Per questo dobbiamo unirci al nostro tavolo con la tabella di raccolta della griglia.

Ora vai a controllare il backend, esporta gli ordini. ci sarà aggiunta la nostra colonna personalizzata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.