SlideShare a Scribd company logo
CodeIgniter 進階應用

    Bo-Yi Wu 吳柏毅
      2012.02.18
  http://blog.wu-boy.com/
Outline
   如何善用使用 CodeIgniter 內建函式庫
   移植及撰寫個人 Library
   擴充核心程式碼
   GetSparks 簡介
如何善用 CodeIgniter 函式庫 ?
                         3
Loader Library
系統自動初始化

                 4
如何使用



$this->load->library('class', $config, 'object')

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

      $this->email->some_function().



                                                   5
同時載入多個函式庫




$this->load->library(array('email', 'table'));




                                                 6
傳入參數

$this->load->library('class', $config)

example: $this->load->library('email')

        $config = array (
           'mailtype' => 'html',
           'charset' => 'utf-8,
           'priority' => '1'
        );
                                         7
Library 參數初始化

public function __construct($config = array())
{
  if (count($config) > 0)
  {
      $this->initialize($config);
  }
}

           initialize 為 class 其中一個 function
                                                 8
指定物件名稱



     $this->load->library('session', $config)
        $this->session->some_function()

$this->load->library('session', $config, 'my_sess')
        $this->my_sess->some_function()



                                                      9
Config Library
系統自動初始化

                 10
系統自動讀取網站設定檔
(application/config/config.php)



                                  11
將固定資料都存放在 config 目錄

  application/config/bitly.php



                                 12
範例存放 API Key


<?php
$config['user_name'] = 'appleboy';
$config['api_key'] = 'xxxxxxxx';
$config['format'] = 'json';
?>




                                     13
取得設定檔資料




  $this->config->load('bitly');
$this->config->item('api_key');


                                  14
在這裡大家有沒有一個疑問
  假設載入兩個設定檔



               15
application/config/bitly.php
<?php
$config['user_name'] = 'appleboy';
$config['api_key'] = 'api_key_01';
$config['format'] = 'json';
?>
application/config/tiny.php
<?php
$config['user_name'] = 'appleboy46';
$config['api_key'] = 'api_key_02';
$config['format'] = 'xml';
?>                                     16
$this->config->load('bitly');
$this->config->load('tiny');



                                17
輸出資料會是 ?


$this->config->item('api_key');

      答案 : api_key_02



                                  18
為什麼資料變數會衝突呢 ?
   那該如何解決 ?


            19
系統載入流程
   檢查 application/config/ 目錄檔案是否存在
         不存在 (continue)
         存在 (include 方式載入 )



          後載入覆蓋前面設定檔


                                      20
解決變數衝突



         第二個參數設定為 true

$this->config->load('bitly', true);
$this->config->load('tiny', true);

                                      21
衝突讀取方式


              加入第三參數
$this->config->item('api_key', 'bitly');
$this->config->item('api_key', 'tiny');


                                     22
另類解決方式




item key 為什麼會出現衝突 ?


                  23
Web 程式設計師
對變數命名方式大不同
 ( 資料庫欄位命名 )
    user_name
    UserName
    username


                24
改變 key 命名方式
prefix_name + item_name


                      25
application/config/bitly.php
<?php
$config['bitly_user_name'] = 'appleboy';
$config['bitly_api_key'] = 'api_key_01';
$config['bitly_format'] = 'json';
?>
application/config/tiny.php
<?php
$config['tiny_user_name'] = 'appleboy46';
$config['tiny_api_key'] = 'api_key_02';
$config['tiny_format'] = 'xml';
?>                                          26
此命名方式可以加速
  其他程式設計師
 閱讀程式碼方便性

            27
作業一
   新增 template 設定檔
         base_title
         site_keyword
         site_description
   將設定檔內容讀出並載入到 layout




                                   28
Email Library
 大量寄信

                29
Email Class
   多重收件人
   副本 (CC) 和密件副本 (BCCs)
   支援 HTML 或者是純文字 (Plaintext) 郵件
   附件檔案
   Email Debugging tools




                                    30
