text:
1. Giới thiệu về codeigniter
- CodeIgniter (CI) là một PHP Framework theo cấu trúc MVC được viết trên PHP4 và hỗ trợ cả PHP4 và PHP5 .Nói nôm na nó là một tập hợp các thư viện viết sẵn trên PHP giúp chúng ta phát triển web bằng PHP nhanh hơn là cách viết lắp ghép thông thường, các thư viện này giúp chúng ta thực hiện các tác vụ thông thường của một ứng dụng web như kết nối và thực hiện các công việc liên quan đến cơ sở dữ liệu , upload file, xử lý hình ảnh, phân trang, cookie, session, bảo mật … Đồng thời các thư viện này cũng giúp chúng ta tổ chức code tốt hơn với mô hình MVC. Đơn giản chỉ có thế . Những thực tế nó còn nhiều hơn thế, nếu đi sâu vào tìm hiểu bạn sẽ nhận ra.
- CI được viết bởi Rick Ellis ( một ca sĩ nhạc Rock ) trực thuộc Expression Engine . CI ra đời chưa lâu ( khoảng năm 2007 ) nhưng đã có rất nhiều đánh giá tốt và đang trở thành một thế lực trong lĩnh vực PHP Framework ( tớ cho là thế ).Đặc điểm khá nổi bật của CI đó tính là tốc độ và …. tài liệu hướng dẫn cực kỳ chi tiết và dễ hiểu. Nếu bạn đã nắm qua PHP cơ bản thì có thể bạn chỉ mất 1, 2 ngày để có thể làm việc với CI sau khi nghiên cứu tài liệu hướng dẫn đi kèm.
2.Bắt đầu với CodeIgniter
-Để bắt đầu, bạn cần bỏ ra khoảng 15’ để xem lại bài viết về Framework của bác phpKungfu đế nắm sơ về mô hình MVC trong lập trình PHP. Không cần hiểu cách làm, chỉ cần hiểu cách ứng dụng.
Để bắt tay vào làm việc với CI, việc đầu tiên bạn cần phải làm là … download 1 bản CI về . Và nó ở đây :CodeIgniter , không có gì khó khăn đúng không. Bản mới nhất đến thời điểm này là 1.6.3 .Download về và giải nén, copy nó vào webroot của bạn để bắt đầu, rename nó thành tên bạn muốn ( tôi dùng tên là cidemo). Cấu trúc sau khi giải nén ra như sau :
Tớ sẽ nói qua về cấu trúc thư mục của CI để các bạn nắm và dễ làm việc.
Trong một rừng file và folder ấy bạn chỉ cần chú ý đến file index.php ở ngoài gốc và folderapplication trong folder system. Đó chính là vùng làm việc của bạn với CI , các file và folder khác bạn ko cần quan tâm và chú ý làm gì ( nhưng cũng đừng xóa nó nhá ). Ngoài ra có 1 folder user_guide chứa tài liệu hướng dẫn, bạn có thể xóa đi hoặc copy nó sang nơi khác dành để tham khảo.
- file index.php đóng vai trò là 1 bootstrapper cho ứng dụng, nó sẽ nhận yêu cầu và chuyển đến những nơi cần thiết để xử lý. Nó cũng tiến hành khởi tạo một số thứ cần thiết cho ứng dụng. Tạm thời bạn không cần chỉnh sửa gì file này cả, cứ để nó như thế, khi nào quen bạn sẽ biết cách cấu hình lại một số thứ tại file index.php này.
-Folder application : đây là nơi chứa code của bạn. Và trong folder này cũng có 1 số thư mục con nhằm giúp bạn quản lý code của bạn theo mô hình MVC. Cụ thể các thư mục con đó gồm :
+ config : Nơi bạn đặt các file dùng cho việc cấu hình ứng dụng như thông tin kết nối cơ sở dữ liệu , tên site. url site …
+ controllers : Nơi đặt các file thực hiện chức năng controller ( điều hướng và xử lý yêu cầu )
+ errors: Nơi chứa các file thông báo lỗi của bạn. Mặc định sẽ có 1 số mẫu báo lỗi thông thường đi kèm.
+ helpers : chứa các thư viện dạng hàm ( function) nhằm phục vụ quá trình phát triển ứng dụng cho bạn tạo.
+ hooks : chứa các file xử lý hooks ( tác động vào core library của CI ko cần sửa file ) . Chức năng này tạm thời chưa tìm hiểu đến
+ language : Nếu site của bạn có từ 2 ngôn ngữ trở lên thì đặt các file ngôn ngữ tại đây.
+ libraries : Chứa các lớp tiện ích cho ứng dụng do bạn tự tạo
+ Models : Chứa các file thực hiện chức năng model trong MVC , cụ thể ở đây có thể là các file giúp bạn thao tác với cơ sở dữ liệu theo yêu cầu từ controller
+ views : chứa các file thực hiện tác vụ view trong mô hình MVC , cứ tạm xem nó là nơi chứa file giao diện cho ứng dụng.
Và tạm thời chúng ta chỉ làm việc chủ yếu trên config, controllers , models và views . các thứ khác có thể từ từ tìm hiểu sau.
Ok, bắt đầu cài đặt CI,sau khi đã giải nén vào webroot, ta thử duyệt đến trang này xem :http://localhost/[Tên thư mục chứa CI], trong vd của tớ thư mục chứa CI là cidemo =>http://localhost/cidemo
Nếu nó hiện ra 1 trang chứa dòng Welcome To Codeigniter có nghĩa là bạn đã thành công ( Tớ chưa từng thất bại ở bước này nên không rõ thất bại nó sẽ như thế nào :d ).
- Nhưng chưa xong đâu, bạn cần phải cấu hình thêm 1 tí nữa là nó mới làm việc tốt. mở file config.php trong system/application/config ( từ đây về sau phần system/application bạn sẽ tự hiểu nhá, vd tôi nói mở file config.php trong config thì bạn sẽ hiểu làsystem/application/config/config.php ) và tìm dòng $config['base_url'], sửa nó thành đường địa chỉ của bạn, theo như vd tôi sẽ cấu hình
- $config['base_url'] = "http://localhost/cidemo/";
Mục đích của việc này là giúp cho các hàm trợ giúp tự sinh url của CI làm việc chính xác.
Kế đến bạn mở file config/routes.php và tìm dòng
$route['default_controller'] = 'welcome';
Thay bằng
$route['default_controller'] = 'home';
Thay home bằng bất cứ gì bạn thích, nhưng phải nhớ .Đây chính là controller mặc định mà CI sẽ tìm đến khi ko cung cấp controller. Phía sau tớ sẽ giải thích về các controller này.
Nếu ứng dụng của bạn có thao tác với cơ sở dữ liệu thì hãy cấu hình thông tin kết nối cơ sở dữ liệu trong config/database.php
Thế là xong bước cài đặt và cấu hình cơ bản.
Sau khi cấu hình như tôi nói thì bạn ko chạy được ứng dụng theo cách gõ đường dẫnhttp://localhost/cidemo . Có lẽ bạn sẽ lầm bầm chửi rủa tớ xúi dại . Nhưng hãy bình tĩnh, chả có gì phải lo, lý do ko chạy được là do Ci ko tìm được controller thích hợp, và để tiếp tục ta phải tạo ra controller thôi.
Vậy controller là gì mà nếu ko có nó ứng dụng ko chạy được. Và tớ xin trân trọng giới thiệu :controller chính là trái tim của ứng dụng viết bằng CI, nó xác định các yêu cầu HTTP được xử lý như thế nào. Yêu cầu HTTP là gì ? Đó là những truy vấn thông qua giao thức HTTP như : Mở trình duyệt đánh url : http://localhost/cidemo/index.php/blog <= 1 yêu cầu HTTP , hoặc gửi dữ liệu dạng POST thông qua 1 form đến địa chỉ trên cũng là 1 yêu cầu HTTP.
Và các yêu cầu HTTP này khi gửi đến ứng dụng viết trên CI sẽ được phân tích và xác địnhcontroller của yêu cầu đó và tiếp đến sẽ gọi controller đó ra xử lý yêu cầu.
Và hãy tìm hiểu khi 1 URL gửi đến CI nó sẽ được phân tích ra sao .
Hãy xét URL sau :
example.com/index.php/news/article/my_article
Khi yêu cầu HTTP gửi đến có dạng như trên thì CI sẽ phân tích ra :
- news là controller
- article : là phương thức
- my_article : Giá trị
Trong Ci , controller tương ứng với 1 class đặt trong folder controllers. Như VD trên khi nhận yêu cầu như thế CI sẽ tìm trong folder controller file có tên là news.php và trong file này nó sẽ tìm class tên News và tạo thể hiện của nó . Quyền điều khiển ứng dụng hiện thời sẽ do class News này thực hiện, và trong class News này sẽ gọi phương thức article và truyền cho phương thức này tham số my_article
Nếu như url chỉ là example.com/index.php thì CI sẽ lấy controller mặc định được ra cấu hình bên trên ra thực thi. Và phương thức mặc định sẽ là index không có tham số.
Tổng quát lên ta có :
http://example.com/index.php/class/function/ID
- Controller ( lớp ) class sẽ được thực thi
- Phương thức function được gọi
- ID là tham số được truyền vào.( có thế có nhiều giá trị phân cách theo dấu / )
Mặc định, index.php sẽ đi kèm theo url như ta thấy ở trên , chúng ta hoàn toàn có thể loại bỏ index.php này đi thông qua một số thiết lập, nhưng chúng ta sẽ tìm hiểu việc này sau. Tạm thời cứ để đấy, cũng chả ảnh hưởng gì nhiều đến hòa bình thế giới cả
Tôi nói , các bạn có hiểu không ? Nếu chưa hiểu hãy đọc lại 1 vài lần nữa, tưởng tượng trong đầu để hình dung cách thức làm việc của controller. Không hiểu được chỗ này xem như không thể làm việc được với CI.
Nếu đã hiểu thì ta trở lại với ứng dụng , tiến hành cứu chữa nó thôi . Như tớ đã nói , ứng dụng hiện đang bị lỗi do CI không tìm được Controller mặc định theo như ta cấu hình ( home) . Thế thì ta phải tự tạo ra controller này :
Ta tạo file home.php trong thư mục controller với nọi dung như sau :
Code:
<?phpclass Home extends Controller{ // Tạo phương thức xây dựng cho lớp function Home() { //Gọi phương thức xây dựng của lớp cha parent::Controller(); } function index() { echo "Default Controller"; }
}?>
}?>
Và chạy thử http://localhost/cidemo
Xong Bài 2
Bài 3 : View
Ở bài trước ta đã tìm hiểu về cách thức hoạt động của controller , bài này ta sẽ tập trung vào phần view, một phần cũng khá quan trọng. Nó đóng vai trò là sân khấu cho dữ liệu trình diễn .
Ở phần cuối của bài trên ta đã xuất ra trình duyệt 1 chuỗi bằng cách echo trực tiếp trong controller . Và nó hoạt động.Nhưng thực chất đó là 1 việc làm trái với thuần phong mỹ tục MVC mà CI đang theo đuổi. Việc xuất dữ liệu ra trình duyệt không phải là nhiệm vụ của controller mà do chuyên gia tổ chức trình diễn View đảm nhận. Để làm việc này ta làm như sau :
Trong controller Home ta sửa lại thành
Code:
<?phpclass Home extends Controller{ // Tạo phương thức xây dựng cho lớp function Home() { //Gọi phương thức xây dựng của lớp cha parent::Controller(); } function index() { $this->load->view('home_view'); }
}?>
}?>
Khoan hãy chạy vội , chạy bây giờ sẽ gặp lỗi ngay . Hãy tạo 1 file tên là home_view.php trong folder views có nội dung
Code:

Default Controller

Bây giờ chạy http://localhost/cidemo sẽ có kết quả tương tự như bài trước . Thế mới đúng luật.
Giải thích :
- Để gọi 1 file view vào xử lý bạn dùng $this->load->view('Tên view'); Với Tên view là 1 file theo dạng [Tên view.php] đặt trong thư mục views.
- Khi bạn gọi view ứng dụng chưa kết thúc ngay mà nó vẫn chạy cho hết các lệnh trong controller xong mới chuyển sang view, và view là bước xử lý sau cùng của ứng dụng.
Trong file view bạn thấy ở trên chỉ đơn thuần là HTML , nhưng bạn hoàn toàn có thể đặt mã PHP ở đây, và bạn có thể truyền giá trị từ controller sang .
Hãy sửa file controller Home của bạn , sửa nội dung function index() thành
Code:
<?phpVà sửa file home_view.php trong folder views thành
$data = array('var1'=>'Var 1 value','var2'=>'var2 value');$this->load->view('home_view',$data);?>
$data = array('var1'=>'Var 1 value','var2'=>'var2 value');$this->load->view('home_view',$data);?>
Code:

Và chạy lại ứng dụng sẽ thấy kết quả.
Var1 = <?php echo $var1 ?>

Var2 = <?php echo $var2?>

Var1 = <?php echo $var1 ?>

Var2 = <?php echo $var2?>

Ở đây ta thấy rằng ta truyền cho view 1 mảng , nhưng khi truy xuất lại dùng trực tiếp qua biến mà ko thông qua mảng . Điều này là nhờ CI đã chuyển hết các cặp khóa và giá trị trong mảng thành biến mang giá trị tương ứng giúp ta làm việc dễ dàng hơn.
Hết bài 3 , bài sau tớ sẽ bắt tay vào xây dựng 1 ứng dụng đơn giản với CI .
Để thêm sinh động, ta sẽ tiến hành dùng CI để viết một ứng dụng nho nhỏ cho vui nhà vui cửa
Ứng dụng của chúng ta chỉ thực hiện 1 vài tác vụ đơn giản như sau :
- Upload 1 file hình lên
- Tạo thumbnail cho nó
- Lưu thông tin về hình ảnh vào database
- Show link file gốc và thumbnail ra .
.... Hết . Giống thằng Imageshack nhỉ
Để thực hiện công việc ấy ta cần tạo 1 database với cấu trúc như sau :
- Database name : cidemo
- Table : img
+ id int auto_increment
+ title varchar(255) not null
+ img varchar(255) not null
+ thumb varchar(255) not null
Và ... vẽ ra 1 template đơn giản để dùng
Template của tớ vẽ ra như sau ( hơi xấu , nhưng dùng được )
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

