[KOHANA] Bài 7 (tutorial) kết hợp Database + Controller Template + View + Validation (tt)

Bây giờ tiếp tục viết chức năng cho admin 

ADMIN

Ta mở file application/bootstrap.php lên và kiếm đoạn

PHP Code:
Route::set('default''(<controller>(/<action>(/<id>)(/<key>)))'
        ->
defaults(array( 
            
'controller' => 'welcome'
            
'action' => 'index'
        ));  

Và thêm vào trước đoạn code trên nội dung này mục đích là đưa đường dẫn mặc định của phần quản trị admin và control mặc định sẽ gọi

PHP Code:
Route::set('quanly''<directory>(/<controller>(/<action>(/<id>)(/<key>)))', array( 
            
'directory' => 'admincp' 
        
)) 
        ->
defaults(array( 
            
'controller' => 'admin'
            
'action' => 'index'
        ));  

Bây giờ ta tạo 1 thư mục admincp trong thư mục controller
và tạo file admin.php với nội dung như sau

PHP Code:
<?php 

defined

('SYSPATH') or die('No direct script access.'); 

class 

Controller_Admincp_Admin extends Controller_Template 

    public 

$template 'admin/index'
}

Ở đây tên controller là controller_tenthumuc_tencontroller

sử dụng template admin/index có nghĩa là sử dụng view index.php (nội dung cũng tương tự bài trước )nằm trong thư mục admin vì thế ta tạo thư mục như sau.

PHP Code:
views 
--admin 
----index.php  

Tiếp đến ta tạo action_index cho controller_admincp_admin

