Định dạng block

Events happening in the community are now at Drupal community events on www.drupal.org.
thehong's picture

@TODO: phiên bản thô, còn chỉnh sửa.

Sử dụng Drupal để xây dựng các ứng dụng web, chắc chắn có lúc, chúng ta cần định dạng các block theo region, theo module, ... Thí dụ, chúng ta font chữ ở các block bên trái nhỏ hơn các block phía bên phải, các block bên phải có màu sắc, độ bo viềng khác với các block ở footer, ... yêu cầu tưởng chừng khó khăn, nhưng trở nên rất dễ dàng. Chúng ta thử xem hàm tạo block mặc định của Drupal:

<?php
function theme_block($block) {
 
$output  = "<div class=\"block block-$block->module\" id=\"block-$block->module-$block->delta\">\n";
 
$output .= " <h2 class=\"title\">$block->subject</h2>\n";
 
$output .= " <div class=\"content\">$block->content</div>\n";
 
$output .= "</div>\n";
  return
$output;
}
?>

Khi mỗi block được sinh ra, chúng đều được gán cho các class, id cần thiết, rất tiện cho việc định dạng chúng thông qua CSS. Ở hàm tạo block mặc định trên, thì block được sinh ra, chưa có class để chỉ định region của nó, do đó, chúng ta cần phải, hoặc (i) sửa hàm theme_block (hack code, điều không được khuyến khích khi sử dụng Drupal), (ii) viết một hàm thay thế (thật may mắn, Drupal có hỗ trợ.
- Theo các giải quyết thứ nhất, chúng ta có thể hack code như sau:

<?php
function theme_block($block) {
 
$output  = "<div class=\"block block-$block->module block-$block->module-$block->region\" id=\"block-$block->module-$block->delta\">\n";
 
$output .= " <h2 class=\"title\">$block->subject</h2>\n";
 
$output .= " <div class=\"content\">$block->content</div>\n";
 
$output .= "</div>\n";
  return
$output;
}
?>

- Theo cách thứ hai, tên hàm thay thế sẽ có dạng YourThemName_block, trong đó, YourThemeName là tên theme chúng ta đang sử dụng:
<?php
function YourThemeName_block($block) {
 
$output  = "<div class=\"block block-$block->module block-$block->module-$block->region\" id=\"block-$block->module-$block->delta\">\n";
 
$output .= " <h2 class=\"title\">$block->subject</h2>\n";
 
$output .= " <div class=\"content\">$block->content</div>\n";
 
$output .= "</div>\n";
  return
$output;
}
?>

Bằng cách viết hàm thay thế, chúng ta có thể làm nhiều việc hơn là thêm một class vào block.

<?php
function YourThemeName_block ($block) {
  switch (
$block->module) {
    case
'foo':
      return
'...';
    case
'bar':
      return
'...';
    default:
      return
'...';
  }
}
?>

Tuy nhiên, để tiện lợi hơn cho việc thiết kế, chúng ta có thể định dạng block thông qua các tập tin .tpl.php được đặt dưới thư mục theme đang sử dụng. Nếu không tìm thấy hàm thay thế, Drupal sẽ tìm các tập tin định dạng block với độ ưu tiên:

* block-[module]-[delta].tpl.php
* block-[module].tpl.php
* block-[region].tpl.php
* block.tpl.php

Thế Hồng

Comments

híc, dân a-mai-tơ như

mrkyt's picture

híc, dân a-mai-tơ như mình mà đọc cái này, híc, hoa hết cả mắt

Rất bổ ích

huongsir's picture

Bác THEHONg nhiệt tình quá, hướng dẫn rất nhiều bài viết hay.

E là dân "tỉnh lẻ lên thành phố" mà đọc mấy bài này như kiểu ngộ không tìm được sư phụ ấy

ước gì bác nhận e làm đệ tử :D

YM của e: xuanhuong0609

Cảm ơn anh Thehong, có nhiều

luatviettin's picture

Cảm ơn anh Thehong, có nhiều bài viết hay cho dân tình tham khảo và học hỏi, quả nhiên drupal hội tụ nhiều tinh anh vào thành một cộng đồng, hiếm thấy các mã nguồn mở lại có cái nào như Drupal !