作者 主題: php下的MVC [Zend Framework] Part 4 Filter和Validate的功能  (閱讀 14352 次)

0 會員 與 1 訪客 正在閱讀本文。

uberr

  • 懷疑的國中生
  • **
  • 文章數: 62
    • 檢視個人資料
    • 天創科技網頁設計公司
最近很忙所以都没有時間寫Zend Framework和Dojo的文章。難得今天有空,所以介紹一下Zend_Filter和Zend_Validate,並實作把它們一起使用。現在Zend Framework巳經有1.5 beta,新増了很多新的功能。多了infocard,openId,zend_form,zend_layout,utf8-support for pdf document..etc.

Zend_Filter介紹:
Zend_Filter是用來把Data過濾,例如把空白移除,HTML ,PHP的tag移除,把字串轉成upper or lower..etc.
1.Zend_Filter_Alnum //回傳 [a-zA-Z0-9]
2.Zend_Filter_Alpha //回傳 [a-ZA-Z]
3.Zend_Filter_BaseName //回傳文件的基本名
4.Zend_Filter_Digits//回傳數字[0-9]
5.Zend_Filter_Dir//回傳路徑
6.Zend_Filter_HtmlEntities//回傳轉換成HTML實體字符串
7.Zend_Filter_Int//回傳整數
8.Zend_Filter_StringToLower//回傳把字串轉成小寫
9.Zend_Filter_StringToUpper//回傳把字串轉成大寫
10.Zend_Filter_StringTrim//回傳移除空白的字串
11.Zend_Filter_StringTags//回傳把html,php tag移除的字串

Zend_Validate介紹:

Zend_Validate是用來進行験証,例如對日期,數字,IP,主機名,EMAIL,Empty..etc.作出験証。
1.Zend_Validate_Alnum//験証字串是否只含有[a-zA-Z0-9],如果是回傳true
2.Zend_Validate_Alpha//験証字串是否只含有[a-zA-Z],如果是回傳true
3.Zend_Validate_Between//験証數字是否只在MIN同MAX內,如果是回傳true
4.Zend_Validate_Date//験証日期,如果是回傳true
5.Zend_Validate_Digits//験証如果只包含數字符號,如果是回傳true
6.Zend_Validate_EmailAddress//験証電郵地址,如果是回傳true
7.Zend_Validate_Float//験証是否為float number,如果是回傳true
8.Zend_Validate_GreaterThan//験証當$value大於MIN,如果是回傳true
9.Zend_Validate_HostName//験証HostName,如果是回傳true
10.Zend_Validate_Int//験証如果是整數,如果是回傳true
11.Zend_Validate_LessThan//験証當$value小於MAX,如果是回傳true
12.Zend_Validate_NotEmpty//験証如果value不是空值,如果是回傳true
13.Zend_Validate_StringLength//験証$value長度,如果没有超出指定長度回傳true

有更多filter和validate功能我都没有列出來,如需要更多information,請自行參考Zend Framework API http://framework.zend.com/apidoc/core/

運作流程:
1.新增add.phtml,使用者可以新増一個user,可以塡入firstname,lastname,age .
firstname and last不可以是空值(empty)
age只可以between 1-140歳
2.當user submit的時候,在IndexController.php裡頭的addAction function會call User Class create一個新user,會把user的輸入傳送到user這個object,最後做験証,如果成功,就會jump到index/index,顯示user detail.如果 fail,就會顯示錯鋘。
3.験証方面是今天教學內容最重要的。
  首先會create一個filter,把空白(trim)同html,php tag移除,我們會用到Zend_Filter_StringTrim和Zend_Filter_StringTags.
  然後我會create一個defaultChain和ageChain是給験証用的。我們到Zend_Validate_NotEmpty和Zend_Validate_Between.
  最後我們會用到Zend_Filter_Input把filter同validate連在一來運用。

user.sql
代碼: [選擇]
CREATE TABLE `user` (
  `id` mediumint(9) NOT NULL auto_increment,
  `first_name` varchar(255) default NULL,
  `last_name` varchar(255) default NULL,
  `age` int(3) default NULL,
  PRIMARY KEY  (`id`)
)


index.php

代碼: [選擇]
<?php

set_include_path
(&#39;.&#39;.PATH_SEPARATOR.&#39;./library/&#39;.PATH_SEPARATOR.&#39;./application/models/&#39;);
include "Zend/Loader.php";

Zend_Loader::loadClass(&#39;Zend_Controller_Front&#39;);
Zend_Loader::loadClass(&#39;Zend_Db&#39;);
Zend_Loader::loadClass(&#39;Zend_Config_Ini&#39;);
Zend_Loader::loadClass(&#39;Zend_Registry&#39;);
Zend_Loader::loadClass(&#39;Zend_Validate_NotEmpty&#39;);// 滙入Validate Not Empty Class
Zend_Loader::loadClass(&#39;Zend_Validate_Between&#39;);// 滙入Validate Between Class
Zend_Loader::loadClass(&#39;Zend_Filter_Input&#39;);// 滙入Filter Input Class

$config = new Zend_Config_Ini(&#39;./application/config/config.ini&#39;,&#39;general&#39;);
$dbAdapter Zend_Db::factory($config->db->adapter,$config->db->config->toArray());
Zend_Registry::set(&#39;dbAdapter&#39;,$dbAdapter);

$frontController Zend_Controller_front::getInstance();
$frontController->setControllerDirectory(&#39;./application/controllers&#39;);
$frontController->dispatch();

indexController.php
代碼: [選擇]
<?php
/** Zend_Controller_Action */
require_once(&#39;Zend/Controller/Action.php&#39;);
require_once(&#39;My/class.DataManager.php&#39;);// 滙入DataManager Class
require_once(&#39;My/class.User.php&#39;);// 滙入User Class

class IndexController extends Zend_Controller_Action {

public function init() {
$this->view->baseUrl $this->_request->getBaseUrl();
}

    public function 
indexAction() {
$this->view->entities DataManager::getAllUserAsObject(); // 拿取user list,return每一個user object
    
}

public function addAction() {
if($this->getRequest()->isPost()) : //如果是由post傳送過來的data,就新増使用者
$first_name $this->_request->getParams(&#39;first_name&#39;); //拿取的data是用array,所以$first_name,$last_name,$age都是array來,因為Zend_Filter_Input是要你道入array才會幫你做験証。請記得getParam和getParams是不同的東西,一個回傳String,另一個回傳array
$last_name $this->_request->getParams(&#39;last_name&#39;);
$age $this->_request->getParams(&#39;age&#39;);

$user = new User(); //create使用者 user object
$user->setTable(&#39;user&#39;); //設定新増到哪一個table
$user->setField(&#39;first_name&#39;,$first_name); //把使用者輸入的data,設定成user object的variable
$user->setField(&#39;last_name&#39;,$last_name);
$user->setField(&#39;age&#39;,$age);
$validate_handle $user->validate(); //****做験証**** 請留意class.User.php裡頭validate function

if($validate_handle) : //如果験証回傳true,就新増使用者,然後redirect去index/index,顯示使用者information
$user->save(); 
$this->_redirect(&#39;/&#39;);
else : //如果回傳false,就顯示error
$this->view->errors $user->getErrors(); 
endif;
endif;
}
}

add.phtml
代碼: [選擇]
<h4>Add User Form</h4>
<form method="post" name="adduserform" action="<? echo $this->baseUrl; ?>/index/add">
first name: <input name="first_name" type="text" /> * must not empty <br>
last name: <input name="last_name" type="text" /> * must not empty <br>
age: <input name="age" type="text" /> // must between 1-140 <br>
<input type="submit" value="Add User" />
</form>

<?
if($this->errors):

foreach($this->errors as $error) :
echo $error."<br>";
endforeach;

endif;
?>

index.php
代碼: [選擇]
<script>
function redirect($a) {
window.location = $a;
}
</script>
<input type="button" value="Add User" onclick='redirect("<? echo $this->baseUrl; ?>/index/add");' />
<?php

if($this->entities) :
foreach($this->entities as $entity) :
echo "<h4>User</h4>";
echo $entity->__toString()."<br>"// magic function convert object to string __string(),php 5.2 之後才support magic function,如果 php 5.2之前的version就要加上->__toString()
echo "<hr>";
endforeach;
else :
echo &#39;no user found&#39;;
endif;
?>


class.User.php
代碼: [選擇]
<?php
require_once(&#39;My/class.GenericObject.php&#39;);

class User extends GenericObject {

private $_errors;

public function __construct($user_id null) {
$this->_errors = array();
$this->_user_id $user_id;
}

public function __toString() {
$result_rows parent::getAllFields();
$s = &#39;&#39;;
foreach($result_rows as $key => $value) :
$s .= $key.&#39; : &#39;.$value.&#39;<br>&#39;;
endforeach;

return $s;
}

//*********************************Important***********************************************
public function validate() {
$first_name $this->_Modify_fields[&#39;first_name&#39;];
$last_name $this->_Modify_fields[&#39;last_name&#39;];
$age $this->_Modify_fields[&#39;age&#39;];

               
$filter = array( //create一個filter
      
          &#39;*&#39; => array( //對所input都進行過濾
      
  "StringTrim"//過濾空白
      
  "StripTags" //過濾html,php tags
                
));

$defaultChain = new Zend_Validate(); //create 認證物件,套用到first_name,last_name
                
$defaultChain->addValidator(new Zend_Validate_NotEmpty(),false);  //加入Not Empty認證功能

                
$validators = array(
      
           &#39;first_name&#39; => $defaultChain
                 
);
                
$first_name = new Zend_Filter_Input($filter,$validators,$first_name); //把filter,validate連在一起,然後對first_name作認証工作。

                
$validators = array(
      
          &#39;last_name&#39; => $defaultChain
                 
);
                
$last_name = new Zend_Filter_Input($filter,$validators,$last_name);//把filter,validate連在一起,然後對last_name作認証工作。

                //因為age一定是數字,和有限制,所以不可以把defaultChain套用到age
$ageChain = new Zend_Validate(); //新増一個認證物件,套用到age
$ageChain->addValidator(new Zend_Validate_Between(&#39;1&#39;,&#39;140&#39;));//加入Between認證功能,限制age在1-140歳

                
$validators = array(
      
           &#39;age&#39; => $ageChain
                
);
               
$age = new Zend_Filter_Input($filter,$validators,$age);//把filter,validate連在一起,然後對$age作認証工作。

               //検查験証是否有錯誤出現
     
       if ($first_name->hasInvalid() || $first_name->hasMissing()) :
      
          foreach ($first_name->getMessages() as $message) :
     
     array_push($this->_errors,$message[0]); //把錯誤寫入到 $this->errors
       
          endforeach;
     
       elseif ($last_name->hasInvalid() || $last_name->hasMissing()) :
      
          foreach ($last_name->getMessages() as $message) :
     
     array_push($this->_errors,$message[0]); //把錯誤寫入到 $this->errors
       
          endforeach;
     
       elseif ($age->hasInvalid() || $age->hasMissing()) :
      
          foreach ($age->getMessages() as $message) :
     
     array_push($this->_errors,$message[0]); //把錯誤寫入到 $this->errors
                  
endforeach;
       endif;

if(sizeof($this->_errors) > 0) : //検查$this->errors裡頭有没有東西
return false;
else :
return true;
endif;
}

public function getErrors() {
return $this->_errors;
}
}

?>


class.DataManager.php
代碼: [選擇]
<?php

class DataManager {

public static function getAllUserAsObject() {
$db Zend_Registry::get(&#39;dbAdapter&#39;);
$select $db->select();
$select->from(&#39;user&#39;,&#39;*&#39;);
$result_rows $db->fetchAll($select);
$obj_array = array();

if($result_rows) :
foreach($result_rows as $rows) :
$refObjArray = &$obj_array[];
$refObjArray = new User($rows[&#39;id&#39;]);
$refObjArray->forceReloaded();

foreach($rows as $key => $value) :
$refObjArray->setField($key,$value);
endforeach;

endforeach;

return $obj_array;
else :
return array();
endif;
}
}
?>


class.GenericObject.php
代碼: [選擇]
<?php

class GenericObject {

private $_isLoaded false;
private $_table_name;
private $_class_name;
private $_result_rows = array();
private $_user_id;
protected $_Modify_fields = array();

private function _load() {
DataManager::getAllUserAsObject();
}

private function _checkLoaded() {
if(!$this->_isLoaded) :
$this->_load(); 
endif;
}

public function forceReloaded() {
$this->_isLoaded true;
}

public function setTable($table_name) {
$this->_table_name $table_name;
}

public function getField($field_name) {
$this->_checkLoaded();
return $this->_result_rows[$field_name];
}

public function getAllfields() {
$this->_checkLoaded();
return $this->_result_rows;
}

public function setField($field_name,$value) {
$this->_checkLoaded();
$this->_Modify_fields[$field_name] = $value;
$this->_result_rows[$field_name] = $value;
}

public function numberOfItem() {
$this->_checkLoaded();
return sizeof($this->_result_rows);
}

public function save() {
$user_id $this->_user_id;
$table_name $this->_table_name;
$data = array();

foreach($this->_Modify_fields as $key => $value) :
$data[$key] = $value[$key];
endforeach;

$db Zend_Registry::get(&#39;dbAdapter&#39;);

try {
if(!$user_id) :
$query_handle $db->insert($table_name,$data);
else :
$where "id = ".$user_id;
$query_handle $db->update($table_name,$data,$where);
endif;
}
catch (Exception $e) {
echo "Error: ".$e->getMessage();
}
}
}
?>


Demo:http://wingning.no-ip.org/studyarea/zend_filter/

下載:
http://wingning.no-ip.org/studyarea/download/zend_filter.tar.gz

天創科技網頁設計公司
« 上次編輯: 2011-10-03 15:07 由 uberr »