$this->load->library('email');

$this->email->from('your@example.com', 'Your Name');
$this->email->to('someone@example.com');
$this->email->cc('another@another-example.com');
$this->email->bcc('them@their-example.com');

$this->email->subject('Email Test');
$this->email->message('Testing the email class.');

$this->email->send();

echo $this->email->print_debugger();

                                                       31
   $this­>email­>to()
   $this­>email­>cc()
   $this­>email­>bcc()
          可以帶入陣列或單一資料
   $this­>email­>send()

           if ( ! $this->email->send())
           {
               echo $this->email->print_debugger();
           }


                                                      32
附件檔案


    $this->email->attach('file_path')

$this->email->attach('/path/to/file01.zip');
$this->email->attach('/path/to/file02.zip');
$this->email->attach('/path/to/file03.zip');

          $this->email->send();


                                               33
File Uploading Library
     ( 多檔案上傳 )
                         34
檔案上傳流程
   設定存放上傳目錄權限
   調整 php.ini 檔案上傳設定
   建立上傳表單
   驗證使用者上傳檔案
   印出檔案訊息並且寫到資料庫




                        35
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';

$this->load->library('upload', $config);

if ( ! $this->upload->do_upload('input_column_name'))
{
    $error = array('error' => $this->upload->display_errors());
    $this->load->view('upload_form' , $error);
}
else
{
    $data = array('upload_data' => $this->upload->data());
    $this->load->view('upload_success' , $data);           36
}
設定參數
   upload_path( 絕對或者是相對即可 )
   allowed_types( 可上傳類型用豎線 '|' 分開 )
   overwrite( 相同檔名則覆蓋 )
   max_size( 檔案大小限制 )
   max_width( 圖片專用 )
   max_height( 圖片專用 )
   encrypt_name( 檔名加密字串取代 )

                                       37
$this->upload->data()
[file_name] => mypic.jpg
[file_type] => image/jpeg
[file_path] => /path/to/your/upload/
[full_path] => /path/to/your/upload/jpg.jpg
[raw_name] => mypic
[orig_name] => mypic.jpg
[file_ext] => .jpg
[file_size] => 22.2
[is_image] => 1
[image_width] => 800
[image_height] => 600
[image_type] => jpeg
[image_size_str] => width="800" height="200"
                                               38
作業二
   新增上傳表單
        將上傳檔案資訊存入資料庫
        並且將檔案以附件寄給該使用者




                          39
Form Validation Library
      表單驗證
                          40
欄位驗證
1.  欄位包含非法字元
2.  欄位長度必須大於 minimum  
3.  欄位長度必須小於 maximum
4.  使用者名稱不能重複 ( 資料庫比對 )




                          41
Controller
$this->load->library('form_validation');

if ($this->form_validation->run() == false)
{
    $this->load->view('myform');
}
else
{
    $this->load->view('formsuccess');
}
                                              42
表單驗證規則




$this->form_validation->set_rules()



                                      43
驗證規則 ( 註冊表單 )



$this->form_validation->set_rules('username', ' 帳號 ', 'required');
$this->form_validation->set_rules('password', ' 密碼 ', 'required');
$this->form_validation->set_rules('passconf', ' 確認 ', 'required');
$this->form_validation->set_rules('email', ' 電子郵件 ', 'required');




                                                                44
Form Controller
$this->load->library('form_validation');

$this->form_validation->set_rules('username', ' 帳號 ', 'required');
$this->form_validation->set_rules('password', ' 密碼 ', 'required');
$this->form_validation->set_rules('passconf', ' 確認密碼 ', 'required');
$this->form_validation->set_rules('email', ' 電子郵件 ', 'required');

if ($this->form_validation->run() == FALSE)
{
    $this->load->view('myform');
}
else
{
    $this->load->view('formsuccess');
}
                                                                 45
多重驗證規則