Home | Upload | About Me

Welcome

Nội Dung ở đây

DoanGia 2008 . powered by CodeIgniter

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

Home | Upload | About Me

Welcome

Nội Dung ở đây

DoanGia 2008 . powered by CodeIgniter

Và CSS
Code:
body {
margin-top: 0px;
margin-left: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
h1
{
margin:0;
padding:0;
text-align:left;
color:#FF9933;
font-size:24px;
}
label{
font-weight: bold;
}
p {
text-align:justify;
color:#777777;
font-size: 90%;
line-height: 1.5em;
}
.error
{
color:red;
}
.img
{
width:200px;
float:left;
}
.image
{
background-color:#F0F0F0;
border-style:dotted; border-width:1px; border-color:#0080ff;
}
/*HEADER*/
#header{
width: 800px;
position:relative;
height: 80px;
border-bottom:1px solid #7DA5E0;
}
#sitename {
position:absolute;
font-family: Verdana, Arial, Helvetica, sans-serif;
color :#7DA5E0;
font-size: 32px;
font-weight: bold;
margin-top:10px;
margin-left:40px;
left: 0px;
top: 0px;
}
/*MENU IN HEADER*/
#menu{
position:absolute;
bottom: 5px;
right: 30px;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
}
#menu a{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#FF9933;
text-decoration:none;
}
#menu a:hover{
text-decoration:underline;
}
/*CONTENT*/
#content{
width: 800px;
}
#contenttext{
width: 800px;
margin-top:30px;
}
/*FOOTER*/
.footer{
width: 800px;
height: 30px;
clear:both;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#000000;
border-top:1px solid #7DA5E0;
}
/*FOOTER LINKS*/
.footer a{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#FF9933;
text-decoration:none;
}
.footer a:hover{
text-decoration:underline;
}
margin-top: 0px;
margin-left: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
h1
{
margin:0;
padding:0;
text-align:left;
color:#FF9933;
font-size:24px;
}
label{
font-weight: bold;
}
p {
text-align:justify;
color:#777777;
font-size: 90%;
line-height: 1.5em;
}
.error
{
color:red;
}
.img
{
width:200px;
float:left;
}
.image
{
background-color:#F0F0F0;
border-style:dotted; border-width:1px; border-color:#0080ff;
}
/*HEADER*/
#header{
width: 800px;
position:relative;
height: 80px;
border-bottom:1px solid #7DA5E0;
}
#sitename {
position:absolute;
font-family: Verdana, Arial, Helvetica, sans-serif;
color :#7DA5E0;
font-size: 32px;
font-weight: bold;
margin-top:10px;
margin-left:40px;
left: 0px;
top: 0px;
}
/*MENU IN HEADER*/
#menu{
position:absolute;
bottom: 5px;
right: 30px;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
}
#menu a{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#FF9933;
text-decoration:none;
}
#menu a:hover{
text-decoration:underline;
}
/*CONTENT*/
#content{
width: 800px;
}
#contenttext{
width: 800px;
margin-top:30px;
}
/*FOOTER*/
.footer{
width: 800px;
height: 30px;
clear:both;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#000000;
border-top:1px solid #7DA5E0;
}
/*FOOTER LINKS*/
.footer a{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#FF9933;
text-decoration:none;
}
.footer a:hover{
text-decoration:underline;
}
Và ta sơ chế nguyên liệu để dễ làm việc. Tạo 1 folder css trong cidemo và cho đoạn css trên vào 1 file tên là style.css
Từ template trên ta cắt nhỏ ra thành 3 phần để dễ chỉnh sửa và làm việc.
Và tớ cắt thế này
header
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">Content

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

Home | Upload | About Me

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

Home | Upload | About Me

Code:

Footer

Welcome

Nội Dung ở đây

Welcome

Nội Dung ở đây

Code:

DoanGia 2008 . powered by CodeIgniter

DoanGia 2008 . powered by CodeIgniter

Không cắt ra cũng không sau, nhưng cắt ra thì dễ làm việc hơn ( theo tớ)
Từ 3 mảnh cắt ấy ta tạo thành 3 file header.php, content.php và footer.php đặt vào folder views
Xong bước chuẩn bị nguyên liệu . Đến bước cấu hình thêm CI 1 tí .
Ở các bài trước ta đã cấu hình thông tin về base url và default controller . Và ở bài này ta sẽ cấu hình thêm 2 phần quan trọng nữa là database và auto load .
Vì ứng dụng của chúng ta có thao tác với cơ sở dữ liệu nên ta phải cung cấp thông tin kết nối cơ sở dữ liệu . Mở file database.php trong folder config
Code:
$active_group = "default";Tạm thời ta chỉ cung cấp thông tin cơ bản là hostname, username, password và databasename là đủ, các thông tin khác cứ để mặc định.
$active_record = TRUE;
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "cidemo";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$active_record = TRUE;
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "cidemo";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
Và để khỏi mất công Load thư viện database khi dùng , ta sẽ nhờ CI tự load bằng cách mở file autoload.php trong folder config và tìm :
$autoload['libraries'] = array();
và sửa thành:
$autoload['libraries'] = array('database');
Nếu cần tự load thêm thư viện gì nữa bạn có thể thêm vào VD:
$autoload['libraries'] = array('database', 'session');
Nhưng tạm thời ta chỉ dùng database thôi.
Và có 1 helper hữ dụng luôn cần đến là url , ta tìm
$autoload['helper'] = array();
Sửa thành
$autoload['helper'] = array('url');
Ý nghĩa của việc cấu hình autoload là thế nào ? Thông thường, mỗi khi muốn dùng thư viện hay helper nào , ta sẽ phải tự load lên bằng cách :
$this->load->helper('Tên Helper') hoặc $this->load->library('tên Library')
Điều này chỉ có tác dụng trong controller hiện tại. Và nếu ở controller nào bạn cũng cần dùng helper ấy thì ... mỗi lần như thế phải load lên , rất vất vả. Thay vì làm như thế bạn sẽ nhờ CI load giúp lúc khởi tạo ứng dụng, như thế chỗ nào cũng có thể dùng mà ko cần phải load lên.
---
Thế là xong phần cấu hình.Bây giờ có thể chuyên tâm code
Đầu tiên ta sẽ thực hiện một vài vấn đề râu ria đơn giản làm quen trước.Ta sẽ tạo 2 trang gần như tĩnh là trang chủ chào mừng và trang giới thiệu ( about me )
Như đã nói , mọi chuyện bắt đầu từ controller, trái tim của ứng dụng. Ta lại quay lại với controller Home và sửa nội dung function index
Code:
function index()
{
$this->data['heading'] = 'Welcome to CodeIgniter Demo';
$this->data['content'] = 'Đây là website xây dựng dựa trên CodeIgniter Framework. Website minh họa một số chức năng cơ bản của CodeIgniter . Hi vọng sẽ giúp ích được cho các bạn mới làm quen với CodeIgniter.

Các bạn có thể tham khảo thêm CodeIgniter User Guide được kèm trong bản phân phối của CodeIgniter để tìm hiểu thêm các chức năng khác mà CodeIgniter hỗ trợ.';
$this->load->view("content",$this->data);
}
{
$this->data['heading'] = 'Welcome to CodeIgniter Demo';
$this->data['content'] = 'Đây là website xây dựng dựa trên CodeIgniter Framework. Website minh họa một số chức năng cơ bản của CodeIgniter . Hi vọng sẽ giúp ích được cho các bạn mới làm quen với CodeIgniter.

Các bạn có thể tham khảo thêm CodeIgniter User Guide được kèm trong bản phân phối của CodeIgniter để tìm hiểu thêm các chức năng khác mà CodeIgniter hỗ trợ.';
$this->load->view("content",$this->data);
}
Không có gì mới lạ đúng ko ?
Tiếp đến bạn mở file content.php trong folder view và sửa nó lại thành
Code:
<?php
$this->load->view("header");?>

<?=$heading?>

<?=$content?>

<?php
$this->load->view("footer");?>
$this->load->view("header");?>

<?=$heading?>

<?=$content?>

<?php
$this->load->view("footer");?>
Tại đây chúng ta sẽ load 2 file view là header và footer vào , như thế trong controller bạn chỉ cần gọi thằng content là đủ , nó sẽ kéo theo 2 thằng kia
Và sửa tiếp file header.php trong folder views lại 1 tí .
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="<?=base_url()?>css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

<a xhref="<?=base_url()?>">Home | <a xhref="<?=site_url('upload')?>">Upload | <a xhref="<?=site_url("home/about")?>">About Me

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="<?=base_url()?>css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

<a xhref="<?=base_url()?>">Home | <a xhref="<?=site_url('upload')?>">Upload | <a xhref="<?=site_url("home/about")?>">About Me

