Добавление столбца для экспорта, но скрытие из сетки?
Вопрос
Я создал пользовательский отчет.Отчет содержит значительное количество полей, которые необходимы при экспорте в формате CSV.
Что я пытаюсь выяснить, так это то, есть ли способ опустить рендеринг некоторых полей во интерфейсной сетке.Большинство из них на самом деле не важны для процесса фильтрации в admin и используются только тогда, когда отчет загружается для дальнейшего анализа за пределами Magento.
Я бы ожидал, что этот тип функциональности будет находиться в классе grid, поскольку именно он генерирует фактическую сетку и, позже, экспортированный CSV, но я не вижу ничего, что выглядело бы так, будто это связано с видимостью.
Прежде чем я перейду к переопределению методов в этом классе для нашего пользовательского отчета, есть ли менее известный способ добиться этого, который проще, чем добавление какого-либо свойства "showInGrid" через массив свойств AddColumn?
TL, DR есть ли простой способ экспортировать поля (скажем, в CSV или XML), но исключить их из таблицы администратора?
Решение
Создайте отдельное определение блока - напримердублируйте блок сетки в другой блок, специфичный для вашего 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()
в Mage/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/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();
}
это означает, что мы должны добавить наше пользовательское значение столбца в коллекцию.Для этого мы должны объединить нашу таблицу с таблицей сбора сетки.
Теперь идите и проверьте серверную часть, экспортируйте заказы.там будет добавлена наша пользовательская колонка.