首頁 >後端開發 >php教程 >DBO 表單小工具

DBO 表單小工具

WBOY
WBOY原創
2016-07-25 09:09:461235瀏覽
這是一個十分有用的元件,可用於產生一個資料的編輯form,他是MST Library 3.1一個十分重要的元件,可以實作dbo form和dbo form的循環嵌套,而且控制在一個form中,同時支援dbo form中再次嵌套自訂的widget元件。
很多PHP框架,將form的生成寫在函數,這是無可厚非的,但是你無法接收在生成一個form的時候,循環調用用戶函數所付出的性能成本,這時候,構建一個php和html混編的程式碼,遠比循環執行函數的效能高。
而且,多數時候,我們知道一個資料物件的結構,也已經定義了資料物件的每個欄位的值類型,我們真的沒有必要再去手動寫什麼form,或者還要用程式碼去判斷,這個用select ,那個用textarea什麼的。
  1. // 要操作的物件的資料
  2. // $target必須為基於MST_DBO的實例
  3. if (!isset($data ) || !is_object($data) || !$data instanceof MST_DBO) {
  4. echo '$data not a MST_DBO instance!';
  5. }
  6. else {
  7. // 取得關聯的模組
  8. $model = get_class($data);
  9. // 定義$columns
  10. // 如果未定義,預設依照MST_DBO的介面來取
  11. if (!isset($columns) )
  12. $columns = $data->getFormColumns($data);
  13. if (empty($columns) || !is_array($columns)) {
  14. echo 'undefine form columns!';
  15. }
  16. else {
  17. // 產生此模組的前綴
  18. if (!isset($prefix))
  19. $prefix = strtolower($model);
  20. else
  21. $prefix = MST_String::tableize($prefix);
  22. if (!isset($id))
  23. $id = $prefix . '_form';
  24. if ( !issetet ($class))
  25. $class = $prefix . '-form';
  26. $errors = $data->getErrors();
  27. // 初始化Form配置
  28. // 客製化提交的action
  29. if (!isset($action))
  30. $action = $this->params->uri;
  31. // method
  32. if (!isset( $method))
  33. $method = 'post';
  34. else {
  35. $method = strtolower((string)$method);
  36. if ($method != 'get ' && $method ! = 'post')
  37. $method = 'post';
  38. }
  39. // 是否需要上傳
  40. if (!isset($isUpload)) $isUpload = true;
  41. // 客製化提交按鈕的文字
  42. if (!isset($submitText)) $submitText = 'Submit';
  43. // 客製化label部分的寬度
  44. if (!isset( $headWidth)) $headWidth = 130;
  45. $headWidth = is_numeric($headWidth) && $headWidth > 0 ? $headWidth : 120;
  46. if (!isset($continueForm) = fisset) $ ;
  47. // 重載
  48. if (!isset($lineStart)) $lineStart = 1;
  49. ?>
  50. >
  51. < ;?php
  52. $lineNum = $lineStart;
  53. $tinymceTimes = 0;
  54. foreach ($columns as $key => $column) {
  55. // 跳過$column[0]為空的部分
  56. if (!isset($column[0])) continue;
  57. // 客製化一行的$column常用變數
  58. $key = strtolower(trim($key));
  59. $columnId = $prefix . '_' . $key;
  60. $columnName = $prefix . '[' . $key . ']';
  61. $columnClass = $prefix . '-' . $ key;
  62. $columnText = empty($column['title']) ? ucfirst($key) : $column['title'];
  63. $columnValue = isset($data[$key]) ? ( string)$data[$key] : (isset($column['default']) ? $column[' default'] : null);
  64. if (isset($column['forceValue'])) $columnValue = (string)$column['forceValue'];
  65. $isDisabled = isset($column['disabled ']) ? $column['disabled'] : false;
  66. $isReadonly = isset($column[ 'readonly']) ? $column['readonly'] : false;
  67. if (is_object ($column[0]) && $column[0] instanceof Closure) {
  68. $editType = 'closure ';
  69. }
  70. else {
  71. $editType = strtolower($column[0]) ;
  72. }
  73. ?>
  74. if ($editType == 'dbo_form') {
  75. if (empty($column[1])) {
  76. //缺少dbo_form重用說明
  77. ?>
  78. } else {
  79. $column[1]['continueForm'] = true;
  80. $this->widget('base/dbo_form', $column [1]);
  81. }
  82. ?>
  83. $lineClass = $lineNum % 2 == 0 ? 'f-line f-line-odd' : 'f-line f-line-even';
  84. ?>
  85. ">
  86. }
  87. ?>
  88. Can't reuse dbo_form, please set the dbo_form options in $column[1].
  89. th>
  90. widget($column[1], $column[2]); ?> ;
  91. td>
  92. ">
  93. //開始表單產生行
  94. switch ($ editType) {
  95. case 'text' :
  96. ?>
  97. if (isset($column['max']))
  98. echo ' maxlength="',$column ['max'],'"';
  99. if ($ isDisabled)
  100. echo 'disabled="disabled"';
  101. if ($isReadonly)
  102. echo 'readonly="readonly"';
  103. ?>/>
  104. Break;
  105. case 'smalltextarea' :
  106. ?>
  107. break;
  108. case 'longtext' :
  109. ?>
  110. if (isset ($column['max']))
  111. echo ' maxlength="',$column ['max'],'"';
  112. if ($isDisabled)
  113. echo 'disabled="已停用"';
  114. if ($isReadonly)
  115. echo 'readonly="readonly"';
  116. ?>/>
  117. break;
  118. case '上傳' :
  119. ?>
  120. " type="file" name="ufile" value="瀏覽" />
  121. break;
  122. case 'password' :
  123. ?>
  124. if (isset($column['max']))
  125. echo ' maxlength="'.$column ['max'].'"';
  126. if ($ isDisabled)
  127. echo 'disabled="disabled"';
  128. if ($isReadonly)
  129. echo 'readonly="readonly"';
  130. ?>/>
  131. Break;
  132. case 'textarea' :
  133. ?>
  134. break;
  135. case 'select' :
  136. $options = isset($column['options']) ? $column['options'] : array();
  137. $optionsType = isset($column['optionsType'])? $column['optionsType'] : 'map';
  138. // 前置相容: 0 -> 地圖,1 -> 列表
  139. if (is_numeric($optionsType)) $optionsType = $optionsType >; 0 ? '列表' : '地圖';
  140. ?>
  141. break;
  142. case 'radiogroup' :
  143. $maps = isset($column['maps']) ? $column['maps'] : array();
  144. $mapsType = isset($column['mapsType']) ? $column['mapsType'] : 'map';
  145. // 向前兼容:0 -> map, 1 -> list
  146. if (is_numeric($mapsType)) $mapsType = $mapsType > 0 ? 'list' : 'map';
  147. ?>
  148. $index = 0;
  149. foreach ($maps as $key => $map) {
  150. $index++;
  151. ?>
  152. " class="f-radio" value="" />
  153. " class="f-radio" value="" />
  154. }
  155. ?>
  156. 中斷;
  157. case 'datetime':
  158. $format = 空($column['dateFormat']) ? 'Y-m-d H:i:s' : $column['dateFormat'];
  159. $jsFormat = 空($column['jsFormat']) ? '%Y-%m-%d %H:00' : $column['jsFormat'];
  160. $pickSize = isset($column['pickSize']) ? intval($column['pickSize']) : 2;
  161. if ($columnValue > 0) {
  162. if (is_numeric($columnValue)) {
  163. $dtStr = date($format, $columnValue) );
  164. $dtVal = $columnValue;
  165. }
  166. else {
  167. $dtStr = $columnValue;
  168. $dtVal = MST_String::date2num($columnValue);
  169. $dtVal = MST_String::date2num($columnValue);
  170. }
  171. }
  172. }
  173. }
  174. }
  175. }
  176. }
  177. }
  178. }
  179. }
  180. }
  181. }
  182. }
  183. }
  184. }
  185. }
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }
  192. }
  193. }
  194. }
  195. }
  196. } > }
  197. else {
  198. $dtStr = 0;
  199. $dtVal = 0;
  200. }
  201. if (is_numeric($dtVal) && $dtVal > 0)
  202. $
  203. $
  204. $
  205. $
  206. $
  207. $
  208. $
  209. $
  210. $
  211. $
  212. $
  213. $ dtStr = date($format, $dtVal);
  214. ?>
  215. type="text"
  216. id="_str "
  217. 類別="f-text f-dt "
  218. value="
  219. />
  220. type="隱藏"
  221. name=""
  222. id=""
  223. value=""
  224. />
  225. break;
  226. case 'tinymce' :
  227. $tinymceTimes++;
  228. ?>
  229. script ('tiny_mce/tiny_mce.js'); ?>
  230. break;
  231. case 'widget' :
  232. $this ->widget($column[1], $column[2]) ;
  233. break;
  234. }
  235. $lineNum++;
  236. ?>
  237. $index = 0;
  238. foreach ($submitText as $btnId => $btnText) {
  239. $index++;
  240. ?>
  241. ?> >
  242. validCode($prefix, 'input'); ?>
  243. < ;?php
  244. }
  245. }
  246. ?>
