是否添加要导出的列但隐藏在网格中?


8

我创建了一个自定义报告。该报告中包含大量字段,这些字段以CSV格式导出时必填。

我要弄清楚的是,是否有一种方法可以忽略前端网格中某些字段的呈现。它们中的大多数对于admin中的筛选过程并不是很重要,仅在下载报告以在Magento之外进行进一步解析时才使用。

我希望这种类型的功能驻留在网格类中,因为这是生成实际网格以及后来导出的CSV的原因,但是我看不到任何看起来像能见度的东西。

在我为自定义报告覆盖此类中的方法之前,是否有一种鲜为人知的方法来实现此目标,该方法比通过addColumn属性数组添加某种“ showInGrid”属性更容易?

TL,DR是否有一种简单的方法来导出字段(例如CSV或XML),但从管理网格中省略了字段?


Answers:


3

创建一个单独的块定义-例如将Grid块复制到另一个特定于CSV的块;我会叫这个Csvgrid.php,而不是Grid.php-这将包含所有与正常相同的功能Grid.php包含,但省略了一列。

在您的控制器中:

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

复制网格时,将其放置Csvgrid.phpGrid.php与之相同的物理目录中,但要相应地重命名-不要忘记更改类名!

编辑:

事实证明,它Mage_Adminhtml_Block_Widget_Grid有一个称为的方法removeColumn-定义为:

/

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

我的猜测是,由于Mage_Adminhtml_Block_Report_Gridextends Mage_Adminhtml_Block_Widget_Grid继承了此方法,因此应该可以使用。在那种情况下,我将创建一个新的块Grid并扩展当前报表所在的Grid。从那里,您可以使用自己的prepareColumns方法,调用parent::_prepareColumns(),然后调用removeColumn.。

祝你好运。


尽管这确实可行,但我希望可以有一种更通用的共享集合的方式,但可以限制用于任何给定块实例的列(显示网格,生成CSV / XML导出等)。实际上,我按照您在答案中建议的方法实施了该报告,但我认为我会寻找一种更优雅的解决方案。
wlvrn 2013年

问题不是集合太多,而是_prepareColumns要引用集合中不存在的索引。虽然有一个“ removeColumn”方法,但是我想说扩展Grid类并调用parent::_prepareColumns(),然后注入您自己的removeColumns方法。
philwinkle

@philwinkle:实际上,我正在使用此方法 magento.stackexchange.com/a/171754/51361 在销售订单网格上添加自定义字段。但是当我导出时,自定义添加的列值未导出,我该如何解决此错误,请您帮帮我。
宝石

5

您可以对要隐藏的列使用set column_css_classheader_css_classas no-display。这将从管理网格中隐藏您的列。但是,此列将出现在导出的csv或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',
  ));

4

_afterLoadCollection()Mage / Adminhtml / Block / Widget / Grid.php中有一个方法可以被覆盖以删除/添加要导出或显示的列$this->_isExport

注意:将其添加到列表_prepareCollection()中将不会起作用,因为将不会提交集合过滤器,从而导致整个集合都将被转储减去任何过滤器。

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

1

如果只需要这些字段作为报告,为什么不只为报告添加它们呢?网格块具有getCollection方法,该方法将返回集合模型,您可以添加报表所需的字段。


网格视图对于允许用户将过滤器应用于报告(日期范围,SKU等)很有用。尽管过滤器使他们能够缩小显示的数据集,但他们可能希望实际的出口包括例如客户信息或构成捆绑订单的构成项目。创建具有所需所有数据的集合,然后在网格视图中仅显示其中一部分(对于管理员视图),却很简单(一个人会想到),但允许导出包含所有数据。不幸的是,收集方法与网格视图紧密相关。
wlvrn 2013年

我了解网格如何工作以及为什么有用,我的意思是csv导出是单独的操作,您在那里创建网格并使用其getCsv准备输出。因此,只需要csv文件的那些字段就可以在getCsv之前添加到网格集合中,这不会比没有实际显示它的情况下对常规网格显示产生更大的负面性能影响
Petar Dzhambazov 2013年

0

简单的方法是

退回Grid.php文件(app / core / Mage / Adminhtml / Block / Sales / Order / Grid.php)

然后像下面一样添加您的自定义列:

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

也改变了

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

这意味着我们必须将自定义列值添加到集合中。为此,我们必须将表与网格收集表连接起来。

现在去检查后端,导出订单。将添加我们的自定义列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.