Zend Framework: Zend_View Standard Placeholders

  • PHP and Mysql
  • 25 tháng 09 2012
  • bởi Văn Khương
  • 0 Comments

Hầu hết các placeholder được dùng cho việc tạo ra nội dung cho phần tử <head>, một vùng tiêu biểu không thể thao tác trực tiếp bằng tay thông qua những ứng dụng view script của bạn, chẳng hạn bạn muốn tạo ra đánh dấu thẻ <title> cho phần tiêu đề cho từng nội dung khác nhau trên mỗi trang, nhưng nội dung cụ thể thì được tạo thông qua controller - action. Bạn muốn những tập tin CSS riêng cho từng ứng dụng hay bạn cần những tập tin javaScript được tải ở những thời điểm khác nhau hay bạn muốn khai báo Doctype. Chúng ta sẽ tìm hiểu cụ thể sau đây

protected function _initPlaceholders(){
 $this->bootstrap('View');
 $view = $this->getResource('View');
 $view->doctype('XHTML1_STRICT');// or TRANSITIONAL or HTML5 etc
 // Tạo thẻ tiêu đề
 $view->headTitle('My Site')->setSeparator(' :: ') ->append('sothichweb.com');
       
 // Tạo thẻ meta
 $view->headMeta()->prependName("keyword","mot so keyword");
 $view->headMeta()->offsetSetName( "1", "description", "Mot so bai huong dan ZF" );

 // Tạo thẻ liên kết tập tin CSS
 $view->headLink()->prependStylesheet( "/Zend_framework/Demo07/public/css/style.css" );

 // Tạo thẻ liên kết tập tin javaScript
 $view->headScript()->prependFile( "/Zend_framework/Demo07/public/js/jquery-1.4.2.min.js" );
}

Ở trên ta đã sử dụng các đối tượng Zend_View_Helper để giúp tạo ra các thẻ HTML, phương thức _initPlaceholders() là khởi chạy mặc định khi gọi tới boostrap, nên các thẻ được tạo ra sẽ được sử dụng cho tất cả các trang được khởi chạy từ bootstrap này, bạn sẽ xuất các thẻ này trong tập tin layout của bạn ở phần tử <head>. Xem kết quả trên trình duyệt bạn sẽ nhận được như sau:

<head>
  <title>My Site :: sothichweb.com</title>
  <meta name="keywords" content="mot so keyword" />
  <meta name="description" content="Mot so bai huong dan ZF" />
  <link href="/Zend_framework/Demo01/public/css/style.css" media="screen" rel="stylesheet" type="text/css" />
  <script type="text/javascript" src="/Zend_framework/Demo07/public/js/jquery-1.4.2.min.js"></script>
</head>

Sau này ta có thể thêm các thẻ vào từng Controller hay Action riêng bằng cách cách sử dụng các đối tượng Zend_View_Helper trong các view tương ứng.
Sau đây chúng ta sẽ tìm hiểu một số phương thức đặc biệt của các Zend_View_Helper có ích trong việc tạo nội dung cho phần <head>.

Zend_View_Helper_HeadLink

  • appendStylesheet($href, $media, $conditionalStylesheet, $extras)
  • offsetSetStylesheet($index, $href, $media, $conditionalStylesheet, $extras)
  • prependStylesheet($href, $media, $conditionalStylesheet, $extras)
  • setStylesheet($href, $media, $conditionalStylesheet, $extras)

Giải thích thêm: bạn nhớ rằng append là thêm phía sau, prepend là thêm phía trước, offset là thêm theo chỉ mục tức là theo vị trí bạn xét, setStylesheet là thêm vào và hủy tất cả các thẻ <link> stylesheet trước đó đã khai báo. Về các tham số: href là đường dẫn tới file, media xác định dạng CSS sử dụng cho các trường hợp như "screen" hay "print" mặc định là "screen", conditionalStylesheet là có sử dụng bình luận điều kiện lọc trình duyệt IE hay không nếu có thì thêm vào chuỗi điều kiện ví dụ "lt IE 9", extras là  một mảng bạn có thể thêm vào một số thuộc tính của thẻ bạn muốn. Ví dụ trong view script của một action nào đó tôi thêm như sau:

$baseUrl = $this->baseUrl();
$this->headLink()->offsetSetStylesheet( 1,$baseUrl."/public/css/style1.css", "print", 'lte 9', array('id'=>'print') );

Kết quả trả về trên trình duyệt sẽ như sau:

<!--[if lte 9]> <link href="/Zend_framework/Demo07/public/css/style1.css" media="print" rel="stylesheet" type="text/css" id="print" /><![endif]-->

Zend_View_Helper_HeadMeta

Tạo ra các phần tử <meta> được sử dụng để cung cấp những thông tin về tài liệu HTML của bạn như keywords, description, Content-Type ...

  • appendName($keyValue, $content, $conditionalName)
  • offsetSetName($index, $keyValue, $content, $conditionalName)
  • prependName($keyValue, $content, $conditionalName)
  • setName($keyValue, $content, $modifiers)
  • appendHttpEquiv($keyValue, $content, $conditionalHttpEquiv)
  • offsetSetHttpEquiv($index, $keyValue, $content, $conditionalHttpEquiv)
  • prependHttpEquiv($keyValue, $content, $conditionalHttpEquiv)
  • setHttpEquiv($keyValue, $content, $modifiers)
  • setCharset($charset)

Giải thích thêm: tham số keyValue là giá trị của thuộc tính name hoặc http-equiv điều này xác định chức năng hay loại thông tin mà phần tử <meta> cung cấp, content là nội dung phần tử meta

Zend_view_Helper_HeadScript

Tạo ra phần tử <script> cung cấp liên kết tới tập tin hay đoạn chương trình javaScript

  • appendFile($src, $type = 'text/javascript', $attrs = array())
  • offsetSetFile($index, $src, $type = 'text/javascript', $attrs = array())
  • prependFile($src, $type = 'text/javascript', $attrs = array())
  • setFile($src, $type = 'text/javascript', $attrs = array())
  • appendScript($script, $type = 'text/javascript', $attrs = array())
  • offsetSetScript($index, $script, $type = 'text/javascript', $attrs = array())
  • prependScript($script, $type = 'text/javascript', $attrs = array())
  • setScript($script, $type = 'text/javascript', $attrs = array())

Giải thích thêm: những phương thức có kiểu  *File() có tham số src nhằm cung cấp đường dẫn tới tập tin javaScript, tham số type mặc định sẽ là text/javascript, tham số attrs là một mảng cho biết thêm thông tin về phần tử ta có thể thêm phần tử conditional vào mảng này để sử dụng bình luận lọc trình duyệt IE. Ví dụ trong view script của một action nào đó tôi thêm như sau:

$baseUrl = $this->baseUrl();
$this->headScript()->appendFile( $baseUrl."/public/js/jquery-1.4.2.js", 'text/javascript', array('conditional'=>'lt IE 9') );

Kết quả trả về trên trình duyệt sẽ như sau:

<!--[if lt IE 9]> <script type="text/javascript" src="/Zend_framework/Demo07/public/js/jquery-1.4.2.js"></script><![endif]-->

Những phương thức kiểu *Script() sẽ xác định trực tiếp kịch bản javaScript bạn muốn sử dụng, điều này có nhiều ý nghĩa trong những trường hợp bạn khởi chạy một ứng dụng javaScript nào đó ngay sau khi tạo liên kết tới tới ứng dụng trong tập tin javaScript bên ngoài. Bạn hãy xem thử ví dụ sau để hiểu rõ điều này:

$alertScript = 'alert("su dung appendScript");';
$this->headScript()->appendScript($alertScript);

Kết quả ví dụ trên chỉ đơn giản là hiển thị một hộp alert(), đoạn mã trên đã thêm vào <head> một kịch bản javaScript như sau:

<script type="text/javascript">
//<![CDATA[
alert("su dung appendScript");
//]]>
</script>

Nếu bạn muốn tạo ra một kịch bản trực tiếp trên trang thay vì bỏ rải rác khắp nơi trong tài liệu HTML bạn có thể tập chung viết vào phần tử <head> với phương thức captureStart() captureEnd(). Ví dụ trong view script của một action nào đó tôi thêm như sau:

<?php $this->headScript()->captureStart() ?>
var action = '<?php echo $this->baseUrl() ?>';
$('foo_form').action = action;
<?php $this->headScript()->captureEnd() ?>

Kết quả trên sẽ như sau:

<script type="text/javascript">
//<![CDATA[
var action = '/Zend_framework/Demo07';
$('foo_form').action = action;
//]]>
</script>

Zend_View_Helper_HeadStyle

Tạo ra phần tử <style> đưa CSS trực tiếp vào nội dung phần tử <head>

  • appendStyle($content, $attributes = array())
  • offsetSetStyle($index, $content, $attributes = array())
  • prependStyle($content, $attributes = array())
  • setStyle($content, $attributes = array())

Content là nội dung CSS đưa vào, tham số attributes là  một mảng để thêm một số thông tin về thẻ như media, lang, title mà hữu ích nhất là conditional tạo ra bình luận điều kiện lọc trình duyệt IE. Ví dụ trong view script của một action nào đó tôi thêm như sau:

$styles = 'body{background-color: #ccc;}';
$this->headStyle()->appendStyle($styles, array('conditional'=>'lt IE 7', 'media'=>'print'));

Kết quả trên sẽ như sau:

<!--[if lt IE 7]> <style type="text/css" media="print">
body{background-color: #ccc;}
</style><![endif]-->

Nếu muốn viết CSS trực tiếp trên trang vào phần tử <head> ta có thể sử dụng một số phương thức capture giống như headScript ở trên.

Zend_View_Helper_HeadTitle

Tạo ra phần tử <title>, trong phương thức _initPlaceholders() của file bootstrap ở đầu bài viết có thực hiện tạo ra một phần tử <title> với nội dung 'My Site :: sothichweb.com'.
Nếu bạn muốn thay đổi toàn bộ <title> có thể thay đổi các tham số trong phương thức headTitle, tham số đầu là nội dung title chính, tham số thứ hai là cách thức thay đổi tiêu đề có thể là SET, APPEND, hay PREPEND. Để tạo ra separator bạn sử dụng tiếp phương thức setSeparator(). Để thêm hoặc thay nội dung sau hay trước separator của title bạn sẽ sử dụng tiếp các phương thức như append(), prepend(), set().

Ví dụ  trong view script của một action nào đó nếu bạn muốn thay đổi <title> thành  'My Site :: Thiết kế và lập trình web' có thể thực hiện như sau:

$this->headTitle()->append('Thiết kế và lập trình web');

Nếu muốn thay đổi thành 'Thiết kế và lập trình web :: My Site' bạn sẽ thay phương thức append thành prepend:

$this->headTitle()->prepend('Thiết kế và lập trình web');

Nếu muốn thay đổi thành 'Sở thích web :: Zend View Placeholders' có thể thực hiện như sau:

$this->headTitle('Sở thích web','SET')->append( 'Zend View Placeholders' );

Nói chung với sự linh hoạt của Zend_View_Helper bạn muốn thay đổi thế nào là tùy ở bạn. Tham khảo thêm tại framework.zend.com.

  • Chia sẻ
comments powered by Disqus