Menu

Magento 011: Actions trong grid Magento admin

Trong Tut Magento 008, Tut Magento 009, Tut Magento 010 mình đã hướng dẫn các bạn tạo ra những grid với đầy đủ các loại dữ liệu hiển thị nhưng vẫn chưa đưa ra những action mà liên quan đến những dữ liệu trong grid đó như: export ra file csv, mass action change status hay delete cùng một lúc nhiều bản ghi.

Trong Tut Magento 011 này mình sẽ giới thiệu với các bạn hai chức năng rất quan trọng đó là:

+ Export dữ liệu trong grid ra file csv, xml

+ Mass actions cho grid

1. Export dữ liệu trong grid ra file csv, xml

export

Để hiển thị select box cho phép admin chọn export bằng csv hoặc xml thì chỉ cần thêm một đoạn code vào cuối hàm _prepareColumns trong file Grid.php:

1
2
$this->addExportType('*/*/exportCsv', Mage::helper('salestaff')->__('CSV'));
$this->addExportType('*/*/exportXml', Mage::helper('salestaff')->__('XML'));

Trong hàm addExportType cần 2 tham số:

+ Action: action thực hiện việc export ra file

+ Label: label hiển thị ra ngoài select box

Nhưng các bạn hãy để ý action truyền vào hàm này dưới dạng thu gọn: */*/exportCsv.

+ Dấu * thứ nhất là router name hiện tại tức ‘salestaffadmin’.

+ Dấu * thứ hai là controller name hiện tại tức ‘staff’.

+ exportCsv: action thực hiện việc export

Như vậy ta cần phải viết thêm action export trong file: appcodelocalBasetutSalestaffcontrollersAdminhtmlStaffController.php:

1
2
3
4
5
6
7
8
9
10
/**
 * export grid staff to CSV type
 */
public function exportCsvAction() {
 $fileName = 'salestaff.csv';
 $content = $this->getLayout()
 ->createBlock('salestaff/adminhtml_staff_grid')
 ->getCsv();
 $this->_prepareDownloadResponse($fileName, $content);
}

Trong hàm này sẽ gọi đến hàm getCsv của block grid hiển thị trước khi đẩy ra file csv bằng hàm: _prepareDownloadResponse.

Tương tự đối với action export ra file xml:

1
2
3
4
5
6
7
8
9
10
/**
 * export grid staff to XML type
 */
public function exportXmlAction() {
 $fileName = 'salestaff.xml';
 $content = $this->getLayout()
 ->createBlock('salestaff/adminhtml_staff_grid')
 ->getXml();
 $this->_prepareDownloadResponse($fileName, $content);
}

2. Mass action cho grid

Tác dụng: ta sử dụng mass action khi muốn thao tác với nhiều bản ghi trong grid cùng một lúc mà không cần phải edit từng bản ghi một.

Ví dụ: xóa hay thay đổi status của nhiều staff một lúc.

* Mass delete

delete

Hàm chuẩn bị mass action trong file Grid.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * prepare mass action for this grid
 *
 * @return Basetut_Salestaff_Block_Adminhtml_Staff_Grid
 */
 protected function _prepareMassaction() {
 $this->setMassactionIdField('staff_id');
 $this->getMassactionBlock()->setFormFieldName('staff');
 
$this->getMassactionBlock()->addItem('delete', array(
 'label' => Mage::helper('salestaff')->__('Delete'),
 'url' => $this->getUrl('*/*/massDelete'),
 'confirm' => Mage::helper('salestaff')->__('Are you sure?')
 ));
 return $this;
 }

Trong hàm này ta đã add một item là delete vào trong mass action block nên sau khi add xong trên grid có xuất hiện phần mass delete như hình minh họa ở trên. Tuy nhiên đây chỉ là phần khai báo và để sử dụng được ta vẫn phải viết thêm action cho nó, cụ thể ở đây là: */*/massDelete.

Thêm action massDelete vào trong controller Basetut_Salestaff_Adminhtml_StaffController:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * mass delete staff(s) action
 */
