Добавление столбца для экспорта, но скрытие из сетки?

magento.stackexchange https://magento.stackexchange.com/questions/369

Вопрос

Я создал пользовательский отчет.Отчет содержит значительное количество полей, которые необходимы при экспорте в формате 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();
}

это означает, что мы должны добавить наше пользовательское значение столбца в коллекцию.Для этого мы должны объединить нашу таблицу с таблицей сбора сетки.

Теперь идите и проверьте серверную часть, экспортируйте заказы.там будет добавлена наша пользовательская колонка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top