Menambahkan kolom untuk diekspor tetapi bersembunyi dari kisi?

8

Saya telah membuat laporan khusus. Laporan ini memiliki sejumlah bidang di dalamnya yang diperlukan saat diekspor dalam bentuk CSV.

Yang saya coba cari tahu adalah apakah ada cara untuk menghilangkan rendering dari beberapa bidang di grid front-end. Sebagian besar dari mereka tidak terlalu penting untuk proses pemfilteran di admin dan hanya digunakan ketika laporan diunduh untuk penguraian lebih lanjut di luar Magento.

Saya berharap ini untuk mengetik fungsionalitas untuk berada di kelas grid karena itulah yang menghasilkan grid yang sebenarnya dan, kemudian, CSV yang diekspor, tetapi saya tidak melihat apa pun yang terlihat berhubungan dengan visibilitas.

Sebelum saya masuk dan menimpa metode di kelas ini untuk laporan kustom kami, apakah ada cara yang kurang diketahui untuk melakukannya lebih mudah daripada saya menambahkan beberapa jenis properti "showInGrid" melalui array properti addColumn?

TL, DR apakah ada cara mudah untuk mengekspor bidang (misalnya, CSV atau XML) tetapi dihilangkan dari kisi admin?

wlvrn
sumber
Pertanyaan serupa: magento.stackexchange.com/questions/4398/…
Mukesh Chapagain

Jawaban:

3

Buat definisi blok terpisah - mis. Duplikat blok Grid ke blok lain yang khusus untuk CSV Anda; Saya akan menyebutnya Csvgrid.phpsebagai ganti Grid.php- ini akan berisi semua fungsi yang sama yang Grid.phpberisi normal , tetapi mengabaikan satu kolom.

Di controller Anda:

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

Saat menduplikasi Grid, tempatkan Csvgrid.phpke direktori fisik yang sama Grid.phptetapi ubah nama sesuai - jangan lupa untuk mengubah nama kelas!

Edit:

Jadi ternyata Mage_Adminhtml_Block_Widget_Gridada metode yang disebut removeColumn- didefinisikan sebagai:

/

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

Dugaan saya adalah karena Mage_Adminhtml_Block_Report_Gridextends Mage_Adminhtml_Block_Widget_Gridmewarisi metode ini dan harus dapat digunakan. Saya akan, dalam hal ini, membuat blok Grid baru dan memperpanjang Grid bahwa laporan Anda saat ini. Dari sana Anda dapat menggunakan prepareColumnsmetode Anda sendiri , panggil parent::_prepareColumns()dan kemudian panggil removeColumn..

Semoga berhasil.

Philwinkle
sumber
Meskipun ini pasti berhasil, saya berharap akan ada cara yang lebih diterima untuk berbagi koleksi tetapi membatasi kolom yang digunakan untuk setiap contoh blok (menampilkan kotak, menghasilkan ekspor CSV / XML, dll). Saya sebenarnya menerapkan laporan dalam metode yang Anda sarankan dalam jawaban Anda, tetapi saya pikir saya akan mencari solusi yang lebih elegan.
wlvrn
Masalahnya bukan koleksi begitu banyak _prepareColumnsyang akan referensi indeks yang tidak ada dalam koleksi lagi. Meskipun ada metode 'removeColumn', saya akan mengatakan memperpanjang kelas Grid dan memanggil parent::_prepareColumns(), lalu menyuntikkan removeColumnsmetode Anda sendiri .
philwinkle
@ philwinkle: Sebenarnya saya menggunakan metode ini magento.stackexchange.com/a/171754/51361 , untuk menambahkan bidang khusus pada kisi pesanan penjualan. tetapi ketika saya ekspor, nilai kolom tambah kustom tidak diekspor, bagaimana saya bisa mengatasi kesalahan ini, bisakah Anda tolong saya.
Permata
5

Anda dapat menggunakan set column_css_classdan header_css_classsebagai no-displaykolom yang ingin Anda sembunyikan. Ini akan menyembunyikan kolom Anda dari kisi admin. Namun, kolom ini akan ada di csv atau xml yang diekspor.

$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',
  ));
Mukesh Chapagain
sumber
4

Ada metode _afterLoadCollection()di Mage / Adminhtml / Block / Widget / Grid.php yang dapat diganti untuk menghapus / menambah kolom untuk ekspor atau tampilan $this->_isExport.

CATATAN: Menambahkan ini ke _prepareCollection()tidak akan berfungsi karena filter pengumpulan tidak akan dikirimkan, sehingga seluruh koleksi dibuang tanpa filter apa pun.

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

Jika Anda hanya membutuhkan bidang-bidang itu untuk laporan, mengapa Anda tidak menambahkannya untuk laporan saja? Blok kotak memiliki metode getCollection yang akan mengembalikan model pengumpulan dan Anda dapat menambahkan bidang yang Anda butuhkan untuk laporan Anda.

Petar Dzhambazov
sumber
Tampilan kisi berguna untuk memungkinkan pengguna menerapkan filter ke laporan (rentang tanggal, sku, dll). Sementara filter memungkinkan mereka untuk mempersempit kumpulan data yang ditampilkan, mereka mungkin ingin ekspor aktual menyertakan, katakanlah, informasi pelanggan atau item konstituen yang membentuk pesanan bundel. Jauh lebih sederhana (orang akan berpikir) untuk membuat koleksi yang memiliki semua data yang Anda butuhkan, dan kemudian hanya menunjukkan sebagian dari itu dalam tampilan grid untuk tampilan admin tetapi memungkinkan ekspor untuk memasukkan semua data. Sayangnya, metode pengumpulan terikat erat dengan tampilan kisi.
wlvrn
Saya mengerti bagaimana grid berfungsi dan mengapa ini membantu, yang saya maksudkan adalah bahwa csv export adalah tindakan terpisah, Anda membuat grid di sana dan menggunakan getCsv untuk menyiapkan output. Jadi bidang-bidang yang Anda perlukan hanya untuk file csv dapat ditambahkan ke koleksi grid tepat sebelum getCsv, ini tidak akan memiliki dampak kinerja yang lebih negatif daripada melakukannya untuk tampilan grid umum tanpa benar-benar menampilkannya
Petar Dzhambazov
0

Cara mudah untuk melakukannya adalah

Kembalikan file Grid.php (app / core / Mage / Adminhtml / Block / Sales / Order / Grid.php)

kemudian tambahkan kolom khusus Anda seperti yang saya lakukan di bawah ini:

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

juga membuat perubahan

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

ini berarti kami harus menambahkan nilai kolom khusus kami ke koleksi. Untuk itu kita harus bergabung dengan tabel kita dengan tabel kumpulan grid.

Sekarang pergi dan periksa backend, ekspor pesanan. akan ada kolom khusus kami ditambahkan.

Priya Ponnusamy
sumber