52lin 发表于 2018-5-16 13:01:25

CI多站点布局+简化数据库操作+视图layout渲染

本帖最后由 52lin 于 2018-5-16 19:36 编辑

CI框架web布局demo
项目地址:https://gitee.com/tenyou/CI_web_layout_demo


[*]多站点布局
[*]简化数据库操作
[*]视图渲染layout

使用要求

[*]CI版本3.1.8(其他版本不保证能正常使用)
[*]PHP版本5.5+

数据库操作示例
以表名命名的model,继承公共model Com_user_model,若没有公共model ,可直接继承 MY_Model

<?php
/**
* 公共model,以表名命名的model
* 表名:xxx_user
*/

class Com_user_model extends MY_Model
{
      /**
         * Table name
         *
         * @var string
         * @access protected
         */
      public static $table_name = 'user';

      /**
         *Table primary key, if no default is used "Id".
         *
         * @var string
         * @access protected
         */
      protected $key = 'uid';
      
      function com_get_user($uid)
      {
                return $this->find($uid);
      }
}

class User_model extends Com_user_model
{
      /**
         * Database connection configuration
         * default 可设置为主库,slave为从库
         *
         * @var mixed
         * @access protected
         */
      protected $db_group = 'slave';

      /**
         * 是否返回最后新增的ID,即insert后返回insert_id
         *
         * @var bool
         */
      protected $return_insert_id = FALSE;
      
      function get_user($uid)
      {
                return $this->find($uid);
      }
}


假设需要查询uid为1的用户信息

// 使用原生$this->db操作
// 加载公共数据库配置,使用从库
$this->load->database('slave');
$userinfo = $this->db->select('*')->from('user')->where('uid', 1)->get()->row_array();

// 简化后如下,在controller中加载User_model,model自会加载公共数据库配置
$this->load->model('user_model', 'user');
// 等价于使用原生$this->db操作
$userinfo = $this->user->find(1);


也可以这样

$userinfo = $this->user->where('uid', 1)->find();
// 或者 指定字段,不指定默认select(*)
$userinfo = $this->user->select('uid,username')->where('uid', 1)->find();

// 使用model自身封装的方法
$userinfo = $this->user->get_user(1);
// 使用model继承的公共model中封装的方法
$userinfo = $this->user->com_get_user(1);


关于连表操作

// 原生$this->db连表查询
$this->db->select('user.uid as uid1, user2.uid as uid2');
$userinfo = $this->db->join('user2', 'user.uid=user2.uid','left')->where('user2.uid', 1)->get()->row_array();

// 使用set_table_alias进行连表查询,相同字段请指定查询字段
$this->user->set_table_alias('a'); // set_table_alias 必须在查询最前,设置当前model的表别名,即 user a
$this->user->select('a.uid as uid1, b.uid as uid2');
$userinfo = $this->user->join('user2 b', 'a.uid=b.uid','left')->where('b.uid', 1)->find();

// 最后判断一下,有可能返回的是false
$userinfo = is_array($userinfo) ? $userinfo : array();


model实例中也存在有db对象

// 使用$this->user->db操作,$this->user->db == $this->db
// 只不过$this->user->db 不用 $this->load->database();
$userinfo = $this->user->db->select('*')->from('user')->where('uid', 1)->get()->row_array();


视图操作示例

[*]设置视图数据 $this->view_data
[*]设置视图文件 Template::set_view
[*]渲染视图 Template::render

在controller中使用
首先在controller中、或者其父类中载入视图渲染类库

$this->load->library('Template');


然后在controller方法使用如下

// 设置视图数据
$this->view_data = array('some array data');
// 设置视图文件
Template::set_view('welcome_message');
// 渲染视图
Template::render();


使用示例
布局视图layout.php

<?php Template::sub_view_render('header');?>
<?php echo $__VIEW_CONTENT__?>
<?php Template::sub_view_render('footer');?>


头部视图header.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?><!DOCTYPE html>
<html lang="en">
<head>
      <title><?php Template::title(); ?></title>
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
      <meta name="renderer" content="webkit">
      <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
      <?php Template::trigger_meta();?>
      <meta name="keywords" content="<?php Template::keywords();?>" />
      <meta name="description" content="<?php Template::description();?>" />
      <?php Template::trigger_css();?>
      <?php Template::trigger_js(Template::POS_HEAD);?>
</head>
<body>