Ta dùng 2 hàm của helper url là base_url và site_url để tự sinh url cho ứng dụng
base_url sẽ cho ra đường dẫn đến ứng dụng ( như ta đã config) , ở đây nó cho ra :http://localhost/cidemo
Và site_url tạo 1 url chuẩn cho trang web , như trên site_url('upload') sẽ cho rahttp://localhost/cidemo/index.php/upload
----
Việc dùng 2 hàm này rất hữu ích khi ta đưa ứng dụng vào sử dụng không phải chỉnh lại từng đường dẫn ...
Chạy ứng dụng bạn sẽ thấy...
Hôm qua đang cao hứng viết thì bị gọi về , mất hết cả hứng.
Hôm nay cố lấy lại cảm hứng để viết. Thực ra thì ứng dụng này tớ đã viết xong rồi , bây giờ chỉ cố tìm cách giải thích thôi
---
Trở lại với ứng dụng, sau bài trước ta đã tạo ra được một trang chào mừng khá đơn giản. Và ta tiếp tục đà đơn giản đó để tạo thêm một trang about me giới thiệu cho có vẻ hoành tráng.
Tiếp tục với controller Home , ta thêm vào một phương thức nữa như sau:
Code:
<?phpfunction about() { $this->data['heading'] = "About Me"; $this->data['content'] = 'Tui: Một người đẹp trai đến khó tin, nói chuyện có duyên đến kỳ lạ, hát hay đáng hâm mộ, code tốt, design được, giỏi ngoại ngữ, học đâu biết đó, thói hư tật xấu gần như không có, chỉ mắc phải một tật xấu nho nhỏ : NỖ'; $this->load->view('content',$this->data); }?>
Lại chạy ứng dụng, click vào link about trên menu , ta sẽ thấy kết quả , hoặc gõ vào địa chỉ http://localhost/cidemo/index.php/home/about
Xong phần râu ria trang trí không mấy khó khăn.
Bây giờ ta bắt đầu đi vào phần chính của ứng dụng : upload và tạo thumbnail cho ảnh. Quá trình đó tớ có thể mô tả như sau :
- Tạo form để người dùng chọn ảnh upload
- Khi người dùng nhấn upload , ta sẽ xử lý quá trình upload lên server . Nếu có lỗi sẽ quay về trang upload để người dùng nhập thông tin lại kèm theo thông báo lỗi.
- Nếu quá trình upload thành công ta sẽ tạo thumbnail cho ảnh vừa upload
- Sau khi tạo thumbnail xong, ta sẽ ghi thông tin về ảnh vào cơ sở dữ liệu
- Bước cuối cùng là in thông tin về ảnh ra cho người dùng xem.
Để bắt đầu thực hiện ta tạo 1 controller mới tên là upload với nội dung ban đầu như sau
Code:
<?phpclass Upload extends Controller{ var $data = array(); function Upload() { parent::Controller(); $this->load->helper('form'); } function index() { $this->data['error'] = ''; $this->load->view('upload_form',$this->data); }?>
Lúc ban đầu ta sẽ load upload form lên cho người dùng nhập , nhìn vào đoạn mã trên chắc chắn rằng ta phải tạo một file view tên là upload_form.php . Và đây là nội dung của file đó :
Code:
<?php
$this->load->view("header");?>

Upload Form

Chấp nhận các loại file ảnh png, gif, jpg có dung lượng nhỏ hơn 2 Mb

<?php
echo form_open_multipart('upload/do_upload'); echo form_label('Image Title (*)','title'); echo '
'; echo form_input('title'); echo '

'; echo form_label('Images File (*)','img'); echo '
'; echo form_upload('img'); echo '

'; echo form_submit('submit', 'Upload!'); echo form_close(); ?>

<?=$error?>

<?php
$this->load->view("footer");?>
$this->load->view("header");?>

Upload Form

Chấp nhận các loại file ảnh png, gif, jpg có dung lượng nhỏ hơn 2 Mb

<?php
echo form_open_multipart('upload/do_upload'); echo form_label('Image Title (*)','title'); echo '
'; echo form_input('title'); echo '

'; echo form_label('Images File (*)','img'); echo '
'; echo form_upload('img'); echo '

'; echo form_submit('submit', 'Upload!'); echo form_close(); ?>

<?=$error?>

<?php
$this->load->view("footer");?>
Ở đây có một vài điểm khác thường so với các file view từ đầu đến giờ ta vẫn hay tạo. Ở đây tớ dùng một helper khác của CI là form helper ( các hàm hỗ trợ thao tác với form). Để sử dụng helper này trong controller tớ đã load nó lên trong phương thức xây dựng thế này :
Code:
$this->load->helper('form');Và trong file view tớ sử dụng chúng một cách trực tiếp bằng cách gọi hàm thông thường. Và công dụng của chúng như sau :
Code:
form_open_multipart('upload/do_upload');Hàm này sẽ cho ra một thẻ mở form dùng cho việc upload , thay vì dùng hàm đó ta sẽ phải viết HTML thế này
Code:
<form enctype="multipart/form-data" action="upload/do_upload" method="POST">Rõ ràng cách dùng helper sẽ khỏe người hơn.
- form_label('Image Title (*)','title');
Cho ra
Code:
Image Title (*)- form_input('title');
cho ra
Code:
<input type="text" name="title">....
Các hàm sau cũng tương tự thế , các bạn xemhttp://codeigniter.com/user_guide/helpers/form_helper.html để biết thêm chi tiết.
Bên dưới tớ để một vùng để in ra lỗi nếu có , mặc định lúc ban đầu biến này sẽ là rỗng ( định bên trong controller) , nếu có lỗi sẽ truyền thông điệp qua biến này.
Ok, bây giờ bạn có thể chạy ứng dụng để xem thử :http://localhost/cidemo/index.php/upload
Ở trên ta đã qui định nơi xử lý việc upload file này là trong phương thức do_upload của controller upload
Vì thế ta sẽ tạo ra phương thức do_upload trong controller upload
Đầu tiên việc cần làm trong phương thức này là kiểm tra dữ liệu nhập vào đã hợp lệ hay chưa. CI có một thư viện hỗ trợ việc kiểm tra dữ liệu đầu vào này khá tốt là library Validation . Để sử dụng đầu tiên bạn phải load nó lên :
Code:
$this->load->library('validation');
Và cho nó biết "đòi hỏi" của chúng ta với từng field của form như thế nào, trong tường hợp này tôi muốn field không được để trống , tôi sẽ làm như sau
Code:
$rules['title'] = "required";Và để tiến hành kiểm tra ta dùng phương thức run của lớp validation , phương thức này sẽ trả về true nếu dữ liệu đầu vào đạt yêu đầu , ngược là sẽ false và kèm theo thông tin lỗi được gửi kèm trong thuộc tính error_string . Sau khi load thư viện lên ta có thể truy xuất nó bằng cú pháp : $this->[tên thư viện]->[phương thức/thuộc tính] .Tớ tiến hành kiểm tra như sau :
$this->validation->set_rules($rules);
$this->validation->set_rules($rules);
Code:
<?phpfunction do_upload() { $this->load->library('validation'); $rules['title'] = "required"; $this->validation->set_rules($rules); if ($this->validation->run() == FALSE) { $this->data['error'] = 'Vui lòng nhập tiêu đề ảnh'; $this->load->view('upload_form',$this->data); } else {Nếu xác thực không đạt yêu cầu ta sẽ cho quay về form upload kèm theo thông báo lỗi. Xem thêm tại : http://codeigniter.com/user_guide/libraries/validation.html
// xu ly upload
}
}?>
// xu ly upload
}
}?>
Ở đây tớ không xác thực field file , tớ sẽ dành phần đó cho phần upload xử lý ( thích thế )
Nếu xác thực ok , ta sẽ tiến hành upload ... ta lại dùng tiếp một thư viện cung cấp sẵn của CI để xử lý việc này. Thư viện này mang tên upload .
Quá trình thực hiện diễn ra như sau:
Code:
<?php
$config['upload_path'] = UPLOAD_DIR; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '2048'; $config['encrypt_name'] = TRUE; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('img')) { $this->data['error'] = $this->upload->display_errors(); $this->load->view('upload_form', $this->data); } else {
// Da upload xog }?>
$config['upload_path'] = UPLOAD_DIR; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '2048'; $config['encrypt_name'] = TRUE; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('img')) { $this->data['error'] = $this->upload->display_errors(); $this->load->view('upload_form', $this->data); } else {
// Da upload xog }?>
Đầu tiên ta load thư viện lên và truyền cho nó một số thông tin khởi tạo về quá trình upload , ở đâu tớ dùng một số cấu hình:
$config['upload_path'] = $this->upload_dir; //qui định thư mục chứa hình
$config['allowed_types'] = 'gif|jpg|png'; // chấp nhận định dạng file nào ( ở đây là .gif,.png và . jpg )
$config['max_size'] = '2048'; //Kích thước tối đa của file upload tính bằng kb , ở đây là 2 Mb
$config['encrypt_name'] = TRUE; // Mã hóa tên file upload lên
Sau khi khởi tạo , bạn gọi phương thức do_upload để tiến hành upload , nếu upload thành công sẽ trả về true và kèm theo một thuộc tính lưu giữ thông tin về file đã upload , ngược lại trả về false
Code:
function do_upload()
{
$this->load->library('validation');
$rules['title'] = "required";
$this->validation->set_rules($rules);
if ($this->validation->run() == FALSE)
{
$this->data['error'] = 'Vui lòng nhập tiêu đề ảnh';
$this->load->view('upload_form',$this->data);
}
else
{
$config['upload_path'] = $this->upload_dir;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2048';
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('img'))
{
$this->data['error'] = $this->upload->display_errors();
$this->load->view('upload_form', $this->data);
}
else
{
//xu ly tao thumbnail
}
}
}
{
$this->load->library('validation');
$rules['title'] = "required";
$this->validation->set_rules($rules);
if ($this->validation->run() == FALSE)
{
$this->data['error'] = 'Vui lòng nhập tiêu đề ảnh';
$this->load->view('upload_form',$this->data);
}
else
{
$config['upload_path'] = $this->upload_dir;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2048';
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('img'))
{
$this->data['error'] = $this->upload->display_errors();
$this->load->view('upload_form', $this->data);
}
else
{
//xu ly tao thumbnail
}
}
}
ta sẽ khai báo 2 thuộc tính trong controller này để lưu thư mục chứa hình upload và hình thumbnail
Ta thêm
Code:
var $upload_dir = "uploads/";Vào sau dòng var $data;
var $thumb_dir = "upload/thumb";
var $thumb_dir = "upload/thumb";
Tạm thời khoan hãy chạy vội, ta sẽ tiếp tục quá trình tạo thumbnail . Để dễ nhìn tớ tách việc tạo thumbnail này ra thành một phương thức riêng , do phương thức này chỉ là phương thức tiện ích nên ta đặt tên khác thông thường 1 tí là thêm dấu _ ở phía trước , việc đặt tên thế này CI sẽ xem phương thức đó là private và không cho bên ngoài truy xuất vào , phương thức này có nội dung như sau :
Code:
function _thumb($img)Ở đây là dùng thư viện image_lib của CI để thực hiện việc tạo thumbnail . Cách cấu hình cơ bản như thế, $img là biến nhận đường dẫn của hình cần tạo thumbnail .
{
$config['image_library'] = 'gd';
$config['source_image'] = $img;
$config['new_image'] = $this->thumb_dir;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = 200;
$config['height'] = 200;
$this->load->library('image_lib', $config);
if(!$this->image_lib->resize())
return false;
else
return true;
}
{
$config['image_library'] = 'gd';
$config['source_image'] = $img;
$config['new_image'] = $this->thumb_dir;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = 200;
$config['height'] = 200;
$this->load->library('image_lib', $config);
if(!$this->image_lib->resize())
return false;
else
return true;
}
Và ở phương thức do_upload ta gọi đến nó như sau :
Code:
<?phpfunction do_upload() { $this->load->library('validation'); $rules['title'] = "required"; $this->validation->set_rules($rules); if ($this->validation->run() == FALSE) { $this->data['error'] = 'Vui lòng nhập tiêu đề ảnh'; $this->load->view('upload_form',$this->data); } else { $config['upload_path'] = $this->upload_dir; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '2048'; $config['encrypt_name'] = TRUE; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('img')) { $this->data['error'] = $this->upload->display_errors(); $this->load->view('upload_form', $this->data); } else { $img = $this->upload->data(); if($this->_thumb($img['full_path'])) { //Luu vap database } } } }?>Đó là xong quá trình upload và tạo thumbnail
Tạm nghỉ tí , mai tớ sẽ tiếp phần cuối . Tớ gửi kèm ứng dụng mẫu tớ đã vất vả code hơn 1h cho các bạn test .
Sao có người viết hay thế nhỉ!!!.Trả lờiXóa
thk a lot.

markdown:
**1. Giới thiệu về codeigniter**
- CodeIgniter (CI) là một PHP Framework theo cấu trúc MVC được viết trên PHP4 và hỗ trợ cả PHP4 và PHP5 .Nói nôm na nó là một tập hợp các thư viện viết sẵn trên PHP giúp chúng ta phát triển web bằng PHP nhanh hơn là cách viết lắp ghép thông thường, các thư viện này giúp chúng ta thực hiện các tác vụ thông thường của một ứng dụng web như kết nối và thực hiện các công việc liên quan đến cơ sở dữ liệu , upload file, xử lý hình ảnh, phân trang, cookie, session, bảo mật … Đồng thời các thư viện này cũng giúp chúng ta tổ chức code tốt hơn với mô hình MVC. Đơn giản chỉ có thế . Những thực tế nó còn nhiều hơn thế, nếu đi sâu vào tìm hiểu bạn sẽ nhận ra.
- CI được viết bởi Rick Ellis ( một ca sĩ nhạc Rock ) trực thuộc
[Expression Engine](http://expressionengine.com/). CI ra đời chưa lâu ( khoảng năm 2007 ) nhưng đã có rất nhiều đánh giá tốt và đang trở thành một thế lực trong lĩnh vực PHP Framework ( tớ cho là thế ).Đặc điểm khá nổi bật của CI đó tính là tốc độ và …. tài liệu hướng dẫn cực kỳ chi tiết và dễ hiểu. Nếu bạn đã nắm qua PHP cơ bản thì có thể bạn chỉ mất 1, 2 ngày để có thể làm việc với CI sau khi nghiên cứu tài liệu hướng dẫn đi kèm. **2.Bắt đầu với CodeIgniter**
-Để bắt đầu, bạn cần bỏ ra khoảng 15’ để xem lại bài viết về Framework của bác phpKungfu đế nắm sơ về mô hình MVC trong lập trình PHP. Không cần hiểu cách làm, chỉ cần hiểu cách ứng dụng.
Để bắt tay vào làm việc với CI, việc đầu tiên bạn cần phải làm là … download 1 bản CI về . Và nó ở đây :
[CodeIgniter](http://www.codeigniter.com/), không có gì khó khăn đúng không. Bản mới nhất đến thời điểm này là 1.6.3 .Download về và giải nén, copy nó vào webroot của bạn để bắt đầu, rename nó thành tên bạn muốn ( tôi dùng tên là cidemo). Cấu trúc sau khi giải nén ra như sau : ![](http://img.photo.zing.vn/file_uploads/gallery/w642h/q32008/2008/09/13/02/77011221290031.jpg)
Tớ sẽ nói qua về cấu trúc thư mục của CI để các bạn nắm và dễ làm việc.
Trong một rừng file và folder ấy bạn chỉ cần chú ý đến file index.php ở ngoài gốc và folder
**application**trong folder **system**. Đó chính là vùng làm việc của bạn với CI , các file và folder khác bạn ko cần quan tâm và chú ý làm gì ( nhưng cũng đừng xóa nó nhá ). Ngoài ra có 1 folder **user_guide**chứa tài liệu hướng dẫn, bạn có thể xóa đi hoặc copy nó sang nơi khác dành để tham khảo.
- file index.php đóng vai trò là 1 bootstrapper cho ứng dụng, nó sẽ nhận yêu cầu và chuyển đến những nơi cần thiết để xử lý. Nó cũng tiến hành khởi tạo một số thứ cần thiết cho ứng dụng. Tạm thời bạn không cần chỉnh sửa gì file này cả, cứ để nó như thế, khi nào quen bạn sẽ biết cách cấu hình lại một số thứ tại file index.php này.
-Folder
**application**: đây là nơi chứa code của bạn. Và trong folder này cũng có 1 số thư mục con nhằm giúp bạn quản lý code của bạn theo mô hình MVC. Cụ thể các thư mục con đó gồm :
+
**config**: Nơi bạn đặt các file dùng cho việc cấu hình ứng dụng như thông tin kết nối cơ sở dữ liệu , tên site. url site …
+
**controllers**: Nơi đặt các file thực hiện chức năng controller ( điều hướng và xử lý yêu cầu )
+
**errors**: Nơi chứa các file thông báo lỗi của bạn. Mặc định sẽ có 1 số mẫu báo lỗi thông thường đi kèm.
+
**helpers**: chứa các thư viện dạng hàm ( function) nhằm phục vụ quá trình phát triển ứng dụng cho bạn tạo.
+ hooks : chứa các file xử lý hooks ( tác động vào core library của CI ko cần sửa file ) . Chức năng này tạm thời chưa tìm hiểu đến
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
+
**language**: Nếu site của bạn có từ 2 ngôn ngữ trở lên thì đặt các file ngôn ngữ tại đây.
+
**libraries**: Chứa các lớp tiện ích cho ứng dụng do bạn tự tạo
+
**Models**: Chứa các file thực hiện chức năng model trong MVC , cụ thể ở đây có thể là các file giúp bạn thao tác với cơ sở dữ liệu theo yêu cầu từ controller
+
**views**: chứa các file thực hiện tác vụ view trong mô hình MVC , cứ tạm xem nó là nơi chứa file giao diện cho ứng dụng.
Và tạm thời chúng ta chỉ làm việc chủ yếu trên
**config, controllers , models và views**. các thứ khác có thể từ từ tìm hiểu sau.
Ok, bắt đầu cài đặt CI,sau khi đã giải nén vào webroot, ta thử duyệt đến trang này xem :
[http://localhost/](http://localhost/)[Tên thư mục chứa CI], trong vd của tớ thư mục chứa CI là cidemo => [http://localhost/cidemo](http://localhost/cidemo)
Nếu nó hiện ra 1 trang chứa dòng Welcome To Codeigniter có nghĩa là bạn đã thành công ( Tớ chưa từng thất bại ở bước này nên không rõ thất bại nó sẽ như thế nào :d ).
![](http://img.photo.zing.vn/file_uploads/gallery/w642h/q32008/2008/09/13/02/25421221290484.png)
- Nhưng chưa xong đâu, bạn cần phải cấu hình thêm 1 tí nữa là nó mới làm việc tốt. mở file config.php trong
**system/application/config**( từ đây về sau phần system/application bạn sẽ tự hiểu nhá, vd tôi nói mở file config.php trong config thì bạn sẽ hiểu là **system/application/config/config.php**) và tìm dòng $config['base_url'], sửa nó thành đường địa chỉ của bạn, theo như vd tôi sẽ cấu hình
- $config['base_url'] = "
[http://localhost/cidemo/](http://localhost/cidemo/)";
Mục đích của việc này là giúp cho các hàm trợ giúp tự sinh url của CI làm việc chính xác.
Kế đến bạn mở file
**config/routes.php**và tìm dòng
$route['default_controller'] = 'welcome';
Thay bằng
$route['default_controller'] = 'home';
Thay
**home**bằng bất cứ gì bạn thích, nhưng phải nhớ ![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Nếu ứng dụng của bạn có thao tác với cơ sở dữ liệu thì hãy cấu hình thông tin kết nối cơ sở dữ liệu trong
**config/database.php**
Thế là xong bước cài đặt và cấu hình cơ bản.
Sau khi cấu hình như tôi nói thì bạn ko chạy được ứng dụng theo cách gõ đường dẫn
[http://localhost/cidemo](http://localhost/cidemo). Có lẽ bạn sẽ lầm bầm chửi rủa tớ xúi dại ![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
**controller**thích hợp, và để tiếp tục ta phải tạo ra **controller**thôi.
Vậy
**controller**là gì mà nếu ko có nó ứng dụng ko chạy được. Và tớ xin trân trọng giới thiệu : **controller**chính là trái tim của ứng dụng viết bằng CI, nó xác định các yêu cầu HTTP được xử lý như thế nào. Yêu cầu HTTP là gì ? Đó là những truy vấn thông qua giao thức HTTP như : Mở trình duyệt đánh url : **<= 1 yêu cầu HTTP , hoặc gửi dữ liệu dạng POST thông qua 1 form đến địa chỉ trên cũng là 1 yêu cầu HTTP.** [http://localhost/cidemo/index.php/blog](http://localhost/cidemo/index.php/blog)
Và các yêu cầu HTTP này khi gửi đến ứng dụng viết trên CI sẽ được phân tích và xác định
**controller**của yêu cầu đó và tiếp đến sẽ gọi **controller**đó ra xử lý yêu cầu.
Và hãy tìm hiểu khi 1 URL gửi đến CI nó sẽ được phân tích ra sao .
Hãy xét URL sau :
**example.com/index.php/news/article/my_article**
Khi yêu cầu HTTP gửi đến có dạng như trên thì CI sẽ phân tích ra :
- news là controller
- article : là phương thức
- my_article : Giá trị
Trong Ci ,
**controller**tương ứng với 1 class đặt trong folder **controllers**. Như VD trên khi nhận yêu cầu như thế CI sẽ tìm trong folder **controller**file có tên là news.php và trong file này nó sẽ tìm class tên News và tạo thể hiện của nó . Quyền điều khiển ứng dụng hiện thời sẽ do class News này thực hiện, và trong class News này sẽ gọi phương thức article và truyền cho phương thức này tham số my_article
Nếu như url chỉ là example.com/index.php thì CI sẽ lấy controller mặc định được ra cấu hình bên trên ra thực thi. Và phương thức mặc định sẽ là index không có tham số.
Tổng quát lên ta có :
[http://example.com/index.php/](http://example.com/index.php/)class/function/ID
- Controller ( lớp ) class sẽ được thực thi
- Phương thức function được gọi
- ID là tham số được truyền vào.( có thế có nhiều giá trị phân cách theo dấu / )
Mặc định,
**index.php**sẽ đi kèm theo url như ta thấy ở trên , chúng ta hoàn toàn có thể loại bỏ **index.php**này đi thông qua một số thiết lập, nhưng chúng ta sẽ tìm hiểu việc này sau. Tạm thời cứ để đấy, cũng chả ảnh hưởng gì nhiều đến hòa bình thế giới cả
Tôi nói , các bạn có hiểu không ? Nếu chưa hiểu hãy đọc lại 1 vài lần nữa, tưởng tượng trong đầu để hình dung cách thức làm việc của
**controller**. Không hiểu được chỗ này xem như không thể làm việc được với CI.
Nếu đã hiểu thì ta trở lại với ứng dụng , tiến hành cứu chữa nó thôi . Như tớ đã nói , ứng dụng hiện đang bị lỗi do CI không tìm được Controller mặc định theo như ta cấu hình ( home) . Thế thì ta phải tự tạo ra controller này :
Ta tạo file home.php trong thư mục controller với nọi dung như sau :
Code:
<?phpclass Home extends Controller{ // Tạo phương thức xây dựng cho lớp function Home() { //Gọi phương thức xây dựng của lớp cha parent::Controller(); } function index() { echo "Default Controller"; }
}?>
}?>
Và chạy thử
[http://localhost/cidemo](http://localhost/cidemo)
Xong Bài 2
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
**Bài 3 : View**
Ở bài trước ta đã tìm hiểu về cách thức hoạt động của controller , bài này ta sẽ tập trung vào phần view, một phần cũng khá quan trọng. Nó đóng vai trò là sân khấu cho dữ liệu trình diễn .
Ở phần cuối của bài trên ta đã xuất ra trình duyệt 1 chuỗi bằng cách echo trực tiếp trong controller . Và nó hoạt động.Nhưng thực chất đó là 1 việc làm trái với thuần phong mỹ tục MVC mà CI đang theo đuổi. Việc xuất dữ liệu ra trình duyệt không phải là nhiệm vụ của controller mà do chuyên gia tổ chức trình diễn View đảm nhận. Để làm việc này ta làm như sau :
Trong controller Home ta sửa lại thành
Code:
<?phpclass Home extends Controller{ // Tạo phương thức xây dựng cho lớp function Home() { //Gọi phương thức xây dựng của lớp cha parent::Controller(); } function index() { $this->load->view('home_view'); }
}?>
}?>
Khoan hãy chạy vội , chạy bây giờ sẽ gặp lỗi ngay . Hãy tạo 1 file tên là home_view.php trong folder views có nội dung
Code:

Default Controller

Bây giờ chạy
[http://localhost/cidemo](http://localhost/cidemo)sẽ có kết quả tương tự như bài trước . Thế mới đúng luật.
Giải thích :
- Để gọi 1 file view vào xử lý bạn dùng $this->load->view('Tên view'); Với Tên view là 1 file theo dạng [Tên view.php] đặt trong thư mục views.
- Khi bạn gọi view ứng dụng chưa kết thúc ngay mà nó vẫn chạy cho hết các lệnh trong controller xong mới chuyển sang view, và view là bước xử lý sau cùng của ứng dụng.
Trong file view bạn thấy ở trên chỉ đơn thuần là HTML , nhưng bạn hoàn toàn có thể đặt mã PHP ở đây, và bạn có thể truyền giá trị từ controller sang .
Hãy sửa file controller Home của bạn , sửa nội dung function index() thành
Code:
<?phpVà sửa file home_view.php trong folder views thành
$data = array('var1'=>'Var 1 value','var2'=>'var2 value');$this->load->view('home_view',$data);?>
$data = array('var1'=>'Var 1 value','var2'=>'var2 value');$this->load->view('home_view',$data);?>
Code:

Và chạy lại ứng dụng sẽ thấy kết quả.
Var1 = <?php echo $var1 ?>

Var2 = <?php echo $var2?>

Var1 = <?php echo $var1 ?>

Var2 = <?php echo $var2?>

Ở đây ta thấy rằng ta truyền cho view 1 mảng , nhưng khi truy xuất lại dùng trực tiếp qua biến mà ko thông qua mảng . Điều này là nhờ CI đã chuyển hết các cặp khóa và giá trị trong mảng thành biến mang giá trị tương ứng giúp ta làm việc dễ dàng hơn.
Hết bài 3 , bài sau tớ sẽ bắt tay vào xây dựng 1 ứng dụng đơn giản với CI .
Để thêm sinh động, ta sẽ tiến hành dùng CI để viết một ứng dụng nho nhỏ cho vui nhà vui cửa
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Ứng dụng của chúng ta chỉ thực hiện 1 vài tác vụ đơn giản như sau :
- Upload 1 file hình lên
- Tạo thumbnail cho nó
- Lưu thông tin về hình ảnh vào database
- Show link file gốc và thumbnail ra .
.... Hết . Giống thằng Imageshack nhỉ
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Để thực hiện công việc ấy ta cần tạo 1 database với cấu trúc như sau :
- Database name : cidemo
- Table : img
+ id int auto_increment
+ title varchar(255) not null
+ img varchar(255) not null
+ thumb varchar(255) not null
Và ... vẽ ra 1 template đơn giản để dùng
Template của tớ vẽ ra như sau ( hơi xấu , nhưng dùng được )
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

Home | Upload | About Me

Welcome

Nội Dung ở đây

DoanGia 2008 . powered by CodeIgniter

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

Home | Upload | About Me

Welcome

Nội Dung ở đây

DoanGia 2008 . powered by CodeIgniter

Và CSS
Code:
body {
margin-top: 0px;
margin-left: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
h1
{
margin:0;
padding:0;
text-align:left;
color:#FF9933;
font-size:24px;
}
label{
font-weight: bold;
}
p {
text-align:justify;
color:#777777;
font-size: 90%;
line-height: 1.5em;
}
.error
{
color:red;
}
.img
{
width:200px;
float:left;
}
.image
{
background-color:#F0F0F0;
border-style:dotted; border-width:1px; border-color:#0080ff;
}
/*HEADER*/
#header{
width: 800px;
position:relative;
height: 80px;
border-bottom:1px solid #7DA5E0;
}
#sitename {
position:absolute;
font-family: Verdana, Arial, Helvetica, sans-serif;
color :#7DA5E0;
font-size: 32px;
font-weight: bold;
margin-top:10px;
margin-left:40px;
left: 0px;
top: 0px;
}
/*MENU IN HEADER*/
#menu{
position:absolute;
bottom: 5px;
right: 30px;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
}
#menu a{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#FF9933;
text-decoration:none;
}
#menu a:hover{
text-decoration:underline;
}
/*CONTENT*/
#content{
width: 800px;
}
#contenttext{
width: 800px;
margin-top:30px;
}
/*FOOTER*/
.footer{
width: 800px;
height: 30px;
clear:both;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#000000;
border-top:1px solid #7DA5E0;
}
/*FOOTER LINKS*/
.footer a{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#FF9933;
text-decoration:none;
}
.footer a:hover{
text-decoration:underline;
}
margin-top: 0px;
margin-left: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
h1
{
margin:0;
padding:0;
text-align:left;
color:#FF9933;
font-size:24px;
}
label{
font-weight: bold;
}
p {
text-align:justify;
color:#777777;
font-size: 90%;
line-height: 1.5em;
}
.error
{
color:red;
}
.img
{
width:200px;
float:left;
}
.image
{
background-color:#F0F0F0;
border-style:dotted; border-width:1px; border-color:#0080ff;
}
/*HEADER*/
#header{
width: 800px;
position:relative;
height: 80px;
border-bottom:1px solid #7DA5E0;
}
#sitename {
position:absolute;
font-family: Verdana, Arial, Helvetica, sans-serif;
color :#7DA5E0;
font-size: 32px;
font-weight: bold;
margin-top:10px;
margin-left:40px;
left: 0px;
top: 0px;
}
/*MENU IN HEADER*/
#menu{
position:absolute;
bottom: 5px;
right: 30px;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
}
#menu a{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#FF9933;
text-decoration:none;
}
#menu a:hover{
text-decoration:underline;
}
/*CONTENT*/
#content{
width: 800px;
}
#contenttext{
width: 800px;
margin-top:30px;
}
/*FOOTER*/
.footer{
width: 800px;
height: 30px;
clear:both;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#000000;
border-top:1px solid #7DA5E0;
}
/*FOOTER LINKS*/
.footer a{
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
font-weight: bold;
color:#FF9933;
text-decoration:none;
}
.footer a:hover{
text-decoration:underline;
}
Và ta sơ chế nguyên liệu để dễ làm việc. Tạo 1 folder css trong cidemo và cho đoạn css trên vào 1 file tên là style.css
Từ template trên ta cắt nhỏ ra thành 3 phần để dễ chỉnh sửa và làm việc.
Và tớ cắt thế này
**header**
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

