codeigniter

-- application
  -- cache
  -- config
  -- controllers
  -- core
  -- hooks
  -- models
  -- views
-- system
  -- core   :CI的基础核心,不要做任何修改,要扩展应通过Hooks
  -- fonts
  -- libraries

Basic

  • 任何一个url请求,ci都是先用网站根目录下的index.php来处理,然后再重定向.所以一般的请求格式是这样的:..index.php/..
    有一种方法可以使url中避免输入index.php,方式是使用.htaccess
  • url的格式是: example.com/controller1/method1/para1/para2
    访问上面的网址ci就会调用(需public): Controller1::method1($para1, $para2)
    如果访问的是example.com/controller1则默认调用: Controller1::index();
  • route
    application/config/routes.php
  • config
  // application/autoload.php
  $autoload['libraries'] = array('database', 'session');
  $autoload['helper'] = array('url');  // 辅助函数

controllers/hello.php

class Hello extends CI_Controller {
  function __construct() { // 默认是public,定义为private外界就不能访问了
    parent::__construct();  // 对应的有__destruct();
    // models/mod1/hello.php
    // 一般数据的来源是models里面的数据库.完了传递给view
    // TRUE: 模型在加载时自动按照数据库配置连接数据库.当然也可以给第三个参数传递一个$config['key']='value'的配置array!
    $this->load->model('mod1/hello', 'aliasname', TRUE);
    // 加载helper(),类库(libraries)
    $this->load->help(array('url'));
    $this->load->library(array('email', 'table'));
    $this->load->library('form_validation');  // 表单验证相关
    $this->load->library('pagination');  // 翻页
    $config['base_url'] = site_url('admin/..');
    $config['total_rows'] = 100;
    $config['per_page'] = 20;
    $this->pagination->initialize($config);
    $offset = ($this->pagination->cur_page - 1) * $perpage;
    
  }
  public function index() {
    // http://your-domain/index.php/hello
    // index方法表示默认的,无需特意指明/hello/index
  }
  public function welcome($name, $age) {
    $res = $this->aliasname->func();  // 默认就是模型的名字hello    
    $data['content'] = '123';
    $data['array'] = array('1', '2');
    $this->load->view('hello', $data);  // view/hello.php. 给视图传递一个数据$data.key名模板中被当做变量.
  }
  public function _remap($method, $params=array()) { // 如果想自定义uri中第2段的映射函数如此:    
    $method = 'process' . $method;
    if (method_exists($this, $method)) {
      return call_user_func_array(array($this,$method), $params);
    }
    show_404();
  }
}

models/mod1/hello.php

# 如果某个模型在app的整个生命周期内使用,可以让ci在系统初始化时自动加载,设置路径为:application/config/autoload.php
class Hello extends CI_Model {
  public function __construct() {
    parent::__construct();
    $this->db = $this->load()->database('dbname', TRUE);
  }
  public function func() {
    $res = $this->db->query('select....');
    foreach ($res->result_array() as $row) {
      $row['columnname'];
    }
    $this->db->update('tbname', array(...));
    return $res;
  }
  public function update_entry() {
    // 最好使用 $this->input->post('title');
    $this->title = $_POST['title'];
    $this->content = $_POST['content'];
    $this->date = time();
    $this->db->update('entries', $this, array('id'=>$_POST['id']));
  }
}

views/hello.php

<html>
<head></head>
<body>
  <h1><?php echo $content; ?></h1>
  <ul>
  <?php foreach ($array as $item): ?>
    <li><?php echo $item;?></li>
  <?php endforeach>
  </ul>
</body>
</html>

ssl

$priKey = 'rsa_private_key.pem';
$pubKey = 'rsa_public_key.pem';
extension_loaded('openssl') ordie('php needs openssl extention');
$pri = openssl_pkey_get_private(file_get_contents($priKey));  // 如果失败会返回false
$pub = openssl_pkey_get_private(file_get_contents($pubKey));
$oriData = 'hello';
$encData = '';
openssl_private_encrypt($oriData, $encData, $pri);  // bool
$decData = '';
openssl_public_decrypt($encData, $decData, $pub);

misc

/*
 * 自动文章第一个图片为特色图片
 */
function autoset_featured_image(){
    global $post;
    $already_has_thumb = has_post_thumbnail($post->ID);
    if (!$already_has_thumb){
        $attached_image = get_children("post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1");
        if ($attached_image) {
            foreach ($attached_image as $attachment_id => $attachment) {
                set_post_thumbnail($post->ID, $attachment_id);
            }
        } else { // 若没有图片使用素材库中的某个
            set_post_thumbnail($post->ID, '414');
        }
    }
}
add_action('the_post', 'autoset_featured_image');
add_action('save_post', 'autoset_featured_image');
add_action('draft_to_publish', 'autoset_featured_image');
add_action('new_to_publish', 'autoset_featured_image');
add_action('pending_to_publish', 'autoset_featured_image');
add_action('future_to_publish', 'autoset_featured_image');

// dg2: 验证码相关,处理验证码图片

// Smarty
// 主要还是为了实现前后端的分离.因为CI框架中的HTMLtemplate是直接嵌入的PHP代码.没有模板引擎.
// 这不利于前端人员撰写前端的界面. 势必要独立一套模板语言.以便达成双方沟通的桥梁!