$this->form_validation->set_rules('username', ' 帳號 ',
'required|min_length[5]|max_length[12]|
is_unique[users.username]');

$this->form_validation->set_rules('password', ' 密碼 ',
'required|matches[passconf]');

$this->form_validation->set_rules('passconf', ' 確認密碼 ',
'required');

$this->form_validation->set_rules('email', ' 電子郵件 ',
'required|valid_email|is_unique[users.email]');
                                                        46
事先處理欄位
$this->form_validation->set_rules('username', ' 帳號 ', 'trim|
required|min_length[5]|max_length[12]|xss_clean');

$this->form_validation->set_rules('password', ' 密碼 ', 'trim|
required|matches[passconf]|md5');

$this->form_validation->set_rules('passconf', ' 確認密碼 ',
'trim|required');

$this->form_validation->set_rules('email', ' 電子郵件 ', 'trim|
required|valid_email|is_unique[users.email]');


        htmlspecialchars, trim, MD5(native function) 皆可處理
                                                               47
記憶表單
欄位驗證失敗回到表單
顯示之前留下的資料
     $this->load->helper('form')

set_value('username', 'appleboy')
set_select('myselect', 'one', true)
set_checkbox('mycheck[]', '1', true)
set_radio('myradio', '1', true)
                                       48
自行設計驗證函數




        $this->form_validation->set_rules
('username', ' 帳號 ', 'callback_username_check')




                                            49
public function index()
{
  $this->load->library('form_validation');

   $this->form_validation->set_rules('username', ' 帳號 ',
'callback_username_check');
   $this->form_validation->set_rules('password', ' 密碼 ', 'required');
   $this->form_validation->set_rules('passconf', ' 確認密碼 ', 'required');
   $this->form_validation->set_rules('email', ' 電子郵件 ', 'required');

    if ($this->form_validation->run() == FALSE)
    {
        $this->load->view('myform');
    }
    else
    {
        $this->load->view('formsuccess');
    }
}                                                                 50
Call back function

public function username_check($str)
{
  if ($str == 'test')
  {
      return FALSE;
  }
  else
  {
      return TRUE;
  }
}

                                       51
定義錯誤訊息




$this->form_validation->set_message
        ('rule', 'error message')



                                      52
錯誤訊息


               全部顯示
  <?php echo validation_errors(); ?>
               個別顯示
<?php echo form_error('file_name'); ?>


                                       53
作業三

    使用者註冊表單
    
        欄位 :Email, 密碼 , 確認密碼
    
        撰寫 call back function 確認帳號是否存在
    
        自訂錯誤訊息




                                         54
Image Manipulation Library
      ( 影像處理 )
                             55
影像處理 (GD vs ImageMagic)
   修改尺寸
   建立縮圖
   圖片裁剪
   圖片旋轉
   浮水印




                          56
個人建議大量圖形網站用
    ImageMagic
( 支援 command line 執行 )
     ( 獨立處理圖片 )
  ( 不需要動到前端 Server)




                         57
如果公司經費許可
AWS S3 雲端儲存服務
Simple Storage Service



                         58
初始化




$this->load->library('image_lib')



                                    59
處理影像

$config['image_library'] = 'gd2';
$config['source_image'] = '/path/mypic.jpg';
$config['create_thumb'] = true;
$config['width'] = 75;
$config['height'] = 50;

$this->load->library('image_lib', $config);

$this->image_lib->resize();

                                               60
參數設定
   image_library: GD, GD2, ImageMagick, NetPBM
   library_path: Linux, Windows 底下路徑
   source_image:  絕對 / 相對路徑
   new_image:  輸出檔案絕對 / 相對路徑
   width: 圖片寬度
   height: 圖片高度
   create_thumb: 避免覆蓋原檔案

                                                  61
錯誤訊息



if ( ! $this->image_lib->resize())
{
    echo $this->image_lib->display_errors();
}



                                               62
影像處理函數
   $this­>image_lib­>resize()
   $this­>image_lib­>crop()
   $this­>image_lib­>rotate()
   $this­>image_lib­>clear()




                                 63
影像處理函數
   $this­>image_lib­>resize()
   $this­>image_lib­>crop()
   $this­>image_lib­>rotate()
   $this­>image_lib­>clear()




                                 64
務必設定
   $config['create_thumb'] = true;
   $config['new_image'] = '/path/new_image.jpg';


          避免原始檔案被處理 ( 保留原檔 )




                                                    65
影像處理函數
   $this­>image_lib­>resize()
   $this­>image_lib­>crop()
   $this­>image_lib­>rotate()
   $this­>image_lib­>clear()




                                 66
$config['image_library'] = 'imagemagick';
$config['library_path'] = '/usr/local/bin';
$config['source_image'] = '/path/to/mypic.jpg';
$config['x_axis'] = '100';
$config['y_axis'] = '60';

$this->image_lib->initialize($config);

if ( ! $this->image_lib->crop())
{
    echo $this->image_lib->display_errors();
}

                                                  67
影像處理函數
   $this­>image_lib­>resize()
   $this­>image_lib­>crop()
   $this­>image_lib­>rotate()
   $this­>image_lib­>clear()




                                 68
$config['image_library'] = 'netpbm';
$config['library_path'] = '/usr/bin/';
$config['source_image'] = '/path/to/mypic.jpg';
$config['rotation_angle'] = 'hor';

$this->image_lib->initialize($config);

if ( ! $this->image_lib->rotate())
{
    echo $this->image_lib->display_errors();
}

                                                  69
rotation_angle 參數
   90( 順時針 90 度 )
   180( 順時針 180 度 )
   270( 順時針 270 度 )
   hor( 水平旋轉 )
   vrt( 垂直旋轉 )




                            70
影像處理函數
   $this­>image_lib­>resize()
   $this­>image_lib­>crop()
   $this­>image_lib­>rotate()
   $this­>image_lib­>clear()




                                 71
$this->image_lib->clear()
      重置所有設定項目




                            72
作業
   增加使用者頭像上傳
        限制上傳檔案型態 (jpeg,jpg,png,gif)
        可以自訂圖像 ( 隨時更改 )
        製作縮圖顯示於使用者列表




                                       73
Language Library
  ( 多國語系 )
                   74
兩個存放語系目錄
   application/language/[english|zh­tw]
   system/language/[english|zh­tw]
   先後讀取

        application/config/config.php 設定預設語系




                                           75
建立語言檔案
   檔案命名方式
         error_lang.php
   內容以 $lang 陣列方式表示
         $lang['language_key'] = " 我是中文 ";




                                              76
$lang['error_email'] = " 您必須填入電子郵件 ";
$lang['error_url'] = " 您必須填入完整網址 ";
$lang['error_username'] = " 您必須填入帳號名稱 ";

      避免衝突



                                       77
讀取語言檔案




$this->lang->load('filename', 'language')



                                      78
讀取資料


   Language helper 函式

lang('language_key')

 $this->load->helper('language');

                                    79
作業
   請用下列 URL 切換中英文語系
        index.php/controller/function?lang=zh­tw




                                                    80
Pagination Library
  ( 分頁處理 )
                     81
$this->load->library('pagination');

$config['base_url'] = '/index.php/test/page/';
$config['total_rows'] = 200;
$config['per_page'] = 20;

$this->pagination->initialize($config);

echo $this->pagination->create_links();


                                                 82
分頁參數
   base_url: 完整的 URL 路徑 , 包含了控制器
      (controller)/ 函數 (function)
   total_rows: 總筆數
   per_page: 單頁顯示幾筆
   uri_segment: URI 哪個部份包含了頁數
   num_links: 您目前所在頁數前面跟後面所顯示的
      分頁數量
   use_page_numbers: 用 page number 顯示
                                         83
講了這麼多 CodeIgniter 內建 Library
 那該如何撰寫屬於自己的套件呢

                           84
如果別人寫好的 Library
 該如何無痛導入到
   CodeIgniter


                  85
注意事項
   檔案命名
        一律採用小寫命名 , 如 my_class.php
   類別宣告
        類別宣告第一個字母必須為大寫 , 如 class 
          My_class




                                     86
<?php if ( ! defined('BASEPATH')) exit('No direct
script access allowed');

class Someclass {

    public function some_function()
    {
    }
}

/* End of file Someclass.php */

                                                    87
初始化類別傳遞參數




$params = array('type' => 'large', 'color' => 'red');

   $this->load->library('someclass', $params);




                                                    88
public function __construct($config = array())
{
  If ( ! empty($config))
  {
      $this->initialize($config);
  }
}


                                             89
在 Library 裡該如何使用
CodeIgniter 其他資源呢 ?



                      90
$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');



                                   91
$this->_obj =& get_instance();




                                 92
public function __construct()
{
  $this->_obj =& get_instance();
  $this->_obj->load->config('google_url_api');
}




                                             93
作業
   建立個人專用 Library
   將 goo.gl php library 導入
          http://code.google.com/p/googl­php/




                                                 94
網站一定會有共同處理的地方
     ( 多國語系 )
( 多重登入 Facebook,Google)



                          95
如果有 10 個 Controller
  那不就 10 個檔案
 都加上相同程式碼?



                      96
這時候就需要

擴充核心函式庫

           97
class Welcome_01 extends CI_Controller
  class Welcome_02 extends CI_Controller
  class Welcome_03 extends CI_Controller
  class Welcome_04 extends CI_Controller
  class Welcome_05 extends CI_Controller
  class Welcome_06 extends CI_Controller
  class Welcome_07 extends CI_Controller
  class Welcome_08 extends CI_Controller

Controller 都需要有共同的變數及函數


                                           98
class Welcome_01 extends MY_Controller
class Welcome_02 extends MY_Controller
class Welcome_03 extends MY_Controller
class Welcome_04 extends MY_Controller
class Welcome_05 extends MY_Controller
class Welcome_06 extends MY_Controller
class Welcome_07 extends MY_Controller
class Welcome_08 extends MY_Controller

更改變數及函數則大家一起變動


                                         99
CI_Controller




控制器 01   控制器 02   控制器 03   控制器 04   控制器 05




登入函式     登入函式     登入函式     登入函式     登入函式



                                             100
CI_Controller


             MY_Controller

                  登入模組




控制器 01   控制器 02   控制器 03   控制器 04   控制器 05

                                             101
直接更換核心類別
   放置目錄 application/core/
   更換 input 核心
           application/core/input.php


    class CI_Input {
            public function __construct() {}
    }

                                               102
擴充核心類別
   類別宣告必須繼承父類別
   新類別名稱與檔名必須使用 MY_ 前置字串
           命名 : application/core/MY_Input.php

    class MY_Input extends CI_Input {

            function __construct()
            {
              parent::__construct();
            }
    }                                            103
自訂子類別的前置字串



編輯 application/config/config.php

$config['subclass_prefix'] = 'MY_';


                                      104
作業
   練習擴充 CI_Controller 核心
         index.php/welcome/?lang=english
         index.php/welcome/?lang=zh­tw
   擴充核心取得 $_GET['lang'] 變數資料
         利用此變數將 language 檔案載入實現多國語系




                                            105
目標
   會員註冊系統
        Email 認証信
        Form 表單驗證
   多國語系
   會員資料編輯
        個人照片上傳
   會員登入


                          106
CodeIgniter 核心功能
不夠網站開發需求嘛 ?



                   107
歡迎使用
CodeIgniter getsparks



                        108
What is Sparks?


 Ruby 有 RubyGems
  Node.js 有 npm
CodeIgniter 有 sparks



                       109
What is Sparks?



Package Management System

    Making Code Easy to
 Find, Create, and Distribute

                                110
Get Sparks tool Now!!




        一行指令就安裝完成
php -r "$(curl -fsSL http://getsparks.org/go-
                   sparks)"



                                            111
Load Sparks Library




 $this->load->spark(google-url-shortener/1.0.4');
$short_url = $this->google_url_api->shorten($url);
   echo $url . " => " . $short_url->id . "<br />";




                                                112
Installing getsparks library




                http://goo.gl/lHmCX
$ php tools/spark install -v1.0.4 google-url-shortener




                                                   113
今天課程就到這裡
大家有任何問題嘛


           114
謝謝大家
對於 CodeIgniter 有任何問題
    可以到論壇留言
 http://www.codeigniter.org.tw/forum/




                                        115

More Related Content

PDF
常見設計模式介紹
PDF
Maintainable PHP Source Code
PDF
Introduction to MVC of CodeIgniter 2.1.x
PDF
PHPUnit 入門介紹
PDF
Phpconf 2011 introduction_to_codeigniter
PDF
Patterns in Zend Framework
PDF
OpenWebSchool - 02 - PHP Part I
PDF
View 與 Blade 樣板引擎
常見設計模式介紹
Maintainable PHP Source Code
Introduction to MVC of CodeIgniter 2.1.x
PHPUnit 入門介紹
Phpconf 2011 introduction_to_codeigniter
Patterns in Zend Framework
OpenWebSchool - 02 - PHP Part I
View 與 Blade 樣板引擎

What's hot (20)

PDF
Discuz技术交流
PDF
LazyRecord: The Fast ORM for PHP
PPT
深入了解Memcache
PDF
Erlang Practice
DOCX
Puppet安装测试
PPT
PHP & MySQL 教學
PDF
CRUD 綜合運用
PDF
Javascript autoload
DOC
部分PHP问题总结[转贴]
PPTX
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
DOC
jsp基础速成精华讲解
PDF
深入淺出 Web 容器 - Tomcat 原始碼分析
PDF
第一次用 PHPUnit 寫測試就上手
PPT
cfm to php training
PDF
OpenEJB - 另一個選擇
PDF
Migrations 與 Schema操作
PDF
Node way
PPT
Mongodb
 
PDF
不断归零的前端人生 - 2016 中国软件开发者大会
PDF
Ooredis
Discuz技术交流
LazyRecord: The Fast ORM for PHP
深入了解Memcache
Erlang Practice
Puppet安装测试
PHP & MySQL 教學
CRUD 綜合運用
Javascript autoload
部分PHP问题总结[转贴]
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
jsp基础速成精华讲解
深入淺出 Web 容器 - Tomcat 原始碼分析
第一次用 PHPUnit 寫測試就上手
cfm to php training
OpenEJB - 另一個選擇
Migrations 與 Schema操作
Node way
Mongodb
 
不断归零的前端人生 - 2016 中国软件开发者大会
Ooredis
Ad

Viewers also liked (20)

PDF
How to integrate front end tool via gruntjs
PDF
Introduction to Grunt.js on Taiwan JavaScript Conference
PDF
Gearman work queue in php
PDF
You must know about CodeIgniter Popular Library
PPTX
Git flow 與團隊合作
PPTX
Why to choose laravel framework
PPTX
PHP & JavaScript & CSS Coding style
PPTX
用 Docker 改善團隊合作模式
PDF
RESTful API Design & Implementation with CodeIgniter PHP Framework
PPTX
Write microservice in golang
PDF
2014 OSDC Talk: Introduction to Percona XtraDB Cluster and HAProxy
PPTX
Git Flow and JavaScript Coding Style
PDF
Introduction to git
PPTX
How to choose web framework
PPTX
Docker 基礎介紹與實戰
PDF
Automating your workflow with Gulp.js
PPT
Introduction to Android G Sensor I²C Driver on Android
PDF
ACL in CodeIgniter
KEY
CodeIgniter 3.0
PDF
CodeIgniter - PHP MVC Framework by silicongulf.com
How to integrate front end tool via gruntjs
Introduction to Grunt.js on Taiwan JavaScript Conference
Gearman work queue in php
You must know about CodeIgniter Popular Library
Git flow 與團隊合作
Why to choose laravel framework
PHP & JavaScript & CSS Coding style
用 Docker 改善團隊合作模式
RESTful API Design & Implementation with CodeIgniter PHP Framework
Write microservice in golang
2014 OSDC Talk: Introduction to Percona XtraDB Cluster and HAProxy
Git Flow and JavaScript Coding Style
Introduction to git
How to choose web framework
Docker 基礎介紹與實戰
Automating your workflow with Gulp.js
Introduction to Android G Sensor I²C Driver on Android
ACL in CodeIgniter
CodeIgniter 3.0
CodeIgniter - PHP MVC Framework by silicongulf.com
Ad

Similar to advanced introduction to codeigniter (20)

PPTX
Web Caching Architecture and Design
PDF
CRUD 綜合運用
PDF
6kbbs vulnerability report
PDF
Introduction to CodeIgniter
PDF
Laradebut #7 - Laravel AUTH
PDF
[DCTPE2010] Drupal 模組開發入門
DOC
用Jquery实现拖拽层
ODP
nodejs开发web站点
DOC
Zencart网站模板复制过程
PPT
JQuery Plugin
PDF
Migrations 與 Schema 操作
PDF
Php应用程序常见安全问题解析
DOC
Spring入门纲要
PPT
Structs2簡介
PPTX
Yui3入门
PDF
Spring 2.x 中文
PPTX
J query
PPTX
PHPUnit + Xdebug 单元测试技术
PDF
淺談C#物件導向與DesignPattern.pdf
PPT
Asp.net mvc 培训
Web Caching Architecture and Design
CRUD 綜合運用
6kbbs vulnerability report
Introduction to CodeIgniter
Laradebut #7 - Laravel AUTH
[DCTPE2010] Drupal 模組開發入門
用Jquery实现拖拽层
nodejs开发web站点
Zencart网站模板复制过程
JQuery Plugin
Migrations 與 Schema 操作
Php应用程序常见安全问题解析
Spring入门纲要
Structs2簡介
Yui3入门
Spring 2.x 中文
J query
PHPUnit + Xdebug 单元测试技术
淺談C#物件導向與DesignPattern.pdf
Asp.net mvc 培训

More from Bo-Yi Wu (18)

PDF
Drone CI/CD 自動化測試及部署
PDF
用 Go 語言打造多台機器 Scale 架構
PDF
Job Queue in Golang
PDF
Golang Project Layout and Practice
PDF
Introduction to GitHub Actions
PDF
Drone 1.0 Feature
PDF
Drone CI/CD Platform
PDF
GraphQL IN Golang
PPTX
Go 語言基礎簡介
PPTX
drone continuous Integration
PPTX
Gorush: A push notification server written in Go
PPTX
用 Drone 打造 輕量級容器持續交付平台
PPTX
用 Go 語言 打造微服務架構
PPTX
Introduction to Gitea with Drone
PDF
運用 Docker 整合 Laravel 提升團隊開發效率
PDF
用 Go 語言實戰 Push Notification 服務
PPTX
用 Go 語言打造 DevOps Bot
PPTX
A painless self-hosted Git service: Gitea
Drone CI/CD 自動化測試及部署
用 Go 語言打造多台機器 Scale 架構
Job Queue in Golang
Golang Project Layout and Practice
Introduction to GitHub Actions
Drone 1.0 Feature
Drone CI/CD Platform
GraphQL IN Golang
Go 語言基礎簡介
drone continuous Integration
Gorush: A push notification server written in Go
用 Drone 打造 輕量級容器持續交付平台
用 Go 語言 打造微服務架構
Introduction to Gitea with Drone
運用 Docker 整合 Laravel 提升團隊開發效率
用 Go 語言實戰 Push Notification 服務
用 Go 語言打造 DevOps Bot
A painless self-hosted Git service: Gitea

advanced introduction to codeigniter