尾部视图footer.php

<?php Template::trigger_js(Template::POS_END);?>
</body>
</html>


主内容视图welcome_message.php

<?php
// 设置页面title
Template::set_title('Welcome to CodeIgniter!');

// 设置页面meta
Template::meta('http-equiv-test', 'IE=edge,chrome=1,test', true);
Template::meta('generator', 'CodeIgniter 3.1.8');

// 设置页面keywords
Template::set_keywords('CodeIgniter 3.1.8');

// 设置页面description
Template::set_description('CodeIgniter is very good');

// 添加js内容到header和footer的trigger_js位置
$js_content = <<< SCT
      (function(){
                console.log('js_content');
      })();
SCT;
Template::add_js_content($js_content, Template::POS_HEAD);
Template::add_js_content($js_content, Template::POS_END);

// 添加到header的trigger_css位置
Template::add_css('style/c.css');

// 添加css内容到header的trigger_css位置
$css_content = <<< SCT
      code{
                color:#f1210a
      }
SCT;
Template::add_css_content($css_content);

// 添加到header的trigger_js位置
Template::add_js(array('javascript/path1/a.js','javascript/path1/b.js'), Template::POS_HEAD);

// 添加到footer的trigger_js位置
Template::add_js(array('javascript/path2/a.js','javascript/path2/b.js'), Template::POS_END, false);

?>
<div id="container">
      <h1>Welcome to CodeIgniter!</h1>

      <div id="body">
                <p>The page you are looking at is being generated dynamically by CodeIgniter.</p>

                <?php
                        // 推荐
                        Template::sub_view_render('item2');
                        
                        // 或者
                        //echo Template::sub_view_render('item2', true);
                        
                        /*
                        或者
                        foreach ($items as $value) {
                              Template::sub_view_render('item', false, $value);
                        }
                        */
                ?>

                <p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>
      </div>

      <p class="footer">;Page rendered in <strong>{elapsed_time}</strong> seconds. <?php echo(ENVIRONMENT === 'development') ?'CodeIgniter Version <strong>' . CI_VERSION . '</strong>' : '' ?></p>
</div>
<?php Template::sub_view_render('sub_view')?>


最后渲染出的html如下

<!DOCTYPE html>
<html lang="en">
<head>
      <title>Welcome to CodeIgniter!</title>
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
      <meta name="renderer" content="webkit">
      <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
      <meta http_equiv="http-equiv-test" content="IE=edge,chrome=1,test">
<meta name="generator" content="CodeIgniter 3.1.8">
      <meta name="keywords" content="CodeIgniter 3.1.8" />
      <meta name="description" content="CodeIgniter is very good" />
      <link href="http://static.xxx.com/min/?f=style/c.css&v=1.0201805071552" rel="stylesheet" />
<style>
      code{
                color:#f1210a
      }
</style>
      <script type="text/javascript">
      (function(){
                console.log('js_content');
      })();
</script>
<script src="http://static.xxx.com/min/?f=javascript/path1/a.js,javascript/path1/b.js&v=1.0201805071552" type="text/javascript"></script>
</head>
<body>
<div id="container">
      <h1>Welcome to CodeIgniter!</h1>

      <div id="body">
                <p>The page you are looking at is being generated dynamically by CodeIgniter.</p>

                        <p>If you would like to edit this page you'll find it located at:</p>
      <code>application/views/welcome_message.php</code>
      <p>The corresponding controller for this page is found at:</p>
      <code>application/controllers/Welcome.php</code>

                <p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>
      </div>

      <p class="footer">;Page rendered in <strong>0.4321</strong> seconds. CodeIgniter Version <strong>3.1.8</strong></p>
</div>
<div id="container">
      <h1>core_function: I'm a common function</h1>
      <h1>welcome_function: I'm a application function</h1>
      <h1>I' m a common config value</h1>
</div>

<script type="text/javascript">
      (function(){
                console.log('js_content');
      })();
</script>
<script src="http://static.xxx.com/javascript/path2/a.js?v=1.0201805071552" type="text/javascript" ></script>
<script src="http://static.xxx.com/javascript/path2/b.js?v=1.0201805071552" type="text/javascript" ></script>
</body>
</html>





Hex 发表于 2018-5-16 18:01:37

很赞,支持一下~
页: [1]
查看完整版本: CI多站点布局+简化数据库操作+视图layout渲染