添加一列以导出但隐藏在网格中?
题
我创建了一个自定义报告。该报告中有大量的字段,当该报告以CSV形式导出时所需的字段。
我要弄清楚的是,是否有一种方法可以省略前端网格上某些字段的渲染。它们中的大多数对于管理员的过滤过程并不重要,只有在下载报告以在Magento之外进行进一步解析时才使用。
我希望这种功能类型能够驻留在网格类中,因为这是生成实际网格的原因,后来是导出的CSV,但我看不到任何看起来像可见性的东西。
在我进入本类中的自定义报告中,是否有一种鲜为人知的方法来实现这一目标,这比我通过AddColumn属性数组添加某种“显示Rid”属性更容易?
TL,DR是否有一种简单的方法可以导出字段(例如,CSV或XML),但被admin网格省略了?
解决方案
创建一个单独的块定义 - 例如将网格块复制到针对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.php
进入与相同的物理目录 Grid.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_Grid
扩展 Mage_Adminhtml_Block_Widget_Grid
它继承了此方法,应能够使用。在这种情况下,我会创建一个新的块网格,并扩展您当前报告所在的网格。从那里您可以使用自己的 prepareColumns
方法,调用 parent::_prepareColumns()
然后致电 removeColumn
..
祝您好运。
其他提示
您可以使用集合 column_css_class
和 header_css_class
作为 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',
));
有一种方法 _afterLoadCollection()
在法师/adminhtml/block/widget/grid.php中,可以覆盖以删除/添加用于导出或显示的列 $this->_isExport
.
笔记: 将其添加到 _prepareCollection()
由于收集过滤器不会提交,因此无法使用,从而导致整个集合倾倒了所有过滤。
protected function _afterLoadCollection() {
if(!$this->_isExport) {
$this->removeColumn('columnToRemove');
}
}
如果您只需要这些字段进行报告,为什么不仅以报告添加它们?网格块具有GetCollection方法,该方法将返回收集模型,您可以添加报告所需的字段。
这样做的简单方法是
退回grid.php文件(app/core/mage/adminhtml/block/sales/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();
}
这意味着我们必须将自定义列值添加到集合中。为此,我们必须与网格收集表一起加入我们的桌子。
现在去检查后端,导出订单。将添加我们的自定义列。