Thêm một cột để xuất nhưng ẩn khỏi lưới?


8

Tôi đã tạo một báo cáo tùy chỉnh. Báo cáo có một số lượng đáng kể các trường trong đó được yêu cầu khi xuất ở dạng CSV.

Những gì tôi đang cố gắng tìm ra là nếu có một cách để bỏ qua kết xuất của một số trường trên lưới mặt trước. Hầu hết trong số chúng không thực sự quan trọng đối với quá trình lọc trong quản trị viên và chỉ được sử dụng khi báo cáo được tải xuống để phân tích cú pháp bên ngoài Magento.

Tôi hy vọng loại chức năng này sẽ nằm trong lớp lưới vì đó là thứ tạo ra lưới thực tế và sau này, CSV đã xuất nhưng tôi không thấy bất cứ thứ gì trông giống như nó có thể nhìn thấy được.

Trước khi tôi đi vào và ghi đè các phương thức trong lớp này cho báo cáo tùy chỉnh của chúng tôi, có cách nào ít được biết đến để thực hiện việc này dễ hơn so với việc tôi thêm một số loại thuộc tính "showInGrid" thông qua mảng thuộc tính addColumn không?

TL, DR có cách nào dễ dàng để có các trường được xuất (giả sử là CSV hoặc XML) nhưng bị bỏ qua khỏi lưới quản trị không?


Câu trả lời:


3

Tạo một định nghĩa khối riêng - ví dụ: sao chép khối Lưới thành một khối khác dành riêng cho CSV của bạn; Tôi sẽ gọi nó Csvgrid.phpthay vì Grid.php- nó sẽ chứa tất cả các chức năng tương tự như bình thường Grid.phpchứa, nhưng bỏ qua một cột.

Trong bộ điều khiển của bạn:

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

Khi sao chép Lưới, đặt Csvgrid.phpvào cùng thư mục vật lý Grid.phpnhưng đổi tên cho phù hợp - đừng quên thay đổi tên lớp!

Biên tập:

Vì vậy, hóa ra Mage_Adminhtml_Block_Widget_Gridcó một phương thức gọi là removeColumn- được định nghĩa là:

/

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

Tôi đoán là bởi vì nó Mage_Adminhtml_Block_Report_Gridmở rộng Mage_Adminhtml_Block_Widget_Gridnó kế thừa phương pháp này và có thể được sử dụng. Trong trường hợp đó, tôi sẽ tạo một khối Lưới mới và mở rộng Lưới mà báo cáo hiện tại của bạn đang ở. Từ đó bạn có thể sử dụng prepareColumnsphương thức của riêng mình , gọi parent::_prepareColumns()và sau đó gọi removeColumn..

May mắn nhất.


Mặc dù điều này chắc chắn hoạt động, tôi đã hy vọng sẽ có một cách chia sẻ bộ sưu tập được chấp nhận hơn nhưng giới hạn các cột được sử dụng cho bất kỳ trường hợp cụ thể nào của khối (hiển thị lưới, tạo xuất CSV / XML, v.v.). Tôi thực sự đã thực hiện báo cáo theo phương pháp mà bạn đề xuất trong câu trả lời của bạn nhưng tôi nghĩ tôi sẽ tìm một giải pháp thanh lịch hơn.
wlvrn

Vấn đề không phải là bộ sưu tập nhiều vì nó _prepareColumnssẽ tham chiếu đến một chỉ mục không còn tồn tại trong bộ sưu tập nữa. Mặc dù có một phương thức 'removeColumn', tôi muốn nói rằng hãy mở rộng lớp Grid và gọi parent::_prepareColumns(), sau đó thêm removeColumnsphương thức của riêng bạn .
philwinkle

@philwinkle: Thật ra tôi đang sử dụng phương pháp này magento.stackexchange.com/a/171754/51361 , để thêm trường tùy chỉnh trên lưới đặt hàng bán hàng. nhưng khi tôi xuất, các giá trị cột được thêm tùy chỉnh không được xuất, làm thế nào tôi có thể giải quyết lỗi này, bạn có thể giúp tôi không.
Đá quý

5

Bạn có thể sử dụng tập hợp column_css_classheader_css_classnhư no-displaycột bạn muốn ẩn. Điều này sẽ ẩn cột của bạn khỏi lưới quản trị. Tuy nhiên, cột này sẽ có mặt trong csv hoặc xml đã xuất.

$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

Có một phương thức _afterLoadCollection()trong Mage / adminhtml / Block / Widget / Grid.php có thể được ghi đè để xóa / thêm các cột để xuất hoặc hiển thị với $this->_isExport.

LƯU Ý: Thêm phần này vào công việc _prepareCollection()sẽ không hoạt động vì các bộ lọc bộ sưu tập sẽ không được gửi, dẫn đến toàn bộ bộ sưu tập bị trừ đi bất kỳ bộ lọc nào.

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

1

Nếu bạn chỉ cần các trường đó để báo cáo, tại sao bạn không thêm chúng cho báo cáo? Các khối lưới có phương thức getCollection sẽ trả về mô hình bộ sưu tập và bạn có thể thêm các trường bạn cần cho báo cáo của mình.


Chế độ xem lưới rất hữu ích để cho phép người dùng áp dụng các bộ lọc cho báo cáo (phạm vi ngày, sku, v.v.). Mặc dù các bộ lọc cho phép chúng thu hẹp tập dữ liệu được hiển thị, nhưng chúng có thể muốn xuất thực tế bao gồm, giả sử, thông tin khách hàng hoặc các mục cấu thành tạo nên một đơn hàng bó. Đơn giản hơn nhiều (người ta sẽ nghĩ) để tạo ra bộ sưu tập có tất cả dữ liệu bạn cần, và sau đó chỉ hiển thị một số dữ liệu đó trong chế độ xem dạng lưới cho chế độ xem của quản trị viên nhưng cho phép xuất bao gồm tất cả dữ liệu. Thật không may, các phương thức thu thập được gắn chặt với chế độ xem lưới.
wlvrn

Tôi hiểu lưới hoạt động như thế nào và tại sao nó hữu ích, ý tôi là xuất csv là hành động riêng biệt, bạn tạo lưới ở đó và sử dụng getCsv của nó để chuẩn bị đầu ra. Vì vậy, những trường mà bạn chỉ cần cho các tệp csv có thể được thêm vào bộ sưu tập lưới ngay trước getCsv, điều này sẽ không có tác động hiệu quả tiêu cực hơn so với việc hiển thị lưới chung mà không thực sự hiển thị
Petar Dzhambazov

0

Cách dễ dàng để làm điều này là

Quay lại tệp Grid.php (ứng dụng / lõi / Mage / adminhtml / Chặn / Bán hàng / Đặt hàng / Grid.php)

sau đó thêm cột tùy chỉnh của bạn như tôi đã làm dưới đây:

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

cũng đã thay đổi

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

điều này có nghĩa là chúng ta phải thêm giá trị cột tùy chỉnh vào bộ sưu tập. Cho rằng chúng ta phải tham gia bảng của chúng tôi với bảng bộ sưu tập lưới.

Bây giờ đi và kiểm tra phụ trợ, xuất các đơn đặt hàng. sẽ có cột tùy chỉnh của chúng tôi được thêm vào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.