当前位置:Gxlcms > PHP教程 > DBOFormWidget

DBOFormWidget

时间:2021-07-01 10:21:17 帮助过:44人阅读

这是一个十分有用的组件,可用于生成一个数据的编辑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 (!isset($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)) $continueForm = false;
  47. // 重載
  48. if (!isset($lineStart)) $lineStart = 1;
  49. ?>
  50. }
  51. }
  52. ?>
  1. $this->widget('base/dbo_form', array(
  2. 'data' => $this->list,
  3. ));
  1. class Testimonial extends MST_DBO {
  2. protected static
  3. $columns = array(
  4. 'firstname' => array('text','title' => 'First Name', 'require' => 1, 'min' => 1, 'max' => 32),
  5. 'lastname' => array('text','title' => 'Last Name', 'require' => 1, 'min' => 1, 'max' => 32),
  6. 'avator' => array('title' => 'Avator', 'max' => 256),
  7. 'age_group' => array('title' => 'Age Group', 'require' => 1),
  8. 'secret' => array('textarea','title' => 'Secret', 'require' => 1, 'min' => 10, 'max' => 600),
  9. );
  10. public function getFormColumns() {
  11. if (GB_PERSSIONS == Region::ROOT) {
  12. $columns['region_id'] = array(
  13. 'select',
  14. 'title' => ' region ',
  15. 'optionsType' => 'list',
  16. 'options' => Region::find('all', array('select' => 'id, name')),
  17. );
  18. }
  19. else {
  20. $columns['region_id'] = array(
  21. 'hidden',
  22. 'default' => GB_PERSSIONS,
  23. );
  24. }
  25. $columns = array_merge($columns,self::$columns);
  26. $columns['age_group'] = array('widget', 'base/age_group', array(
  27. 'prefix' => 'testimonial',
  28. ), 'title' => 'Age Group');
  29. $columns['avator'] = array('widget', 'base/testmonial_upload', array(
  30. 'prefix' => 'testimonial',
  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 => 'Under 18',
  41. 2 => '19 ? 25',
  42. 3 => '26 ? 35',
  43. 4 => '36 ? 45',
  44. 5 => '46 ? 55',
  45. 6 => '56 or above',
  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 (defined('GB_PERSSIONS') && GB_PERSSIONS == Region::ROOT) {
  55. self::initFind($args, $params, $isArray);
  56. return parent::find($args, $params, $isArray);
  57. }
  58. else {
  59. self::initFind($args, $params, $isArray);
  60. if (isset($args['where'])) {
  61. $args['where'][0] .= ' AND region_id = ?';
  62. $args['where'][] = GB_PERSSIONS;
  63. }
  64. else {
  65. $args['where'] = array('region_id = ?', GB_PERSSIONS);
  66. }
  67. return parent::find($args, $params, $isArray);
  68. }
  69. }
  70. }

人气教程排行