這是一個十分有用的元件,可用於產生一個資料的編輯form,他是MST Library 3.1一個十分重要的元件,可以實作dbo form和dbo form的循環嵌套,而且控制在一個form中,同時支援dbo form中再次嵌套自訂的widget元件。
很多PHP框架,將form的生成寫在函數,這是無可厚非的,但是你無法接收在生成一個form的時候,循環調用用戶函數所付出的性能成本,這時候,構建一個php和html混編的程式碼,遠比循環執行函數的效能高。
而且,多數時候,我們知道一個資料物件的結構,也已經定義了資料物件的每個欄位的值類型,我們真的沒有必要再去手動寫什麼form,或者還要用程式碼去判斷,這個用select ,那個用textarea什麼的。
-
// 要操作的物件的資料
- // $target必須為基於MST_DBO的實例
- if (!isset($data ) || !is_object($data) || !$data instanceof MST_DBO) {
- echo '$data not a MST_DBO instance!';
- }
- else {
- // 取得關聯的模組
- $model = get_class($data);
-
- // 定義$columns
- // 如果未定義,預設依照MST_DBO的介面來取
- if (!isset($columns) )
- $columns = $data->getFormColumns($data);
- if (empty($columns) || !is_array($columns)) {
- echo 'undefine form columns!';
- }
- else {
-
- // 產生此模組的前綴
- if (!isset($prefix))
- $prefix = strtolower($model);
- else
-
- $prefix = MST_String::tableize($prefix);
-
- if (!isset($id))
- $id = $prefix . '_form';
-
- if ( !issetet ($class))
- $class = $prefix . '-form';
-
- $errors = $data->getErrors();
-
- // 初始化Form配置
- // 客製化提交的action
- if (!isset($action))
- $action = $this->params->uri;
-
- // method
- if (!isset( $method))
- $method = 'post';
- else {
- $method = strtolower((string)$method);
- if ($method != 'get ' && $method ! = 'post')
- $method = 'post';
- }
-
- // 是否需要上傳
- if (!isset($isUpload)) $isUpload = true;
-
- // 客製化提交按鈕的文字
- if (!isset($submitText)) $submitText = 'Submit';
-
- // 客製化label部分的寬度
- if (!isset( $headWidth)) $headWidth = 130;
- $headWidth = is_numeric($headWidth) && $headWidth > 0 ? $headWidth : 120;
-
- if (!isset($continueForm) = fisset) $ ;
-
-
- // 重載
- if (!isset($lineStart)) $lineStart = 1;
- ?>
- < ;?php
- }
- }
- ?>
-
-
複製程式碼
$this->widget('base/dbo_form', array( 'data' => $this->list,
) );
複製程式碼
- class Testimonial extends MST_DBO {
-
- protected static
- $columns = array( protected static
- $columns = arrayst' array('text','title' => '名字', 'require' => 1, 'min' => 1, 'max' => 32),
- '姓氏' => array('text' ,'title' => '姓氏', 'require' => 1, 'min' => 1, 'max' => 32),
- 'avator ' => array('title' => 'Avator' , 'max' => 256),
- 'age_group' => array('title' => '年齡組', 'require' => 1),
- '秘密' => 數組('textarea' ,'標題' => '秘密', '要求' => 1, '最小' => 10, '最大' => 600),
- );
-
- public function getFormColumns() {
- if (GB_PERSSIONS == Region::ROOT) {
- $columns['region_id'] = array(
- '選擇',
- '標題' => '區域',
- '選項類型' => '列表',
- '選項' => 區域::find; , array('select' => 'id, name')),
- );
- }
- else {
- $columns['region_id'] = array(
- '隱藏' ,
- 'default' => GB_PERSSIONS,
- );
- }
- $columns = array_mge(colummon ,self::$columns);
- $columns['age_group'] = array('widget', 'base/age_group', array(
- '前綴' =>; '推薦',
- ) , '標題' =>; '年齡段');
- $columns['avator'] = array('widget', 'base/testmonial_upload', array(
- '前綴' => '推薦',
- ), ' title' => 'Avator');
-
- return $columns;
- }
-
- public function beforeCreate(& $data) {
- $data[ 'created_at'] = time();
- }
-
- public function getAge() {
- $ageGroup = array(
- 0 => '--',
- 1 => '18 歲以下',
- '19 ? 25',
- '26 ? 35',
- '36 ? 45',
- '46 ? 55',
- 6 => '56歲或以上',
- );
- return isset($ageGroup[$this['age_group']]) ? $ageGroup[$this['age_group']] : $ageGroup[0];
- }
-
- public function getAvator() {
- return empty($this['avator']) ? httpUri('images/avator.png') : httpUri($this['avator']);
- }
-
- // 這是MST_DBO的find方法的重載
- static public function find($args = array(), $params = null, $isArray = false) {
- if (define('GB_PERSSIONS') && GB_PERSSIONS == Region::ROOT) {
- self::initFind( $ args, $params, $isArray);
- 回傳父級::find($args, $params, $isArray);
- }
- else {
- self::initFind($args, $ params, $isArray);
- if (isset($args['where'])) {
- $args['where'][0] .= ' AND zone_id = ?';
- $args ['where'][] = GB_PERSSIONS;
- }
- else {
- $args['where'] = array('region_id = ?', GB_PERSSIONS);
- }
- 傳回父層級::find($args, $params, $isArray);
- }
- }
- }
複製程式碼
|