Adicionando uma coluna para exportar, mas ocultando a grade?

8

Eu criei um relatório personalizado. O relatório possui um número significativo de campos necessários para quando é exportado no formato CSV.

O que estou tentando descobrir é se há uma maneira de omitir a renderização de alguns dos campos na grade de front-end. A maioria deles não é realmente importante para o processo de filtragem no administrador e é usada apenas quando o relatório é baixado para análise adicional fora do Magento.

Eu esperaria que esse tipo de funcionalidade residisse na classe de grade, pois é isso que gera a grade real e, mais tarde, o CSV exportado, mas não vejo nada que pareça que lide com a visibilidade.

Antes de entrar e substituir os métodos nesta classe para o nosso relatório personalizado, existe uma maneira menos conhecida de realizar isso que é mais fácil do que adicionar algum tipo de propriedade "showInGrid" por meio da matriz de propriedades addColumn?

TL, DR, existe uma maneira fácil de exportar campos (por exemplo, CSV ou XML), mas omitidos da grade administrativa?

wlvrn
fonte
Pergunta semelhante: magento.stackexchange.com/questions/4398/...
Mukesh Chapagain

Respostas:

3

Crie uma definição de bloco separada - por exemplo, duplique o bloco Grid para outro bloco específico para o seu CSV; Eu chamaria isso em Csvgrid.phpvez de Grid.php- conteria toda a mesma funcionalidade que o normal Grid.php, mas omitir a coluna.

No seu controlador:

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

Ao duplicar o Grid, coloque Csvgrid.phpno mesmo diretório físico, Grid.phpmas renomeie-o de acordo - não esqueça de alterar o nome da classe!

Editar:

Acontece que Mage_Adminhtml_Block_Widget_Gridtem um método chamado 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;
    }

Meu palpite é que, porque Mage_Adminhtml_Block_Report_Gridestende, Mage_Adminhtml_Block_Widget_Gridele herda esse método e deve poder ser usado. Nesse caso, eu criaria um novo bloco Grid e estenderia o Grid em que está o seu relatório atual. A partir daí, você pode usar seu próprio prepareColumnsmétodo, chamar parent::_prepareColumns()e chamar removeColumn.

Boa sorte.

philwinkle
fonte
Enquanto isso definitivamente funciona, eu esperava que houvesse uma maneira mais aceita de compartilhar a coleção, mas limitando as colunas que foram usadas para qualquer instância do bloco (exibindo grade, gerando exportações de CSV / XML, etc.). Na verdade, implementei o relatório no método que você sugeriu na sua resposta, mas pensei em procurar uma solução mais elegante.
wlvrn
O problema não é a coleção, mas sim o _prepareColumnsque fará referência a um índice que não existe mais na coleção. Embora exista um método 'removeColumn', eu diria estender a classe Grid e chamar parent::_prepareColumns(), em seguida, injetar seu próprio removeColumnsmétodo.
philwinkle
@ philwinkle: Na verdade, estou usando esse método magento.stackexchange.com/a/171754/51361 , para adicionar um campo personalizado à grade da ordem do cliente . mas quando eu exporto, os valores das colunas adicionadas personalizadas não são exportados, como posso resolver esse erro, você pode me ajudar.
Gem
5

Você pode usar set column_css_classe header_css_classquanto no-displayà coluna que deseja ocultar. Isso ocultará sua coluna da grade do administrador. No entanto, esta coluna estará presente no csv ou 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
fonte
4

Existe um método _afterLoadCollection()no Mage / Adminhtml / Block / Widget / Grid.php que pode ser substituído para remover / adicionar colunas para exportação ou exibição $this->_isExport.

OBSERVAÇÃO: adicionar isso ao _prepareCollection()não funcionará, pois os filtros da coleção não serão enviados, resultando em toda a coleção despejada menos qualquer filtragem.

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

Se você só precisa desses campos para o relatório, por que não os adiciona apenas ao relatório? Os blocos de grade têm o método getCollection, que retornará o modelo de coleção e você poderá adicionar os campos necessários para o seu relatório.

Petar Dzhambazov
fonte
A visualização em grade é útil para permitir que o usuário aplique filtros a um relatório (período, sku etc.). Embora os filtros permitam restringir o conjunto de dados exibido, eles podem desejar que a exportação real inclua, por exemplo, informações do cliente ou os itens constituintes que compunham um pedido de pacote. É muito mais simples (você pensaria) criar a coleção que possui todos os dados necessários e, em seguida, mostrar apenas alguns deles na visualização em grade para uma visualização de administrador, mas permitir que a exportação inclua todos os dados. Infelizmente, os métodos de coleta estão fortemente vinculados à exibição em grade.
wlvrn
Entendo como a grade está funcionando e por que é útil, o que eu quis dizer é que a exportação csv é uma ação separada, você cria a grade lá e usa seu getCsv para preparar a saída. Assim, os campos que você precisa apenas para arquivos CSV podem ser adicionados à coleção grade direita antes getCsv, isso não terá impacto no desempenho mais negativo do que fazê-lo para exibição geral grade sem realmente exibi-lo
Petar Dzhambazov
0

A maneira mais fácil de fazer isso é

Retorne ao arquivo Grid.php (app / core / Mage / Adminhtml / Block / Sales / Order / Grid.php)

adicione sua coluna personalizada como fiz abaixo:

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

também fez alterações

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

isso significa que precisamos adicionar nosso valor personalizado da coluna à coleção. Para isso, precisamos juntar nossa tabela com a tabela de coleta de grade.

Agora vá e verifique o back-end, exporte os pedidos. haverá nossa coluna personalizada adicionada.

Priya Ponnusamy
fonte