¿Agregar una columna para exportar pero esconderse de la cuadrícula?

8

He creado un informe personalizado. El informe tiene un número significativo de campos que son necesarios para cuando se exporta en formato CSV.

Lo que estoy tratando de averiguar es si hay una manera de omitir la representación de algunos de los campos en la cuadrícula frontal. La mayoría de ellos no son realmente importantes para el proceso de filtrado en admin y solo se usan cuando el informe se descarga para un análisis posterior fuera de Magento.

Esperaría que este tipo de funcionalidad resida en la clase de cuadrícula, ya que eso es lo que genera la cuadrícula real y, más adelante, el CSV exportado, pero no veo nada que parezca que se ocupe de la visibilidad.

Antes de entrar y anular los métodos en esta clase para nuestro informe personalizado, ¿hay una forma menos conocida de lograr esto que sea más fácil que agregar algún tipo de propiedad "showInGrid" a través de la matriz de propiedades addColumn?

TL, DR ¿hay una manera fácil de exportar campos (por ejemplo, CSV o XML) pero omitidos de la cuadrícula de administración?

wlvrn
fuente
Pregunta similar: magento.stackexchange.com/questions/4398/…
Mukesh Chapagain

Respuestas:

3

Cree una definición de bloque separada, por ejemplo, duplique el bloque Grid en otro bloque que sea específico para su CSV; Llamaría a esto en Csvgrid.phplugar de Grid.php: contendría todas las mismas funciones que lo normal Grid.php, pero omita una columna.

En tu controlador:

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

Al duplicar la cuadrícula, colóquela Csvgrid.phpen el mismo directorio físico, Grid.phppero cámbiele el nombre según corresponda; ¡no olvide cambiar el nombre de la clase!

Editar:

Entonces resulta que Mage_Adminhtml_Block_Widget_Gridtiene un método llamado removeColumn, definido como:

/

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

Supongo que porque se Mage_Adminhtml_Block_Report_Gridextiende Mage_Adminhtml_Block_Widget_Grid, hereda este método y debería poder usarse. En ese caso, crearía una nueva cuadrícula de bloques y ampliaría la cuadrícula en la que se encuentra su informe actual. Desde allí puede usar su propio prepareColumnsmétodo, llame al parent::_prepareColumns()y luego llame removeColumn...

La mejor de las suertes.

philwinkle
fuente
Si bien esto definitivamente funciona, esperaba que hubiera una forma más aceptada de compartir la colección, pero limitando las columnas que se usaron para cualquier instancia dada del bloque (mostrar cuadrícula, generar exportaciones CSV / XML, etc.). De hecho, implementé el informe en el método que sugirió en su respuesta, pero pensé que buscaría una solución más elegante.
wlvrn
El problema no es tanto la colección como lo _prepareColumnsque hará referencia a un índice que ya no existe en la colección. Si bien hay un método 'removeColumn', yo diría que extienda la clase Grid y llame parent::_prepareColumns(), luego inyecte su propio removeColumnsmétodo.
philwinkle
@philwinkle: En realidad estoy usando este método magento.stackexchange.com/a/171754/51361 , para agregar un campo personalizado en la cuadrícula de pedidos de ventas. pero cuando exporto, los valores de columna agregados personalizados no se exportan, ¿cómo puedo resolver este error? ¿Podrían ayudarme?
Gema
5

Puede usar set column_css_classy en header_css_classcuanto no-displaya la columna que desea ocultar. Esto ocultará su columna de la cuadrícula de administración. Sin embargo, esta columna estará presente en el csv o xml exportado.

$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
fuente
4

Hay un método _afterLoadCollection()en Mage / Adminhtml / Block / Widget / Grid.php que se puede anular para eliminar / agregar columnas para exportar o mostrar $this->_isExport.

NOTA: Agregar esto a la _prepareCollection()no funcionará ya que los filtros de la colección no se habrán enviado, lo que dará como resultado que se elimine toda la colección menos cualquier filtrado.

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

Si solo necesita esos campos para el informe, ¿por qué no los agrega solo para el informe? Los bloques de cuadrícula tienen el método getCollection que devolverá el modelo de colección y puede agregar los campos que necesita para su informe.

Petar Dzhambazov
fuente
La vista de cuadrícula es útil para permitir al usuario aplicar filtros a un informe (rango de fechas, sku, etc.). Si bien los filtros les permiten limitar el conjunto de datos que se muestra, es posible que deseen que la exportación real incluya, por ejemplo, información del cliente o los elementos constitutivos que formaron un pedido conjunto. Es mucho más simple (se podría pensar) crear la colección que tiene todos los datos que necesita, y luego mostrar solo algo de eso en la vista de cuadrícula para una vista de administrador, pero permitir que la exportación incluya todos los datos. Desafortunadamente, los métodos de recopilación están estrechamente vinculados a la vista de cuadrícula.
wlvrn
Entiendo cómo funciona la cuadrícula y por qué es útil, lo que quise decir es que la exportación de csv es una acción separada, se crea la cuadrícula allí y se usa su getCsv para preparar la salida. Por lo tanto, los campos que solo necesita para los archivos csv se pueden agregar a la colección de cuadrículas justo antes de getCsv, esto no tendrá más impacto negativo en el rendimiento que hacerlo para la visualización general de la cuadrícula sin mostrarlo realmente
Petar Dzhambazov
0

La manera fácil de hacer esto es

Retroceda el archivo Grid.php (app / core / Mage / Adminhtml / Block / Sales / Order / Grid.php)

luego agregue su columna personalizada como hice a continuación:

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

También hizo cambios en

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

Esto significa que tenemos que agregar nuestro valor de columna personalizado a la colección. Para eso tenemos que unir nuestra tabla con la tabla de colección de cuadrícula.

Ahora ve y revisa el backend, exporta los pedidos. se agregará nuestra columna personalizada.

Priya Ponnusamy
fuente