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

8

Я создал собственный отчет. В отчете содержится значительное количество полей, обязательных для заполнения при экспорте в форму CSV.

Я пытаюсь выяснить, есть ли способ пропустить рендеринг некоторых полей в интерфейсной сетке. Большинство из них не очень важны для процесса фильтрации в админке и используются только при загрузке отчета для дальнейшего анализа за пределами Magento.

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

Прежде чем я перейду и переопределю методы в этом классе для нашего пользовательского отчета, существует ли менее известный способ сделать это проще, чем мое добавление какого-либо свойства showInGrid через массив свойств addColumn?

TL, DR. Есть ли простой способ экспортировать поля (скажем, CSV или XML), но пропустить из сетки администратора?

wlvrn
источник
Аналогичный вопрос: magento.stackexchange.com/questions/4398/…
Мукеш Чапагейн

Ответы:

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

При дублировании Grid поместите 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_Gridextends Mage_Adminhtml_Block_Widget_Gridнаследует этот метод и должен иметь возможность его использовать. В этом случае я бы создал новый блок Grid и расширил Grid, в котором находится ваш текущий отчет. Оттуда вы можете использовать свой собственный prepareColumnsметод, вызывать parent::_prepareColumns()и затем вызывать removeColumn..

Удачи.

philwinkle
источник
Хотя это определенно работает, я надеялся, что будет более приемлемый способ совместного использования коллекции, но ограничение столбцов, которые использовались для любого конкретного экземпляра блока (отображение сетки, создание экспорта в CSV / XML и т. Д.). Я фактически реализовал отчет в методе, который вы предложили в своем ответе, но я подумал, что я буду искать более элегантное решение.
wlvrn
Проблема не столько в коллекции, сколько в том, что она _prepareColumnsбудет ссылаться на индекс, которого больше нет в коллекции. В то время как есть метод 'removeColumn', я бы сказал, расширьте класс Grid и вызовите parent::_prepareColumns(), а затем внедрите свой собственный removeColumnsметод.
Philwinkle
@philwinkle: На самом деле я использую этот метод magento.stackexchange.com/a/171754/51361 для добавления настраиваемого поля в сетке заказов на продажу. но когда я экспортирую, пользовательские добавленные значения столбца не экспортируются, как я могу решить эту ошибку, пожалуйста, помогите мне.
Gem
5

Вы можете использовать set column_css_classи header_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');
    }
}
B00MER
источник
1

Если вам нужны только эти поля для отчета, почему бы вам не добавить их только для отчета? Блоки сетки имеют метод getCollection, который возвращает модель коллекции, и вы можете добавить поля, необходимые для вашего отчета.

Петар Джамбазов
источник
Представление сетки полезно для того, чтобы позволить пользователю применять фильтры к отчету (диапазон дат, sku и т. Д.). Хотя фильтры позволяют им сузить отображаемый набор данных, они могут захотеть, чтобы фактический экспорт включал, скажем, информацию о клиентах или составляющие элементы, которые составили заказ на комплект. Гораздо проще (можно подумать) создать коллекцию, которая содержит все необходимые данные, а затем показать только некоторые из них в виде сетки для представления администратора, но разрешить экспорту включить все данные. К сожалению, методы сбора тесно связаны с видом сетки.
wlvrn
Я понимаю, как работает grid и почему он полезен. Я имел в виду, что экспорт csv - это отдельное действие, вы создаете сетку там и используете ее getCsv для подготовки вывода. Таким образом, те поля, которые вам нужны только для CSV-файлов, могут быть добавлены в коллекцию сетки прямо перед getCsv, это не окажет более негативного влияния на производительность, чем это делает для общего отображения сетки без фактического ее отображения
Петар Джамбазов
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();
}

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

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

Прия Поннусамы
источник