Home | Upload | About Me

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

Home | Upload | About Me

**Content**
Code:

Welcome

Nội Dung ở đây

Welcome

Nội Dung ở đây

**Footer**
Code:

DoanGia 2008 . powered by CodeIgniter

DoanGia 2008 . powered by CodeIgniter

Không cắt ra cũng không sau, nhưng cắt ra thì dễ làm việc hơn ( theo tớ)
Từ 3 mảnh cắt ấy ta tạo thành 3 file header.php, content.php và footer.php đặt vào folder views
Xong bước chuẩn bị nguyên liệu . Đến bước cấu hình thêm CI 1 tí .
Ở các bài trước ta đã cấu hình thông tin về base url và default controller . Và ở bài này ta sẽ cấu hình thêm 2 phần quan trọng nữa là database và auto load .
Vì ứng dụng của chúng ta có thao tác với cơ sở dữ liệu nên ta phải cung cấp thông tin kết nối cơ sở dữ liệu
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Code:
$active_group = "default";Tạm thời ta chỉ cung cấp thông tin cơ bản là hostname, username, password và databasename là đủ, các thông tin khác cứ để mặc định.
$active_record = TRUE;
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "cidemo";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$active_record = TRUE;
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "cidemo";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
Và để khỏi mất công Load thư viện database khi dùng , ta sẽ nhờ CI tự load bằng cách mở file autoload.php trong folder config và tìm :
$autoload['libraries'] = array();
và sửa thành:
$autoload['libraries'] = array('database');
Nếu cần tự load thêm thư viện gì nữa bạn có thể thêm vào VD:
$autoload['libraries'] = array('database', 'session');
Nhưng tạm thời ta chỉ dùng database thôi.
Và có 1 helper hữ dụng luôn cần đến là url , ta tìm
$autoload['helper'] = array();
Sửa thành
$autoload['helper'] = array('url');
Ý nghĩa của việc cấu hình autoload là thế nào ? Thông thường, mỗi khi muốn dùng thư viện hay helper nào , ta sẽ phải tự load lên bằng cách :
$this->load->helper('Tên Helper') hoặc $this->load->library('tên Library')
Điều này chỉ có tác dụng trong controller hiện tại. Và nếu ở controller nào bạn cũng cần dùng helper ấy thì ... mỗi lần như thế phải load lên , rất vất vả. Thay vì làm như thế bạn sẽ nhờ CI load giúp lúc khởi tạo ứng dụng, như thế chỗ nào cũng có thể dùng mà ko cần phải load lên.
---
Thế là xong phần cấu hình.Bây giờ có thể chuyên tâm code
Đầu tiên ta sẽ thực hiện một vài vấn đề râu ria đơn giản làm quen trước.Ta sẽ tạo 2 trang gần như tĩnh là trang chủ chào mừng và trang giới thiệu ( about me
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Như đã nói , mọi chuyện bắt đầu từ controller, trái tim của ứng dụng. Ta lại quay lại với controller Home và sửa nội dung function index
Code:
function index()
{
$this->data['heading'] = 'Welcome to CodeIgniter Demo';
$this->data['content'] = 'Đây là website xây dựng dựa trên CodeIgniter Framework. Website minh họa một số chức năng cơ bản của CodeIgniter . Hi vọng sẽ giúp ích được cho các bạn mới làm quen với CodeIgniter.

Các bạn có thể tham khảo thêm CodeIgniter User Guide được kèm trong bản phân phối của CodeIgniter để tìm hiểu thêm các chức năng khác mà CodeIgniter hỗ trợ.';
$this->load->view("content",$this->data);
}
{
$this->data['heading'] = 'Welcome to CodeIgniter Demo';
$this->data['content'] = 'Đây là website xây dựng dựa trên CodeIgniter Framework. Website minh họa một số chức năng cơ bản của CodeIgniter . Hi vọng sẽ giúp ích được cho các bạn mới làm quen với CodeIgniter.

Các bạn có thể tham khảo thêm CodeIgniter User Guide được kèm trong bản phân phối của CodeIgniter để tìm hiểu thêm các chức năng khác mà CodeIgniter hỗ trợ.';
$this->load->view("content",$this->data);
}
Không có gì mới lạ đúng ko ?
Tiếp đến bạn mở file content.php trong folder view và sửa nó lại thành
Code:
<?php
$this->load->view("header");?>

<?=$heading?>

<?=$content?>

<?php
$this->load->view("footer");?>
$this->load->view("header");?>

<?=$heading?>

<?=$content?>

<?php
$this->load->view("footer");?>
Tại đây chúng ta sẽ load 2 file view là header và footer vào , như thế trong controller bạn chỉ cần gọi thằng content là đủ , nó sẽ kéo theo 2 thằng kia
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Và sửa tiếp file header.php trong folder views lại 1 tí .
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="<?=base_url()?>css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

<a xhref="<?=base_url()?>">Home | <a xhref="<?=site_url('upload')?>">Upload | <a xhref="<?=site_url("home/about")?>">About Me

<meta name="author" content="DoanGia (phpvn.org)" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" xhref="<?=base_url()?>css/style.css" type="text/css" />
<title>CodeIgniter Demo</title>

CodeIgniter Demo

<a xhref="<?=base_url()?>">Home | <a xhref="<?=site_url('upload')?>">Upload | <a xhref="<?=site_url("home/about")?>">About Me

Ta dùng 2 hàm của helper url là base_url và site_url để tự sinh url cho ứng dụng
base_url sẽ cho ra đường dẫn đến ứng dụng ( như ta đã config) , ở đây nó cho ra :
[http://localhost/cidemo](http://localhost/cidemo)
Và site_url tạo 1 url chuẩn cho trang web , như trên site_url('upload') sẽ cho ra
[http://localhost/cidemo/index.php/upload](http://localhost/cidemo/index.php/upload)
----
Việc dùng 2 hàm này rất hữu ích khi ta đưa ứng dụng vào sử dụng không phải chỉnh lại từng đường dẫn ...
Chạy ứng dụng bạn sẽ thấy...
Hôm qua đang cao hứng viết thì bị gọi về , mất hết cả hứng.
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Hôm nay cố lấy lại cảm hứng để viết. Thực ra thì ứng dụng này tớ đã viết xong rồi , bây giờ chỉ cố tìm cách giải thích thôi
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
---
Trở lại với ứng dụng, sau bài trước ta đã tạo ra được một trang chào mừng khá đơn giản. Và ta tiếp tục đà đơn giản đó để tạo thêm một trang about me giới thiệu cho có vẻ hoành tráng.
Tiếp tục với controller Home , ta thêm vào một phương thức nữa như sau:
Code:
<?phpfunction about() { $this->data['heading'] = "About Me"; $this->data['content'] = 'Tui: Một người đẹp trai đến khó tin, nói chuyện có duyên đến kỳ lạ, hát hay đáng hâm mộ, code tốt, design được, giỏi ngoại ngữ, học đâu biết đó, thói hư tật xấu gần như không có, chỉ mắc phải một tật xấu nho nhỏ : NỖ'; $this->load->view('content',$this->data); }?>
Lại chạy ứng dụng, click vào link about trên menu , ta sẽ thấy kết quả
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
[http://localhost/cidemo/index.php/home/about](http://localhost/cidemo/index.php/home/about)
Xong phần râu ria trang trí không mấy khó khăn.
Bây giờ ta bắt đầu đi vào phần chính của ứng dụng : upload và tạo thumbnail cho ảnh. Quá trình đó tớ có thể mô tả như sau :
- Tạo form để người dùng chọn ảnh upload
- Khi người dùng nhấn upload , ta sẽ xử lý quá trình upload lên server . Nếu có lỗi sẽ quay về trang upload để người dùng nhập thông tin lại kèm theo thông báo lỗi.
- Nếu quá trình upload thành công ta sẽ tạo thumbnail cho ảnh vừa upload
- Sau khi tạo thumbnail xong, ta sẽ ghi thông tin về ảnh vào cơ sở dữ liệu
- Bước cuối cùng là in thông tin về ảnh ra cho người dùng xem.
Để bắt đầu thực hiện ta tạo 1 controller mới tên là upload với nội dung ban đầu như sau
Code:
<?phpclass Upload extends Controller{ var $data = array(); function Upload() { parent::Controller(); $this->load->helper('form'); } function index() { $this->data['error'] = ''; $this->load->view('upload_form',$this->data); }?>
Lúc ban đầu ta sẽ load upload form lên cho người dùng nhập , nhìn vào đoạn mã trên chắc chắn rằng ta phải tạo một file view tên là upload_form.php . Và đây là nội dung của file đó :
Code:
<?php
$this->load->view("header");?>

Upload Form

Chấp nhận các loại file ảnh png, gif, jpg có dung lượng nhỏ hơn 2 Mb

<?php
echo form_open_multipart('upload/do_upload'); echo form_label('Image Title (*)','title'); echo '
'; echo form_input('title'); echo '

'; echo form_label('Images File (*)','img'); echo '
'; echo form_upload('img'); echo '

'; echo form_submit('submit', 'Upload!'); echo form_close(); ?>

<?=$error?>

<?php
$this->load->view("footer");?>
$this->load->view("header");?>

Upload Form

Chấp nhận các loại file ảnh png, gif, jpg có dung lượng nhỏ hơn 2 Mb

<?php
echo form_open_multipart('upload/do_upload'); echo form_label('Image Title (*)','title'); echo '
'; echo form_input('title'); echo '

'; echo form_label('Images File (*)','img'); echo '
'; echo form_upload('img'); echo '

'; echo form_submit('submit', 'Upload!'); echo form_close(); ?>

<?=$error?>

<?php
$this->load->view("footer");?>
Ở đây có một vài điểm khác thường so với các file view từ đầu đến giờ ta vẫn hay tạo. Ở đây tớ dùng một helper khác của CI là form helper ( các hàm hỗ trợ thao tác với form). Để sử dụng helper này trong controller tớ đã load nó lên trong phương thức xây dựng thế này :
Code:
$this->load->helper('form');Và trong file view tớ sử dụng chúng một cách trực tiếp bằng cách gọi hàm thông thường. Và công dụng của chúng như sau :
Code:
form_open_multipart('upload/do_upload');Hàm này sẽ cho ra một thẻ mở form dùng cho việc upload , thay vì dùng hàm đó ta sẽ phải viết HTML thế này
Code:
<form enctype="multipart/form-data" action="upload/do_upload" method="POST">Rõ ràng cách dùng helper sẽ khỏe người hơn.
- form_label('Image Title (*)','title');
Cho ra
Code:
Image Title (*)- form_input('title');
cho ra
Code:
<input type="text" name="title">....
Các hàm sau cũng tương tự thế , các bạn xem
[http://codeigniter.com/user_guide/helpers/form_helper.html](http://codeigniter.com/user_guide/helpers/form_helper.html)để biết thêm chi tiết.
Bên dưới tớ để một vùng để in ra lỗi nếu có , mặc định lúc ban đầu biến này sẽ là rỗng ( định bên trong controller) , nếu có lỗi sẽ truyền thông điệp qua biến này.
Ok, bây giờ bạn có thể chạy ứng dụng để xem thử :
[http://localhost/cidemo/index.php/upload](http://localhost/cidemo/index.php/upload)
Ở trên ta đã qui định nơi xử lý việc upload file này là trong phương thức do_upload của controller upload
Vì thế ta sẽ tạo ra phương thức do_upload trong controller upload
Đầu tiên việc cần làm trong phương thức này là kiểm tra dữ liệu nhập vào đã hợp lệ hay chưa. CI có một thư viện hỗ trợ việc kiểm tra dữ liệu đầu vào này khá tốt là library Validation . Để sử dụng đầu tiên bạn phải load nó lên :
Code:
$this->load->library('validation');
Và cho nó biết "đòi hỏi" của chúng ta với từng field của form như thế nào, trong tường hợp này tôi muốn field không được để trống , tôi sẽ làm như sau
Code:
$rules['title'] = "required";Và để tiến hành kiểm tra ta dùng phương thức run của lớp validation , phương thức này sẽ trả về true nếu dữ liệu đầu vào đạt yêu đầu , ngược là sẽ false và kèm theo thông tin lỗi được gửi kèm trong thuộc tính error_string . Sau khi load thư viện lên ta có thể truy xuất nó bằng cú pháp : $this->[tên thư viện]->[phương thức/thuộc tính] .Tớ tiến hành kiểm tra như sau :
$this->validation->set_rules($rules);
$this->validation->set_rules($rules);
Code:
<?phpfunction do_upload() { $this->load->library('validation'); $rules['title'] = "required"; $this->validation->set_rules($rules); if ($this->validation->run() == FALSE) { $this->data['error'] = 'Vui lòng nhập tiêu đề ảnh'; $this->load->view('upload_form',$this->data); } else {Nếu xác thực không đạt yêu cầu ta sẽ cho quay về form upload kèm theo thông báo lỗi. Xem thêm tại :
// xu ly upload
}
}?>
// xu ly upload
}
}?>
[http://codeigniter.com/user_guide/libraries/validation.html](http://codeigniter.com/user_guide/libraries/validation.html)
Ở đây tớ không xác thực field file , tớ sẽ dành phần đó cho phần upload xử lý
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Nếu xác thực ok , ta sẽ tiến hành upload ... ta lại dùng tiếp một thư viện cung cấp sẵn của CI để xử lý việc này. Thư viện này mang tên upload
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Quá trình thực hiện diễn ra như sau:
Code:
<?php
$config['upload_path'] = UPLOAD_DIR; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '2048'; $config['encrypt_name'] = TRUE; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('img')) { $this->data['error'] = $this->upload->display_errors(); $this->load->view('upload_form', $this->data); } else {
// Da upload xog }?>
$config['upload_path'] = UPLOAD_DIR; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '2048'; $config['encrypt_name'] = TRUE; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('img')) { $this->data['error'] = $this->upload->display_errors(); $this->load->view('upload_form', $this->data); } else {
// Da upload xog }?>
Đầu tiên ta load thư viện lên và truyền cho nó một số thông tin khởi tạo về quá trình upload , ở đâu tớ dùng một số cấu hình:
$config['upload_path'] = $this->upload_dir; //qui định thư mục chứa hình
$config['allowed_types'] = 'gif|jpg|png'; // chấp nhận định dạng file nào ( ở đây là .gif,.png và . jpg )
$config['max_size'] = '2048'; //Kích thước tối đa của file upload tính bằng kb , ở đây là 2 Mb
$config['encrypt_name'] = TRUE; // Mã hóa tên file upload lên
Sau khi khởi tạo , bạn gọi phương thức do_upload để tiến hành upload , nếu upload thành công sẽ trả về true và kèm theo một thuộc tính lưu giữ thông tin về file đã upload , ngược lại trả về false
Code:
function do_upload()
{
$this->load->library('validation');
$rules['title'] = "required";
$this->validation->set_rules($rules);
if ($this->validation->run() == FALSE)
{
$this->data['error'] = 'Vui lòng nhập tiêu đề ảnh';
$this->load->view('upload_form',$this->data);
}
else
{
$config['upload_path'] = $this->upload_dir;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2048';
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('img'))
{
$this->data['error'] = $this->upload->display_errors();
$this->load->view('upload_form', $this->data);
}
else
{
//xu ly tao thumbnail
}
}
}
{
$this->load->library('validation');
$rules['title'] = "required";
$this->validation->set_rules($rules);
if ($this->validation->run() == FALSE)
{
$this->data['error'] = 'Vui lòng nhập tiêu đề ảnh';
$this->load->view('upload_form',$this->data);
}
else
{
$config['upload_path'] = $this->upload_dir;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '2048';
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('img'))
{
$this->data['error'] = $this->upload->display_errors();
$this->load->view('upload_form', $this->data);
}
else
{
//xu ly tao thumbnail
}
}
}
ta sẽ khai báo 2 thuộc tính trong controller này để lưu thư mục chứa hình upload và hình thumbnail
Ta thêm
Code:
var $upload_dir = "uploads/";Vào sau dòng var $data;
var $thumb_dir = "upload/thumb";
var $thumb_dir = "upload/thumb";
Tạm thời khoan hãy chạy vội, ta sẽ tiếp tục quá trình tạo thumbnail . Để dễ nhìn tớ tách việc tạo thumbnail này ra thành một phương thức riêng , do phương thức này chỉ là phương thức tiện ích nên ta đặt tên khác thông thường 1 tí là thêm dấu _ ở phía trước , việc đặt tên thế này CI sẽ xem phương thức đó là private và không cho bên ngoài truy xuất vào , phương thức này có nội dung như sau :
Code:
function _thumb($img)Ở đây là dùng thư viện image_lib của CI để thực hiện việc tạo thumbnail . Cách cấu hình cơ bản như thế, $img là biến nhận đường dẫn của hình cần tạo thumbnail .
{
$config['image_library'] = 'gd';
$config['source_image'] = $img;
$config['new_image'] = $this->thumb_dir;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = 200;
$config['height'] = 200;
$this->load->library('image_lib', $config);
if(!$this->image_lib->resize())
return false;
else
return true;
}
{
$config['image_library'] = 'gd';
$config['source_image'] = $img;
$config['new_image'] = $this->thumb_dir;
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width'] = 200;
$config['height'] = 200;
$this->load->library('image_lib', $config);
if(!$this->image_lib->resize())
return false;
else
return true;
}
Và ở phương thức do_upload ta gọi đến nó như sau :
Code:
<?phpfunction do_upload() { $this->load->library('validation'); $rules['title'] = "required"; $this->validation->set_rules($rules); if ($this->validation->run() == FALSE) { $this->data['error'] = 'Vui lòng nhập tiêu đề ảnh'; $this->load->view('upload_form',$this->data); } else { $config['upload_path'] = $this->upload_dir; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '2048'; $config['encrypt_name'] = TRUE; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('img')) { $this->data['error'] = $this->upload->display_errors(); $this->load->view('upload_form', $this->data); } else { $img = $this->upload->data(); if($this->_thumb($img['full_path'])) { //Luu vap database } } } }?>Đó là xong quá trình upload và tạo thumbnail
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Tạm nghỉ tí , mai tớ sẽ tiếp phần cuối
![ Cheesy](http://s26.postimg.org/eioxh2z3p/image.gif)
Xin lỗi vì delay lâu quá
![]()
Bài 4 : MODEL
Trong MVC , Model đóng vai trò là người giữ kho ( tớ cho là thế ) . Muốn đưa thông tin và cơ sở dữ liệu => model , muốn lấy thông tin từ cơ sở dữ liệu => model . Trong CI tớ thấy như thế , nhưng trong MVC design pattern hình như Model còn đóng vai trò xử lý nữa thì phải ... Tớ ko thật sự rành lắm . Tạm thời cứ cho nó là ông thần giữ cửa kho báo thôi
![]()
trong CI , để sử dụng model , đầu tiên ta phải tạo ra model chứa trong folder model , và khuôn dạng nó như sau
Code:
<?phpclass demo_model extends Model{Nó như thế , muốn xử lý gì nữa thì cứ cho thêm phương thức vào .
function Model()
{
parent::Model();
}
}?>
Và trong Controller ta gọi đến model để xử lý như sau
Code:
<?phpclass Demo extends Controller{
function Demo()
{
parent::Controller();
}
function index()
{
$this->load->model('Demo_model');
}
}
?>
Sau khi gọi vào có thể sử dụng như sau
$this->Demo_model->[ phương thức]
Sơ lược chỉ có thế , và trong Model bạn hoàn toàn có thể làm thế này :
Code:
<?phpclass demo_model extends Model{
function Model()
{
parent::Model();
}
function insert($name)
{
$conn = mysql_connect($host,$user,$pass);
$db = mysql_select_db($database,$conn);
return $query = mysql_query("insert into table values(null,'$name')");
}
}?>
Nhưng như thế không sướng
![]()
Vd ... thay vì viết thế này để insert một mẩu tin vào cơ sở dữ liệu :
Code:
$query = mysql_query("insert into table(title,name,date) values('$title','$name',$date)");
ta có thể dùng Active Record thế này trong CI
Code:
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);
$this->db->insert('mytable', $data);
Với Active Record dữ liệu truyền vào sẽ qua một bước sàng lọc và escape tốt hơn
Với Active Record này bạn không cần phải viết bất kỳ câu SQL nào cả mà vẫn làm việc tốt , nó hỗ trợ gần như đầy đủ các thao tác về database như thêm , sửa , xóa , truy xuất ....
Bạn nên tìm hiểu thêm trong User Guide
![]()
---
Bây giờ trở lại với ứng dụng mẫu , bây giờ đến bước ta lưu vào cơ sở dữ liệu , cũng là lúc dùng đến Model
![]()
Ở bài trước ta đã tạo xong thumbnail , chỉ còn chờ lưu vào cơ sở dữ liệu .
Đây là quá trình đó
Code:
if($this->_thumb($img['full_path']))
{
$dt['title'] = $this->input->post('title');
$dt['img'] = $this->upload_dir.$img['file_name'];
$dt['thumb'] = $this->thumb_dir_dir.$img['raw_name'].'_thumb'.$img['file_ext'];
$this->load->model('Img_model');
$id=$this->Img_model->add($dt);
redirect('upload/view/'.$id, 'location', 301);
}
Có 1 vài điểm cần nói :
- Để nhận dữ liệu người dùng post lên ta dùng $this->input->post('title'); thay cho $_POST['title'];
- Dữ liệu cần add vào cơ sở dữ liệu ta cho vào 1 mảng mới khóa ứng với tên trường .Xong truyền vào cho model xử lý
Tất nhiên ta phải tạo 1 file model thế này
Code:
<?phpclass Img_model extends Model{ var $table = 'img'; function Img_model() { parent::Model(); } function add($data) { $this->db->insert($this->table,$data); return $this->db->insert_id(); }
}?>
Sao có người viết hay thế nhỉ!!!.Trả lờiXóa
thk a lot.


text:
NỔI BẬT
BÀI VIẾT MỚI
Đáp Án Chi Tiết Đề Minh Họa Lần 2 Môn Toán Bộ Giáo Dục Năm 2017. Vừa qua, Bộ Giáo Dục đã công bố 14 Đề Minh Họa lần 2. Trong đó có Toán là môn thi trắc nghiệm. Blog Toán đã sưu tầm và tìm được đáp án chi tiết cho đề minh họa […]
Đề minh họa môn Toán lần 2 năm 2017 của Bộ Giáo Dục. Chiều ngày 14/1/2017, Bộ Giáo Dục đã công bố 14 đề minh họa lần 2 các môn thi THPT Quốc Gia 2017. Blog Toán xin chia sẻ lại đề thi minh họa của Bộ Giáo Dục cho các bạn tham khảo. Như […]
Sách Trắc Nghiệm Toán 12 nhà xuất bản Giáo Dục Việt Nam do Đoàn Quỳnh làm chủ biên.Ngày 28/9/2016, Bộ Giáo Dục đã công bố phương án kỳ thi THPT Quốc Gia 2017. Nét mới của kỳ thi năm 2017 là có 5 bài thi: Toán, Ngữ Văn, Ngoại Ngữ, Khoa Học Tự Nhiên ( […]
Đề thi thử môn Toán THPT Hàn Thuyên lần 1 năm 2017 của tỉnh Bắc Ninh. Là một trong những ngôi trường THPT rất đẹp. THPT Hàn Thuyên nhanh chóng có đợt thi thử đầu tiên, giúp các em học sinh ôn thi tốt. Blog Toán xin chia sẻ đề và đáp án của trường. […]
Đề thi thử Môn Toán THPT Triệu Sơn 2 Lần 1 năm 2017 của tỉnh Thanh Hóa. Đề thi thử và đáp án mã đề 272, Blog Toán chia sẻ lại cho các em tải về làm thử. Các đề thi tiếp theo sẽ được cập nhật liên tục. Đề thi thử lần 1 THPT […]
Đề thi thử môn Toán THPT Yên Lạc lần 1 năm 2017 tỉnh Vĩnh Phúc. Đề thi trắc nghiệm theo khung của Bộ Giáo Dục. Blog Toán xin chia sẻ lại cho các em ôn thi THPT Quốc Gia. Chúc các em ôn thi tốt với các đề thi thử của Blog. Nhớ like fanpage […]
THPT Nguyễn Xuân Nguyên tỉnh Thanh Hóa tổ chức kỳ thi thử lần 1 môn Toán năm 2017. Với nhiều mã đề khác nhau, cho thấy trường đã rất kỳ công trong việc thi thử. Đề thi thử lần 1 không khó, các bạn có thể làm hết và đạt điểm tối đa. Hãy nắm […]
Đề thi thử môn Toán THPT Nho Quan A tỉnh Ninh Bình Lần 1 năm 2017. Blog Toán xin chia sẻ với các bạn đề thi thử lần 1 của trường. Theo cấu trúc đề minh họa của Bộ Giáo Dục, đề sẽ đánh giá đúng năng lực học sinh. Đề thi thử lần 1 […]
Trường THPT Bảo Lâm – Lâm Đồng tổ chứ kỳ thi thử THPT Quốc Gia năm 2017. Đề và đáp án đầy đủ được Blog Toán chia sẻ lại cho các em. Có lẽ do năm nay đổi mới nên đáp án khá chi tiết để các em có thể học hỏi. Năm nay đổi […]
THPT Trần Hưng Đạo – TP. Hồ Chí Minh tổ chứ kỳ thi thử lần 1 năm 2017. Với 50 câu trắc nghiệm Toán bám theo đề minh họa của Bộ Giáo Dục. Trường THPT Trần Hưng Đạo đã hoàn tất đề thi theo khuân mẫu. Đề khi không quá khó, các bạn hoàn toàn […]
THPT Yên Phong 2 – Bắc Ninh tổ chức kỳ thi thử Quốc Gia 2017. Ngay sau khi đề minh họa 2017 của Bộ Giáo Dục công bố, trường đã nhanh chóng ra đề mới. Đề thi không khó quá, các bạn hoàn toàn có thể đạt được điểm số tối đa. Hãy cố gắng […]
THPT Phạm Văn Đồng tổ chức kỳ thi thử THPT Quốc Gia năm 2017. Đây là đề thi trắc nghiệm theo khuân mẫu của đề minh họa 2017. Blog Toán xin chia sẻ với các em đề thi thử của trường Phạm Văn Đồng. Các em hãy cố gắng luyện tập thật tốt để đạt […]
Blog Toán THPT

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

WARC-Identified-Payload-Type: text/html

Server: cloudflare-nginx

Connection: close

Pragma: public

Cache-Control: max-age=3600, public

Vary: Accept-Encoding

Content-Type: text/html; charset=UTF-8

X-Powered-By: W3 Total Cache/0.9.5.4


text:
Link Download
Để tải phim Lời Thề Yêu Nữ về máy, bạn nhập mã xác nhận bên duới rồi bấm nút "Lấy link download". Danh sách link tải phim Pledge This! miễn phí sẽ hiện ra. Hãy chọn server phù hợp để downnload với tốc độ nhanh nhất.
Phim liên quan
Phim cùng thể loại
- Đêm Giao Thừa Của Lão Lý 2016 Hài Hước, Tình Cảm
- Chuyện Điên Cuồng Nhỏ Bé Gọi Là Tình Yêu 2016 Tình Cảm, Hài Hước
- Chàng Cảnh Sát Và Em 2017 Hài Hước, Tình Cảm
- Kim Ngọc Lương Duyên 2014 Dã sử - Cổ trang, Hài Hước
- Chân Ái Vô Song 2017 Hài Hước, Tâm Lý
- Vết Bớt Tai Ương 2017 Hài Hước, Kinh Dị
- Nhiệt Huyết Tuổi Trẻ 2017 Hài Hước, Hình sự
- Nghiện Yêu 2017 Tình Cảm, Hài Hước
- Một Gia Đình Thật Tuyệt Vời 2016 Hài Hước
- Tướng Quân Ở Trên Ta Ở Dưới 2017 Hài Hước, Dã sử - Cổ trang
- Đội Bóng Tiếu Lâm 2016 Hài Hước
- Tình Yêu Không Khoảng Cách 2015 Hài Hước, Tình Cảm
Từ khóa tìm nhiều: Bom Tan bảy viên ngọc rồng siêu cấp running man Đảo hải tặc mái Ấm gia Đình boruto: naruto thế hệ kế tiếp học tỳ ma cà rồng tru tiên thanh vân chí naruto ChÂu Tinh TrÌ gia Đình là số 1 bằng chứng thép cộng sự phi phàm quan xẩm lóc cóc Cộng Sự ThÃ nh Long 7 viên ngọc rồng Năm Ấy Hoa Nở Trăng Vừa Tròn người trong giang hồ 2: mãnh long quá giang long môn phi giáp
Bomtan.Org - Xem phim online miễn phí, chất lượng hình ảnh rõ nét, tốc độ tải phim nhanh. Bom Tấn tổng hợp có chọn lọc các phim từ nhiều nguồn trên internet (youtube, picasa,...) để mang đến cho các bạn những bộ phim hành động, phim võ thuật, các thể loại phim tâm lý tình cảm hay nhất.
RSS - Sitemap
© 2015 BomTan. All Rights Reserved. Website thử nghiệm với mục đích giao lưu học hỏi, đang chờ xin giấy phép.

markdown:
|
|
## Download Lời Thề Yêu Nữ
## Link Download
Để
**tải phim Lời Thề Yêu Nữ**về máy, bạn nhập mã xác nhận bên duới rồi bấm nút "Lấy link download". Danh sách link **tải phim Pledge This!**miễn phí sẽ hiện ra. Hãy chọn server phù hợp để downnload với tốc độ nhanh nhất.
Phim liên quan
Phim cùng thể loại
-
[Đêm Giao Thừa Của Lão Lý](/phim-dem-giao-thua-cua-lao-ly-17561.html)2016 Hài Hước, Tình Cảm
-
[Chuyện Điên Cuồng Nhỏ Bé Gọi Là Tình Yêu](/phim-chuyen-dien-cuong-nho-be-goi-la-tinh-yeu-17553.html)2016 Tình Cảm, Hài Hước
-
[Chàng Cảnh Sát Và Em](/phim-chang-canh-sat-va-em-17550.html)2017 Hài Hước, Tình Cảm
-
[Kim Ngọc Lương Duyên](/phim-kim-ngoc-luong-duyen-17549.html)2014 Dã sử - Cổ trang, Hài Hước
-
[Chân Ái Vô Song](/phim-chan-ai-vo-song-17543.html)2017 Hài Hước, Tâm Lý
-
[Vết Bớt Tai Ương](/phim-vet-bot-tai-uong-17541.html)2017 Hài Hước, Kinh Dị
-
[Nhiệt Huyết Tuổi Trẻ](/phim-nhiet-huyet-tuoi-tre-17537.html)2017 Hài Hước, Hình sự
-
[Nghiện Yêu](/phim-nghien-yeu-17535.html)2017 Tình Cảm, Hài Hước
-
[Một Gia Đình Thật Tuyệt Vời](/phim-mot-gia-dinh-that-tuyet-voi-17512.html)2016 Hài Hước
-
[Tướng Quân Ở Trên Ta Ở Dưới](/phim-tuong-quan-o-tren-ta-o-duoi-17502.html)2017 Hài Hước, Dã sử - Cổ trang
-
[Đội Bóng Tiếu Lâm](/phim-doi-bong-tieu-lam-17486.html)2016 Hài Hước
-
[Tình Yêu Không Khoảng Cách](/phim-tinh-yeu-khong-khoang-cach-17477.html)2015 Hài Hước, Tình Cảm **Từ khóa tìm nhiều:** [Bom Tan](/tu-khoa/Bom-Tan) [bảy viên ngọc rồng siêu cấp](/phim-bay-vien-ngoc-rong-sieu-cap-13481.html) [running man](/phim-thu-thach-than-tuong-12585.html) [Đảo hải tặc](/phim-dao-hai-tac-4168.html) [mái Ấm gia Đình](/phim-mai-am-gia-dinh-10248.html) [boruto: naruto thế hệ kế tiếp](/phim-boruto-naruto-the-he-ke-tiep-17270.html) [học tỳ ma cà rồng](/phim-hoc-ty-ma-ca-rong-17173.html) [tru tiên thanh vân chí](/phim-thanh-van-chi-14467.html) [naruto](/phim--naruto-6090.html) [ChÂu Tinh TrÌ](/tu-khoa/ChÂu-Tinh-TrÌ) [gia Đình là số 1](/phim-gia-dinh-la-so-1-phan-1-8198.html) [bằng chứng thép](/phim-bang-chung-thep-15162.html) [cộng sự phi phàm](/phim-cong-su-phi-pham-14869.html) [quan xẩm lóc cóc](/phim-quan-xam-loc-coc-2115.html) [Cộng Sự](/tu-khoa/Cộng-Sự) [ThÃ nh Long](/tu-khoa/ThÃ nh-Long) [7 viên ngọc rồng](/phim-7-vien-ngoc-rong-10812.html) [Năm Ấy Hoa Nở Trăng Vừa Tròn](/tu-khoa/Năm-Ấy-Hoa-Nở-Trăng-Vừa-Tròn) [người trong giang hồ 2: mãnh long quá giang](/phim-nguoi-trong-giang-ho-2-manh-long-qua-giang-3708.html) [long môn phi giáp](/phim-long-mon-phi-giap-3989.html)
Bomtan.Org - Xem phim online miễn phí, chất lượng hình ảnh rõ nét, tốc độ tải phim nhanh. Bom Tấn tổng hợp có chọn lọc các phim từ nhiều nguồn trên internet (youtube, picasa,...) để mang đến cho các bạn những bộ
[, phim hành động](http://bomtan.org/the-loai/hanh-dong.html) [, các thể loại](http://bomtan.org/the-loai/vo-thuat.html) **phim võ thuật** [tình cảm hay nhất.](http://bomtan.org/the-loai/tam-ly.html) **phim tâm lý** [RSS](http://bomtan.org/rss.php)- [Sitemap](http://bomtan.org/sitemap.xml)
© 2015 BomTan. All Rights Reserved. Website thử nghiệm với mục đích giao lưu học hỏi, đang chờ xin giấy phép.

WARC-Identified-Payload-Type: application/xhtml+xml

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0


text:
TIN MỚI!
VN-Index:
GTGD: tỷ VNĐ
HNX-Index:
22-10-2013 - 20:48 PM | Năng lượng - Tài nguyên
khanhnt
Theo Vietnam+
Ban biên tập CafeF
Địa chỉ: Tầng 21 Tòa nhà Center Building. Số 1 Nguyễn Huy Tưởng, Thanh Xuân, Hà Nội.
Điện thoại: 024 7309 5555 Máy lẻ 292. Fax: 024-39744082
Email: info@cafef.vn | Hotline: 0926 864 344
Chịu trách nhiệm nội dung: Ông Nguyễn Thế Tân
Liên hệ quảng cáo
Hotline: 0942 86 11 33
Email: doanhnghiep@admicro.vn
© Copyright 2007 - 2017 - Công ty Cổ phần VCCorp.
Giấy phép thiết lập trang thông tin điện tử tổng hợp trên internet số 1084/GP-STTTT do Sở Thông tin và Truyền thông Hà Nội cấp ngày 16 tháng 4 năm 2014.
Ghi rõ nguồn "CafeF" khi phát hành lại thông tin từ kênh thông tin này.

Content-Type: text/html; charset=utf-8

Cache-Control: private

Server: cf-rp

X-XSS-Protection: 1; mode=block

FilterID: ft


text:
Gakuen Alice Family
Chào mừng Khách viếng thăm đến với trại của học viện Alice chúng tớ!
Tìm kiếm
Display results as :
Số bài
Chủ đề
Tags
Advanced Search
Bài gửi sau cùng
Bài gửi
Người gửi
Thời gian
Nhà spam sô 25 - Chưa đóng trại đã chán, đóng rồi còn thảm hơn ~
Tiểu Du
Sat Sep 23, 2017 8:44 pm
[Forum fic] The artist and... >> The old friend 2
superman
Fri Jul 28, 2017 10:14 pm
[Forum Fic] Thế giới mới
Tiểu Du
Mon Jun 19, 2017 3:49 pm
[Forum fic] Đăng ký
Dr.Li
Wed May 31, 2017 7:02 pm
{Áo hường fic} Song giới - Đăng kí
superman
Sat May 06, 2017 12:14 am
Nhật ký trại...
Diệp Băng Dao
Fri May 05, 2017 6:30 pm
{Forumfic} Yellow lemon tree
Diệp Băng Dao
Sat Apr 15, 2017 6:22 pm
{Forumfic} Tích tắc | Bonus
Diệp Băng Dao
Sat Apr 15, 2017 5:54 pm
Nhà spam số 24 - Cố lết qua 2017
Lý Phong Chi Ẩn
Tue Apr 04, 2017 11:58 pm
Nhật kí GaF
Diệp Băng Dao
Sat Feb 18, 2017 8:27 pm
Lì xì liền tay, rinh quà liền túi
Miy
Fri Jan 27, 2017 4:15 pm
[Game dài kì] Đuổi hình bắt chữ > 14
Kid III
Wed Jan 25, 2017 12:49 am
[Bình chọn] Ai sẽ là bị lên thớt tuần 2
Chuyển đến trang
:
1
,
2
,
3
Ai sẽ là người bị lên thớt kì 2!
1. Móm (Momi)
88%
[ 15 ]
2. Souri
12%
[ 2 ]
3. Zan
0%
[ 0 ]
4. Yume
0%
[ 0 ]
5. Michiru (Su)
0%
[ 0 ]
Tổng số bầu chọn : 17
[Thành viên]
-
Yzu Smile
Yzu :)
Giới tính
:
Birthday
:
27/08/1995
Age
:
22
Join date
:
21/07/2012
Alice (năng lực)
:
Điều khiển thực vật
Status
:
Cười thật nhiều để không ai thấy được mình đang khóc!
Bạn đời GAF
:
Mì Ý Chàn xD~
Tiêu đề:
[Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Fri Aug 10, 2012 10:05 pm
#1
Sau 1 tuần chặt chém kinh dị of thần dân GAF đ.với con gái yêu quý of ta là Ran Xì Ke nhầm Xì Tai :">
Chưa hết hồi hào hứng và rất nhìu ng mún thể hiện tài chém và mún đc chém :"> nay ta mở kì 2 để mọi người vote
Tuần này sẽ là những nv mới toanh ^^! Nên các bợn tuần trước chưa bị chém sẽ đc giữ lại mạng để những kì sau lên thớt cho nó rôm
))))))))))))))))))))))))))
Các bạn cứ như luật cũ, chém ko quá 20 câu trên 1 lần cm ^^!
Ko hỏi các câu hỏi kiểu đố mẹo mà bác Google có câu trả lời ( hỏi những câu mà vui hay gì đó mà ko pải lấy từ trên mạng nhé :) )
Chém nhiệt tình, chém vui, chém để hiểu nhau thêm ^^! Đó là phương châm of phòng chặt chém =xxxx
Mọi người cùng vui nhé. Vote nhiệt tình.
Ai có câu chém hay nhất sẽ có quà
( Ran yêu, con chọn người chém hay chưa, cho mm xin cái tên để còn gửi quà nhé :X )
Cùg bình loạn nàooooooooooooooooooooooooooo~
Chữ kí của
Yzu Smile
Tài sản của
Yzu Smile
Tài sản
Tài sản:
[Thành viên]
-
Nomizu Iori
Yume aka Ene
Giới tính
:
Birthday
:
14/07/2000
Age
:
17
Join date
:
05/06/2012
Alice (năng lực)
:
Xâm nhập cơ thể người
Status
:
...
Medal
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Fri Aug 10, 2012 10:16 pm
#2
Hơ hơ sao có tên em thế kia, bầu cho Momi nhá
Chữ kí của
Nomizu Iori
Tài sản của
Nomizu Iori
Tài sản
Tài sản:
[Thành viên]
-
Souri ♥
Kim Souri
Giới tính
:
Birthday
:
06/08/2000
Age
:
17
Join date
:
10/08/2012
Alice (năng lực)
:
Ma Thuật yểm bùa
Status
:
Sống trên đời phải biết chém gió - sau khi lên thiên đàng mới biết chém gió với tổ tiên =))
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Fri Aug 10, 2012 10:19 pm
#3
Em tự vote cho em cũng đk nhể =))
Chữ kí của
Souri ♥
Tae Yeon
Jessica
Tiffany
Yuri
Yoona
Sooyoung
Sunny
Hyo Yeon
Seo Huyn
Spoiler:
Tài sản của
Souri ♥
Tài sản
Tài sản:
[Thành viên]
-
Yzu Smile
Yzu :)
Giới tính
:
Birthday
:
27/08/1995
Age
:
22
Join date
:
21/07/2012
Alice (năng lực)
:
Điều khiển thực vật
Status
:
Cười thật nhiều để không ai thấy được mình đang khóc!
Bạn đời GAF
:
Mì Ý Chàn xD~
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Fri Aug 10, 2012 10:20 pm
#4
Ta cũng bầu Móm =xxxxxxxxxxxxxx
@Ri: đc em :D
Chữ kí của
Yzu Smile
Tài sản của
Yzu Smile
Tài sản
Tài sản:
[Thành viên]
-
TosKun
Bạch Vũ
Giới tính
:
Birthday
:
26/03/1999
Age
:
18
Join date
:
09/10/2011
Alice (năng lực)
:
Ngưng đọng thời gian
Status
:
Nếu bạn hỏi tôi là ai, tôi sẽ mỉm cười và trả lời bạn thế này: " Tôi chỉ đơn giản là một cơn gió tự do tự tại, vô ưu vô lo, chỉ vậy mà thôi ! " *smile-ing* ~
Bạn đời GAF
:
Đan-Chan ~
Huy Chương
:
Medal
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Fri Aug 10, 2012 10:43 pm
#5
vote cho bạn chẻ momi 1 phiếu =)) ~
phù.. may quá k có mình.. =v= ~
mn tích cực vote vào nhé =)) ~
Chữ kí của
TosKun
Spoiler:
http://upanh.com/listing/?s=ecbd1c7e44bd26f90372a2edeb8a58d3
Spoiler:
http://www.fakku.net/tags/yaoi
Tài sản của
TosKun
[Thành viên]
-
Yzu Smile
Yzu :)
Giới tính
:
Birthday
:
27/08/1995
Age
:
22
Join date
:
21/07/2012
Alice (năng lực)
:
Điều khiển thực vật
Status
:
Cười thật nhiều để không ai thấy được mình đang khóc!
Bạn đời GAF
:
Mì Ý Chàn xD~
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 12:12 am
#6
Zu thoát nạn nhé =xxxxx
Tuần sau e ko thoát đc âu
Chữ kí của
Yzu Smile
Tài sản của
Yzu Smile
Tài sản
Tài sản:
[Thành viên]
-
Oz Vessalius
Member GAF
Giới tính
:
Birthday
:
23/12/1999
Age
:
17
Join date
:
01/06/2012
Alice (năng lực)
:
Lừa tềnh
Status
:
*chỉ chỉ vô ava* ai đó?ai đó?!...là Keima đó !*xịt mái mũi*
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 7:54 am
#7
Ta vote cho Momi
Chữ kí của
Oz Vessalius
Uploaded with
ImageSha
ck.us
Tài sản của
Oz Vessalius
Tài sản
Tài sản:
[Thành viên]
-
Enomoto Kazura
Đỗ Ngọc Y
Giới tính
:
Birthday
:
22/09/1998
Age
:
19
Join date
:
11/07/2012
Alice (năng lực)
:
hát, phát minh
Status
:
quay đầu là bờ, ai ngờ là biển :]]
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 7:55 am
#8
Chẻ vote cho momi 1 phiều ~
Chữ kí của
Enomoto Kazura
quà của Miy nii-chan >.<
Tài sản của
Enomoto Kazura
Tài sản
Tài sản:
[Thành viên]
-
.Nar.Kaito.
Ran - kun <3
Giới tính
:
Birthday
:
26/11/1997
Age
:
19
Join date
:
09/04/2012
Status
:
Đừng nên để việc tranh chấp nhỏ đi hủy hoại tình bạn vĩ đại.
Medal
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 10:26 am
#9
Thôi thì theo số đông
Chữ kí của
.Nar.Kaito.
Spoiler:
Tài sản của
.Nar.Kaito.
Tài sản
Tài sản:
[Thành viên]
-
Min Dâu
Cassopia
Giới tính
:
Birthday
:
15/05/1996
Age
:
21
Join date
:
02/10/2011
Alice (năng lực)
:
Sấm và nước
Status
:
INFINITE và INSPIRITS , chúng ta không phải là cái kết có hậu mà là không bao giờ kết thúc
Huy Chương
:
Medal
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 10:41 am
#10
hơ
số đông ăn hiếp ta=))
Chữ kí của
Min Dâu
My gìft
Spoiler:
Tài sản của
Min Dâu
Tài sản
Tài sản:
[Thành viên]
-
Alice Baskerville
Alice-kun
Giới tính
:
Birthday
:
18/10/1999
Age
:
18
Join date
:
14/06/2012
Alice (năng lực)
:
băng
Status
:
sexy, free and single ~
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 10:53 am
#11
hì... vote cho mo nào ~ ghi ghi... chuẩn bj tinh thần trả lời nhé..
Chữ kí của
Alice Baskerville
Tài sản của
Alice Baskerville
Tài sản
Tài sản:
[Thành viên]
-
Min Dâu
Cassopia
Giới tính
:
Birthday
:
15/05/1996
Age
:
21
Join date
:
02/10/2011
Alice (năng lực)
:
Sấm và nước
Status
:
INFINITE và INSPIRITS , chúng ta không phải là cái kết có hậu mà là không bao giờ kết thúc
Huy Chương
:
Medal
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 10:57 am
#12
chết ta *chạy trc*
Chữ kí của
Min Dâu
My gìft
Spoiler:
Tài sản của
Min Dâu
Tài sản
Tài sản:
[Thành viên]
-
Alice Baskerville
Alice-kun
Giới tính
:
Birthday
:
18/10/1999
Age
:
18
Join date
:
14/06/2012
Alice (năng lực)
:
băng
Status
:
sexy, free and single ~
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 11:45 am
#13
cứ từ từ~ *vuốt vuốt* thỏ iu cưng chạy vội làm j ??cho xuống Abyss lun bi h ~ ta chém ng xog thì ngồi chờ báo tuần san của miy hi hi... ui mặt ng mà ghép vs ku shin chắc hợp lắm. hề hề~
Chữ kí của
Alice Baskerville
Tài sản của
Alice Baskerville
Tài sản
Tài sản:
[Thành viên]
-
Souri ♥
Kim Souri
Giới tính
:
Birthday
:
06/08/2000
Age
:
17
Join date
:
10/08/2012
Alice (năng lực)
:
Ma Thuật yểm bùa
Status
:
Sống trên đời phải biết chém gió - sau khi lên thiên đàng mới biết chém gió với tổ tiên =))
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 1:12 pm
#14
Ây yà ... tiền bối Momi được vote nhiều quá ... Lần này chắc người lên thớt là Momi - unnie rồi ~
Chữ kí của
Souri ♥
Tae Yeon
Jessica
Tiffany
Yuri
Yoona
Sooyoung
Sunny
Hyo Yeon
Seo Huyn
Spoiler:
Tài sản của
Souri ♥
Tài sản
Tài sản:
[Thành viên]
-
Alice Baskerville
Alice-kun
Giới tính
:
Birthday
:
18/10/1999
Age
:
18
Join date
:
14/06/2012
Alice (năng lực)
:
băng
Status
:
sexy, free and single ~
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 1:24 pm
#15
ng là e gái momi à???
Chữ kí của
Alice Baskerville
Tài sản của
Alice Baskerville
Tài sản
Tài sản:
[Thành viên]
-
Souri ♥
Kim Souri
Giới tính
:
Birthday
:
06/08/2000
Age
:
17
Join date
:
10/08/2012
Alice (năng lực)
:
Ma Thuật yểm bùa
Status
:
Sống trên đời phải biết chém gió - sau khi lên thiên đàng mới biết chém gió với tổ tiên =))
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 1:27 pm
#16
@Alice : Không ạ ... em mới gặp tiền bối Momi 1 lần ~ Mà hình như em mới nói chuyện vs tiền bối lần đầu tiên thì phải ?
Chữ kí của
Souri ♥
Tae Yeon
Jessica
Tiffany
Yuri
Yoona
Sooyoung
Sunny
Hyo Yeon
Seo Huyn
Spoiler:
Tài sản của
Souri ♥
Tài sản
Tài sản:
[Thành viên]
-
pinpin_1910
Member GAF
Giới tính
:
Birthday
:
19/10/1996
Age
:
21
Join date
:
03/10/2011
Alice (năng lực)
:
Vô hiệu hóa
Status
:
MFC
Medal
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 2:37 pm
#17
Theo số đông, bầu chọn cho Momi
Chữ kí của
pinpin_1910
Tài sản của
pinpin_1910
Tài sản
Tài sản:
[Thành viên]
-
Min Dâu
Cassopia
Giới tính
:
Birthday
:
15/05/1996
Age
:
21
Join date
:
02/10/2011
Alice (năng lực)
:
Sấm và nước
Status
:
INFINITE và INSPIRITS , chúng ta không phải là cái kết có hậu mà là không bao giờ kết thúc
Huy Chương
:
Medal
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 3:24 pm
#18
9 phiếu
chết ta!!!!
xuống abyss thật rồi=]]
Chữ kí của
Min Dâu
My gìft
Spoiler:
Tài sản của
Min Dâu
Tài sản
Tài sản:
[Thành viên]
-
Oz Vessalius
Member GAF
Giới tính
:
Birthday
:
23/12/1999
Age
:
17
Join date
:
01/06/2012
Alice (năng lực)
:
Lừa tềnh
Status
:
*chỉ chỉ vô ava* ai đó?ai đó?!...là Keima đó !*xịt mái mũi*
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 3:41 pm
#19
Mi thích Abyss quá copnf dề *vỗ*
Chữ kí của
Oz Vessalius
Uploaded with
ImageSha
ck.us
Tài sản của
Oz Vessalius
Tài sản
Tài sản:
[Thành viên]
-
Dora-The-Kid
Reimu Hakurei
Giới tính
:
Birthday
:
16/09/1994
Age
:
23
Join date
:
27/06/2012
Alice (năng lực)
:
Lửa
Status
:
Mãi yêu Touhou
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 3:44 pm
#20
theo số đông ^^~
Chữ kí của
Dora-The-Kid
Tài sản của
Dora-The-Kid
Tài sản
Tài sản:
[Thành viên]
-
Alice Baskerville
Alice-kun
Giới tính
:
Birthday
:
18/10/1999
Age
:
18
Join date
:
14/06/2012
Alice (năng lực)
:
băng
Status
:
sexy, free and single ~
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 3:45 pm
#21
sou:ồ lần đầu à??tốt. làm e gái ta k.
mo:ukm.ta dìm ng dưới đấy 1 tuần r lôj ng lên. ng còn dk nhớ đến nhờ tuần san của miy n~quá tuyết.
Chữ kí của
Alice Baskerville
Tài sản của
Alice Baskerville
Tài sản
Tài sản:
[Thành viên]
-
Lynn Shelling
Hiệu Trưởng Cao Đẳng
Giới tính
:
Birthday
:
17/09/1997
Age
:
20
Join date
:
12/05/2012
Alice (năng lực)
:
Tàng hình
Status
:
Liệu tất cả có thể trở lại thuở ban đầu? Em khẽ cất tiếng hỏi...Nhưng trong tiếng gió thét gào...Không nghe thấy câu trả lời của nii...
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 5:35 pm
#22
1 vote cho con gái souri bằng nik này
1 vote cho móm để tuần san số sau ăn khách nhóe
Chữ kí của
Lynn Shelling
I wanna always be with you...
I wanna hold you tight right now...
I swear I will wipe your tears...
I'll give you everything I have...
Spoiler:
Tài sản của
Lynn Shelling
Tài sản
Tài sản:
[Thành viên]
-
Miy
Hiệu Trưởng Cao Đẳng
Giới tính
:
Birthday
:
17/09/1997
Age
:
20
Join date
:
23/09/2011
Alice (năng lực)
:
Ngưng đọng thời gian
Status
:
I always stand here and wait for you forever, waiting for forever, but you will go and not return...
Huy Chương
:
Medal
:
Huy hiệu
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 5:36 pm
#23
vote móm
Chữ kí của
Miy
I wanna always be with you...
I wanna hold you tight right now...
I swear I will wipe your tears...
I'll give you everything I have...
Spoiler:
Tài sản của
Miy
Tài sản
Tài sản:
[Thành viên]
-
Min Dâu
Cassopia
Giới tính
:
Birthday
:
15/05/1996
Age
:
21
Join date
:
02/10/2011
Alice (năng lực)
:
Sấm và nước
Status
:
INFINITE và INSPIRITS , chúng ta không phải là cái kết có hậu mà là không bao giờ kết thúc
Huy Chương
:
Medal
:
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 5:46 pm
#24
á
chết ta >.<
Chữ kí của
Min Dâu
My gìft
Spoiler:
Tài sản của
Min Dâu
Tài sản
Tài sản:
[Thành viên]
-
Alice Baskerville
Alice-kun
Giới tính
:
Birthday
:
18/10/1999
Age
:
18
Join date
:
14/06/2012
Alice (năng lực)
:
băng
Status
:
sexy, free and single ~
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-Sat Aug 11, 2012 5:49 pm
#25
bình tĩnh thỏ cung~
Chữ kí của
Alice Baskerville
Tài sản của
Alice Baskerville
Tài sản
Tài sản:
[Thành viên]
- Sponsored content
Tiêu đề:
Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2
-
#26
Tài sản của Sponsored content
[Bình chọn] Ai sẽ là bị lên thớt tuần 2
Trang
1
trong tổng số
3
trang
Chuyển đến trang
:
1
,
2
,
3
* Không dùng những ngôn từ thiếu lịch sự.
* Bài viết sưu tầm nên ghi rõ nguồn.
* Tránh spam nhảm không liên quan đến chủ đề.
Yêu cầu viết tiếng Việt có dấu.
Permissions in this forum:
Bạn
không có quyền
trả lời bài viết
Gakuen Alice Family
::
Công Viên GAF
::
Phòng chặt chém
Gakuen Alice Family
::
Công Viên GAF
::
Phòng chặt chém
Free forum
|
©
phpBB
|
Free forum support
|
Liên hệ
|
Report an abuse
|
Have a free blog with Sosblogs