複製程式碼
$this->widget('base/dbo_form', array(
  • 'data' => $this->list,
  • ) );
  • 複製程式碼
    1. class Testimonial extends MST_DBO {
    2. protected static
    3. $columns = array( protected static
    4. $columns = arrayst' array('text','title' => '名字', 'require' => 1, 'min' => 1, 'max' => 32),
    5. '姓氏' => array('text' ,'title' => '姓氏', 'require' => 1, 'min' => 1, 'max' => 32),
    6. 'avator ' => array('title' => 'Avator' , 'max' => 256),
    7. 'age_group' => array('title' => '年齡組', 'require' => 1),
    8. '秘密' => 數組('textarea' ,'標題' => '秘密', '要求' => 1, '最小' => 10, '最大' => 600),
    9. );
    10. public function getFormColumns() {
    11. if (GB_PERSSIONS == Region::ROOT) {
    12. $columns['region_id'] = array(
    13. '選擇',
    14. '標題' => '區域',
    15. '選項類型' => '列表',
    16. '選項' => 區域::find; , array('select' => 'id, name')),
    17. );
    18. }
    19. else {
    20. $columns['region_id'] = array(
    21. '隱藏' ,
    22. 'default' => GB_PERSSIONS,
    23. );
    24. }
    25. $columns = array_mge(colummon ,self::$columns);
    26. $columns['age_group'] = array('widget', 'base/age_group', array(
    27. '前綴' =>; '推薦',
    28. ) , '標題' =>; '年齡段');
    29. $columns['avator'] = array('widget', 'base/testmonial_upload', array(
    30. '前綴' => '推薦',
    31. ), ' title' => 'Avator');
    32. return $columns;
    33. }
    34. public function beforeCreate(& $data) {
    35. $data[ 'created_at'] = time();
    36. }
    37. public function getAge() {
    38. $ageGroup = array(
    39. 0 => '--',
    40. 1 => '18 歲以下',
    41. '19 ? 25',
    42. '26 ? 35',
    43. '36 ? 45',
    44. '46 ? 55',
    45. 6 => '56歲或以上',
    46. );
    47. return isset($ageGroup[$this['age_group']]) ? $ageGroup[$this['age_group']] : $ageGroup[0];
    48. }
    49. public function getAvator() {
    50. return empty($this['avator']) ? httpUri('images/avator.png') : httpUri($this['avator']);
    51. }
    52. // 這是MST_DBO的find方法的重載
    53. static public function find($args = array(), $params = null, $isArray = false) {
    54. if (define('GB_PERSSIONS') && GB_PERSSIONS == Region::ROOT) {
    55. self::initFind( $ args, $params, $isArray);
    56. 回傳父級::find($args, $params, $isArray);
    57. }
    58. else {
    59. self::initFind($args, $ params, $isArray);
    60. if (isset($args['where'])) {
    61. $args['where'][0] .= ' AND zone_id = ?';
    62. $args ['where'][] = GB_PERSSIONS;
    63. }
    64. else {
    65. $args['where'] = array('region_id = ?', GB_PERSSIONS);
    66. }
    67. 傳回父層級::find($args, $params, $isArray);
    68. }
    69. }
    70. }
    複製程式碼
    DBO 表單小工具


    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn