classicbride 发表于 2010-2-25 11:18:49

CI的layout的进一步改进

昨天看了 kissmumu同学的《改进layout library,方便自定义layout》很不错的说,赞一个先....但是在使用的时候发现了一些小小的不方便,所以在kissmumu同学的基础再一次作了些小的调整^-^

首先,假定一个新闻页来说他的layout页面看起来应该像这样:<html>
<body>

<h1>Herder</h1>

<hr/>



<?php echo $layout_body ?>



<hr/>

<h1>Foote</h1>
</body>
<html>

但事实上作为一个新闻页它还需要关键字,描述信息等,所以最终的layout页面看起来应该像这样:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title><?php echo $layout_title ?></title>
<meta name="keywords" content="<?php echo $layout_keywords ?>" />
<meta name="description" content="<?php echo $layout_description ?>" />
</head>

<body>

<h1>Herder</h1>

<hr/>



<?php echo $layout_body ?>



<hr/>

<h1>Foote</h1>
</body>

</html>

meta信息每个页面是不相同的,所以需要从Controller中传入,故修改Layout.php为:
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Layout {

var $obj;

/** 默认layout页名称 */

var $layout = "main";

var $layout_data;


function Layout($params = array()) {

$this->obj =& get_instance();
   
if (count($params) > 0) {
   
$this->init($params);

}

// 为了方便layout页的管理,所以在views文件夹下建了个layouts文件夹

$this->layout = "layouts/" . $this->layout;

}



function init($params = array()) {

if (count($params) > 0) {   
   
foreach ($params as $key => $val) {
      
$this->$key = $val;
      
}      
   
}

}


/**

* 渲染页面

* @param $view
string 主体视图名称

* @param $data
array() 主体视图所需数据数组

* @param $is_return boolean 是否返回渲染页面的字符串表现形式

* @return string/void

*/

function view($view, $data = null,$is_return = false) {

$this->layout_data['layout_body'] = $this->obj->load->view($view, $data, true);


if($is_return) {
   
$output = $this->obj->load->view($this->layout, $this->layout_data, true);
      
return $output;
   
}
   
else {
   
$this->obj->load->view($this->layout, $this->layout_data, false);
   
}

}

}

?>



在Controller中调用的代码如下:
// 内容页所需的数据
$data = array(

"message"=>"Hello World"
);

// layout页所需的数据

$layout_data = array(

"layout_title"=>"My title",

"layout_keywords"=>"My keywords",

"layout_description"=>"My description"
);

// 调用layout->view() 之前将layout_data传入

$this->layout->layout_data = $layout_data;

$this->layout->view("test", $data);





页: [1]
查看完整版本: CI的layout的进一步改进