markdown:
|Gakuen Alice Family|
Chào mừng Khách viếng thăm đến với trại của học viện Alice chúng tớ!
![]()
| Sat Sep 23, 2017 8:44 pm|![]()
superman |Fri Jul 28, 2017 10:14 pm|
![]()
| |Tiểu Du
1, ![]()
Ai sẽ là người bị lên thớt kì 2!
Tổng số bầu chọn : 17
[Thành viên] - Yzu Smile
![]()
Tiêu đề: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Nomizu Iori
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Souri ♥
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Yzu Smile
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - TosKun
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Yzu Smile
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Oz Vessalius
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Enomoto Kazura
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - .Nar.Kaito.
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Min Dâu
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
![]()
[Thành viên] - Alice Baskerville
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Min Dâu
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
![]()
[Thành viên] - Alice Baskerville
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Souri ♥
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Alice Baskerville
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Souri ♥
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - pinpin_1910
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Min Dâu
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
![]()
[Thành viên] - Oz Vessalius
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Dora-The-Kid
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Alice Baskerville
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Lynn Shelling
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
[Thành viên] - Miy
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
![]()
[Thành viên] - Min Dâu
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
![]()
[Thành viên] - Alice Baskerville
![]()
Tiêu đề: Re: [Bình chọn] Ai sẽ là bị lên thớt tuần 2 ![]()
![]()
![]()
|Trang |1 trong tổng số 3 trang 1, ![]()
Permissions in this forum: |Bạn |không có quyền trả lời bài viết

X-Content-Type-Options: nosniff

P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"

Cache-Control: no-cache

Vary: User-Agent