public function massDeleteAction() {
 $staffIds = $this->getRequest()->getParam('staff');
 if (!is_array($staffIds)) {
 Mage::getSingleton('adminhtml/session')->addError(Mage::helper('adminhtml')->__('Please select staff(s)'));
 } else {
 try {
 foreach ($staffIds as $staffId) {
 $staff = Mage::getModel('salestaff/staff')->load($staffId);
 $staff->delete();
 }
 Mage::getSingleton('adminhtml/session')->addSuccess(
 Mage::helper('adminhtml')->__('Total of %d record(s) were successfully deleted', count($staffIds))
 );
 } catch (Exception $e) {
 Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
 }
 }
 $this->_redirect('*/*/index');
}

+ $staffIds: danh sách id của những staff đã được select trước khi delete, chú ý rằng tham số ‘staff’ truyền vào hàm $this->getRequest()->getParam(‘staff’) chính là tên của grid đã set trong hàm _prepareMassation:

$this->getMassactionBlock()->setFormFieldName(‘staff’);

+ Xóa thành công thì đưa ra thông báo

Mage::helper(‘adminhtml’)->__(‘Total of %d record(s) were successfully deleted’, count($staffIds));

+ Xóa gặp lỗi thì sẽ hiển thị lỗi:

Mage::getSingleton(‘adminhtml/session’)->addError($e->getMessage());

Như vậy ta vừa mới hoàn thành 1 mass action đó là: delelte. Bây giờ ta có thể xóa nhiều staff mà không phải vào edit từng staff một.

* Mass change status

Viết tương tự như với mass action delete:

Để hiển thị mass change status ta chỉ cần thêm 1 đoạn code vào hàm _prepareMassation đã viết vừa rồi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
protected function _prepareMassaction() {
 $this->setMassactionIdField('staff_id');
 $this->getMassactionBlock()->setFormFieldName('staff');
 
$this->getMassactionBlock()->addItem('delete', array(
 'label' => Mage::helper('salestaff')->__('Delete'),
 'url' => $this->getUrl('*/*/massDelete'),
 'confirm' => Mage::helper('salestaff')->__('Are you sure?')
 ));
 /*mass change status*/
 $statuses = array(
 1 => Mage::helper('salestaff')->__('Enabled'),
 2 => Mage::helper('salestaff')->__('Disabled')
 );
 array_unshift($statuses, array('label' => '', 'value' => ''));
 $this->getMassactionBlock()->addItem('status', array(
 'label' => Mage::helper('salestaff')->__('Change status'),
 'url' => $this->getUrl('*/*/massStatus', array('_current' => true)),
 'additional' => array(
 'visibility' => array(
 'name' => 'status',
 'type' => 'select',
 'class' => 'required-entry',
 'label' => Mage::helper('salestaff')->__('Status'),
 'values' => $statuses
 ))
 ));
 return $this;
}

Kết quả sau khi thêm:

changestatus

Công việc cuối cùng cần phải viết đó là action thực hiện công việc change status cho một loạt staff được chọn:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * mass change status for staff(s) action
 */
public function massStatusAction() {
 $staffIds = $this->getRequest()->getParam('staff');
 if (!is_array($staffIds)) {
 Mage::getSingleton('adminhtml/session')->addError($this->__('Please select staff(s)'));
 } else {
 try {
 foreach ($staffIds as $staffId) {
 Mage::getSingleton('salestaff/staff')
 ->load($staffId)
 ->setStatus($this->getRequest()->getParam('status'))
 ->setIsMassupdate(true)
 ->save();
 }
 $this->_getSession()->addSuccess(
 $this->__('Total of %d record(s) were successfully updated', count($staffIds))
 );
 } catch (Exception $e) {
 $this->_getSession()->addError($e->getMessage());
 }
 }
 $this->_redirect('*/*/index');
}

Source code: basetut_salestaff_1.1
Kết luận: sau bài học này các bạn có thể sử dụng mass action cho grid dữ liệu trong Magento một cách hiệu quả nhất. Chúc các bạn thành công với Magento.

Facebook Comments

No comments

Trả lời