PHP Code:
public function action_index() { 
        
$query DB::select() 
                        ->
from('article'
                        ->
join('users''left')->on('users.userid''=''article.post_userid'
                        ->
execute()->as_array(NULL); 

        

$this->template->content View::factory('admin/newslistadmin'); 
        
$this->template->content->set(array( 
            
'data' => $query 
        
)); 
    }  

Đoạn code này cũng giống như action_index của controller_article vì thế bạn tạo thư mục view như sau

PHP Code:
views 
 
--admin 
----newslistadmin.php  

File newslistadmin.php với nội dung như sau

PHP Code:
<?php 
if ($data != false) { 
    
?> 
    <table width="100%" border="1" cellspacing="2" cellpadding="3"> 
        <tr style="background-color: #CCC"> 
            <td>title</td><td>content</td> 
            <td>Post time</td><td>User Post</td> 
            <td> 
                <a href="<?php echo url::base() ?>admincp/admin/addart"> 
                    Add new article 
                </a> 
            </td> 
        </tr> 
        <?php 
        
foreach ($data as $dt) { 
            
?> 
            <tr> 
                <td><?php echo $dt['title'?></td> 
                <td><?php echo $dt['content'?></td> 
                <td><?php echo $dt['post_time'?></td> 
                <td><?php echo $dt['username'?></td> 
                <td> 
                    <a href="<?php echo url::base() ?>admincp/admin/editart<?php echo $dt['article_id'?>"> 
                        Edit 
                    </a> 
                    &nbsp; 
                    <a href="<?php echo url::base() ?>admincp/admin/deleteart/<?php echo $dt['article_id'?>"> 
                        Delete 
                    </a> 
                </td> 
            </tr> 
        <?php ?> 
    </table> 
<?php ?>
Và bạn chạy thử xem nào http://localhost/kohana/admincp/admin hay http://localhost/kohana/admincp (do đã chỉnh troong bootstrap.php)có ra kết quả mong đợi không?


Bây giờ bấm vào link add new article, ta không thể chạy link này vì chưa có action_addart, ta tạo action_addart cho controller_admincp_admin như sau

PHP Code:
public function action_addart() { 
        
$userl DB::select() 
                        ->
from('Users'
                        ->
execute()->as_array(NULL); 

        

$this->template->content View::factory('admin/f_art_add'); 
        
$this->template->content->set(array( 
            
'member' => $userl 
        
)); 
    }  

Ở đây đưa danh sách user lên để tạo hộp select cho chọn member post.. (Sau này nếu phát triển thành thành viên đăng nhập post bài thì chổ này không cần nữa).

Giờ ta tạo file f_art_add.php với cây thư mục sau

PHP Code:
views 
----admin 
------f_art_add.php  

File f_art_add.php với nội dung như sau

PHP Code:
<style type="text/css"> 
    form label { 
        float:left; 
        width: 120px; 
    } 

    form textarea, input[type=text], select { 
        width: 250px; 
        resize: none; 
    } 
</style> 
<form action="<?php echo url::site('admincp/admin/saveart'?>" method="post" enctype="multipart/form-data"> 
    <p> 
        <label>Title</label> 
        <input type="text" name="txt_name" id="txt_name" 
               value=""/> 
        <small>(*)</small> 
    </p> 
    <p> 
        <label>Content</label> 
        <textarea cols="3" rows="4" name="txt_descript" id="txt_descript"></textarea> 
    </p> 
    
    <p> 
        <label>Member</label> 
        <select name="sel_member" id="sel_member"> 
            <option value="">&nbsp;</option> 
            <?php if ($member != false) { ?> 
                <?php foreach ($member as $key => $value) { ?> 
                    <option value="<?php echo $value['user_id'?>"> 
                        <?php echo $value['username'?> 
                    </option> 
                    <?php 
                
//end for 
            
//end if 
            
?> 
        </select> 
        <small>(*)</small> 
    </p> 
    <p> 
        <input type="submit" name="btn_save" value="Save"/> 
        <input type="hidden" name="hd_id" value=""/> 
    </p> 
</form>

Lúc này bạn nhập hết thông tin vào và save -> Báo lỗi vì chưa có action_saveart

Ta tạo action_saveart cho nó với nội dung

PHP Code:
public function action_saveart() { 
        
$frm Validation::factory($_POST
                ->
rule('txt_name''not_empty'
                ->
rule('txt_descript''not_empty' 
                ->
rule('sel_member''not_empty'); 

        if (

$frm->check()) { //CHECK CÓ HỢP LỆ KHÔNG 
            
$frm $frm->as_array(); 
            
//KIEM TRA HD_ID CỦA MÌNH NẾU = RỖNG THÌ INSERT VÀO 
            //NGƯỢC LẠI THÌ INSERT 
            
if (empty($frm['hd_id'])) { 
                
$this->insert($frm); 
            } else { 
                
$this->update($frm); 
            } 
        } else { 
            
$error $frm->errors('articleerror'); //SỬ DỤNG FILE articleerror.php TRONG THƯ MỤC messages 
            
foreach ($error as $key => $value) { 
                echo 
$value '<br />'
            } 
            die(); 
        } 

        

//REDIRECT RA DANH SÁCH 
        
$this->redirect('admincp/admin'); 
    }  

Ở đây ta sử dụng validation để bắt lỗi not empty cho từng field. Bạn có thể đọc nó ở đây Validation

PHP Code:
$error $frm->errors('articleerror');  

Đoạn trên ta sử dụng file articleerror.php trong thư mục application/messages
Ta tạo file articleerror.php với nội dung sau

PHP Code:
<?php 

return array( 
    
'txt_name' => array( 
        
'not_empty' => __('Title must not be empty.'
    ), 
    
'txt_descript' => array( 
        
'not_empty' => __('content must not be empty.'
    

    ), 
    
'sel_member' => array( 
        
'not_empty' => __('Member must not be empty.'
    ) 
);

Bây giờ ta muốn hàm action_saveart hoạt động thì ta phải thêm 2 hàm này vào cho nó

PHP Code:

    
public function insert($frm) { 
        
$col = array( 
            
'title'
            
'content'
            
'post_userid' 
        
); 

        

$values = array( 
            
$frm['txt_name'], 
            
$frm['txt_descript'], 
            
$frm['sel_member'
        ); 
        
$id DB::insert('article'$col)->values($values)->execute(); 
        return 
$id[0]; 
    } 

    public function 

update($frm) { 
        
$set = array( 
            
'title' => $frm['txt_name'], 
            
'content' => $frm['txt_descript'], 
         
   'post_userid' => $frm['sel_member'
        ); 

        

$query DB::update('article')->set($set)->where('article_id''='$frm['hd_id'])->execute(); 
        return 
$frm['hd_id']; 
    }  

Bây giờ bạn chạy link http://localhost/kohana/admincp/admin/ xem có thêm vào được không

Tiếp theo ta đến action_editart

PHP Code:
public function action_editart() { 
        
$id $this->request->param('id'); 
        
$query DB::select() 
                        ->
from('article'
                        ->
join('users''left')->on('users.user_id''=''article.post_userid'
                        ->
where('article.article_id''='$id
                        ->
execute()->as_array(NULL); 

        

$member DB::select() 
                        ->
from('users'
                        ->
execute()->as_array(NULL); 
        if (isset(
$query[0])) { 
            
$query $query[0]; 
        } 

        

$this->template->content View::factory('admincp/admin/f_edit_art'); 
        
$this->template->content->set(array( 
            
'data' => $query
            
'member' => $member 
        
)); 
    }  

Cũng như trên ta tạo file f_edit_art.php với nội dung sau

PHP Code:
<style type="text/css"> 
    form label { 
        float:left; 
        width: 120px; 
    } 

    form textarea, input[type=text], select { 
        width: 250px; 
        resize: none; 
    } 
</style> 
<?php 
if ($data != false) { 
    
?> 
<form action="<?php echo url::site('admincp/admin/saveart')?>" method="post" enctype="multipart/form-data"> 
        <p> 
            <label>title</label> 
            <input type="text" name="txt_name" id="txt_name" 
                   value="<?php echo $data['title'?>"/> 
            <small>(*)</small> 
        </p> 
        <p> 
            <label>Content </label> 
            <textarea cols="3" rows="4" name="txt_descript" id="txt_descript"><?php echo $data['content'?></textarea> 
        </p> 
         <p> 
            <label>Member</label> 
            <select name="sel_member" id="sel_member"> 
                <option value="">&nbsp;</option> 
                <?php if ($member != false) { ?> 
                    <?php foreach ($member as $key => $value) { ?> 
                        <option <?php echo $value['user_id'] == $data['post_userid'] ? 'selected="selected"' '' ?>  
                            value="<?php echo $value['user_id'?>"> 
                                <?php echo $value['username'?> 
                        </option> 
                        <?php 
                    
//end for 
                
//end if 
                
?> 
            </select> 
            <small>(*)</small> 
        </p> 
        <p> 
            <input type="submit" name="btn_save" value="Save"/> 
            <input type="hidden" name="hd_id" value="<?php echo $data['article_id'?>"/> 
        </p> 
    </form> 
<?php } else { ?> 
    Your request not found. 
<?php ?>

Giờ ta ra ngoài danh sách http://localhost/kohana/admincp/admin rồi bấm vào edit và chỉnh sửa thử xem được không nào? Nếu mọi chuyện oki hết giờ ta làm action_deleteart

PHP Code:
public function action_deleteart() { 
        
$id $this->request->param('id'); 

        

$query DB::delete('article')->where('article_id''='$id)->execute(); 

        

$this->redirect('admincp/admin'); 
    }  

Giờ ta ra ngoài danh sách http://localhost/kohana/admincp/admin bấm delete thử xem nào.

Tạm thời là nhưng thao tác đó nhé