Pregunta

He creado un informe personalizado. El informe tiene un número significativo de los campos en que los que se requieren para cuando se exporta en forma CSV.

Lo que estoy tratando de averiguar es si hay una manera de omitir la prestación de algunos de los campos en la parrilla frontal. La mayoría de ellos no son realmente importantes para el proceso de filtrado de administrador y sólo se utilizan cuando el informe se descarga para su posterior análisis fuera de Magento.

Yo esperaría que esto tipo de funcionalidad a residir en la clase de cuadrícula ya que eso es lo que genera la red actual y, más tarde, el CSV exportado, pero no veo nada que se parezca se trata de visibilidad.

Antes de ir y métodos de anulación de esta clase para nuestro informe personalizado, hay una manera menos conocido de lograr esto que es más fácil que mi añadiendo algún tipo de propiedad "showInGrid" a través de la matriz de propiedad addColumn?

TL, DR ¿hay una manera fácil de tener campos exportados (en, por ejemplo, CSV o XML), pero omite de la red administrador?

¿Fue útil?

Solución

Crea una definición de bloque separado - por ejemplo, duplicar el bloque de la rejilla a otro bloque que es específico para su CSV; Yo llamaría a esto Csvgrid.php en lugar de Grid.php -. Contendría todos la misma funcionalidad que el Grid.php normal contiene, pero omita la columna de un solo

En el controlador:

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

Cuando la duplicación de la cuadrícula, Csvgrid.php lugar en el mismo directorio físico como Grid.php pero cambiar su nombre en consecuencia - no se olvide de cambiar el nombre de la clase!

Editar

Así resulta que Mage_Adminhtml_Block_Widget_Grid tiene un método llamado removeColumn - define 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;
    }

Mi suposición es que debido a Mage_Adminhtml_Block_Report_Grid extiende Mage_Adminhtml_Block_Widget_Grid hereda este método y debe ser capaz de ser utilizado. Yo, en ese caso, se crea un nuevo bloque de cuadrícula y extender la cuadrícula que su informe actual se encuentra en. Desde allí se puede utilizar su propio método prepareColumns, llame a la parent::_prepareColumns() y removeColumn entonces llamada ..

Lo mejor de la suerte.

Otros consejos

You can use set column_css_class and header_css_class as no-display to the column you want to hide. This will hide your column from the admin grid. However, this column will be present in the exported csv or xml.

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

There is a method _afterLoadCollection() in Mage/Adminhtml/Block/Widget/Grid.php that can be overrided to remove/add columns for export or display with $this->_isExport.

NOTE: Adding this to the _prepareCollection() won't work as the collection filters will not have been submitted, resulting in the entire collection dumped minus any filtering.

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

If you only need those fields for report, why don't you add them for the report only? Grid blocks have getCollection method which will return collection model and you can add fields you need for your report.

The easy way to do this is

Fall back the Grid.php file (app/core/Mage/Adminhtml/Block/Sales/Order/Grid.php)

then add your custom column like i did below:

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

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

this means we have to add our custom column value to collection. For that we have to join our table with grid collection table.

Now go and check backend, export the orders. there will be our custom column added.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top