Menu

Magento 010: Các kiểu dữ liệu hiển thị trong grid admin Magento (part 2)

Trong Tut Magento 009 mình đã giới thiệu với các bạn những kiểu dữ liệu cơ bản nhất được hiển thị trong grid admin của Magento như text, date, number, select… tuy nhiên trong thực tế thì sẽ còn rất nhiều kiểu dữ liệu khác mà ta cần đưa vào như: link, email, store, image. Trong bài học này mình sẽ hướng dẫn các bạn làm với nhữn loại dữ liệu này.

Vẫn sử dụng ví dụ Basetut_Salestaff của Tut Magento 008 và Tut Magento 009 nhưng mình sẽ không hướng dẫn các bạn chi tiết từ update dữ liệu nữa mà sẽ đi ngay vào phần chính.

Giả sử trong bảng salestaff_staff ta đã có các fields sau:

+ store_id: store của nhân viên bán hàng

+ email: địa chỉ email

+ facebook_url: địa chỉ facebook

+ avatar: hình đại diện

Bây giờ nhiệm vụ của ta là hiển thị những trường dữ liệu này trên grid đúng với định dạng của nó:

+store_id: là 1 option cho phép admin có thể filter theo store

+ email: admin có thể send mail trực tiếp

+ facebook_url: link cho phép admin xem trang profile của nhân viên

+ avatar: ảnh hiển thị ngay trên grid

1. Store (store_id)

store

Code trong file Grid.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (!Mage::app()->isSingleStoreMode()) {
    $this->addColumn('store_id', array(
        'header'    => Mage::helper('salestaff')->__('Store view'),
        'align'     =>'left',
        'index'     =>'store_id',
        'type'      =>'store',
        'width'     => '150px',
        'store_all' =>true,
        'store_view'=>true,
        'sortable'      => false,
        'filter_condition_callback'
            => array($this, '_filterStoreCondition'),
  ));
}

Trong đoạn code này cần chú ý đến phần check điều kiện:

1
2
3
if (!Mage::app()->isSingleStoreMode()) {
...
}

Đoạn này có tác dụng check xem website có đang để ở chế độ sing store hay không, nếu có thì không cần show cột này ra nữa.

Thứ hai là ta phải viết thêm 1 hàm filter đã khai báo tên ở trên “_filterStoreCondition”:

1
2
3
4
5
6
7
8
protected function _filterStoreCondition($collection, $column)
{
    if (!$value = $column->getFilter()->getValue()) {
        return;
    }
    $this->getCollection()->addFieldToFilter('store_id', $value);
}

2. Email

email

Code trong file Grid.php:

1
2
3
4
5
6
$this->addColumn('email', array(
    'header'    => Mage::helper('salestaff')->__('Email'),
    'align'     =>'left',
    'index'     => 'email',
    'renderer'  =>   'salestaff/adminhtml_staff_renderer_email'
));

Để ý trong đoạn code này ta sẽ thấy có 1 tham số là ‘renderer’ => ‘salestaff/adminhtml_staff_renderer_email’

Bởi vì mặc định Magento không hỗ trợ kiểu email trên grid nên ta phải viết thêm 1 class renderer cho field này:
appcodelocalBasetutSalestaffBlockAdminhtmlStaffRendererEmail.php

1
2
3
4
5
6
7
8
<!--?php  class Basetut_Salestaff_Block_Adminhtml_Staff_Renderer_Email   extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract {     /* Render Grid Column*/     public function render(Varien_Object $row)      {       if($row--->getEmail())
            return sprintf('
                <a href="mailto:%s">%s</a>',
                $row->getEmail(),
                $row->getEmail()
            );
    }
}

Chú ý: class này phải extends từ class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract

3. Link

Kiểu này làm tương tự kiểu email.
link

Code trong file Grid.php:

1
2
3
4
5
6
$this->addColumn('facebook_url', array(
    'header'    => Mage::helper('salestaff')->__('Facebook Url'),
    'align'     =>'left',
    'index'     => 'facebook_url',
    'renderer'  =>   'salestaff/adminhtml_staff_renderer_link'
));

File renderer: appcodelocalBasetutSalestaffBlockAdminhtmlStaffRendererLink.php

1
2
3
4
5
6
7
8
<!--?php  class Basetut_Salestaff_Block_Adminhtml_Staff_Renderer_Link    extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract {     /* Render Grid Column*/     public function render(Varien_Object $row)      {       if($row--->getFacebookUrl())
            return sprintf('
                <a href="%s">%s</a>',
                $row->getFacebookUrl(),
                $row->getFacebookUrl()
            );
    }
}

4. Image
avatar

Code trong file Grid.php:

1
2
3
4
5
6
7
8
$this->addColumn('avatar', array(
    'header'    => Mage::helper('salestaff')->__('Avatar'),
    'align'     =>'left',
    'index'     => 'avatar',
    'sortable'      => false,
    'filter'      => false,
    'renderer'  =>   'salestaff/adminhtml_staff_renderer_avatar'
));

File renderer: appcodelocalBasetutSalestaffBlockAdminhtmlStaffRendererAvatar.php

1
2
3
4
5
6
7
8
<!--?php  class Basetut_Salestaff_Block_Adminhtml_Staff_Renderer_Avatar  extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract {     /* Render Grid Column*/     public function render(Varien_Object $row)      {       if($row--->getAvatar())
            return sprintf('
                <a href="%s">%s</a>',
                Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'/salestaff/'.$row->getAvatar(),
                '<img alt="" src="'.Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'/salestaff/'.$row->getAvatar().'" width="150" />'
            );
    }
}

Kết luận: với hai tut Magento 009 và Magento 010 mình đã giới thiệu tới các bạn gần như tất cả những loại dữ liệu hiển thị trên grid admin của Magento. Mặc dù sẽ còn nhiều kiểu dữ liệu ngoài luồng mà có thể các bạn sẽ phải dùng đến nhưng mình tin rằng sau khi đọc xong 2 tut này thì các bạn cũng không có gì phải lo lắng cả. Chúc các bạn thành công với Magento.

Facebook Comments

No comments

Trả lời