PHP / JS表单类 - 数组与OO

时间:2010-08-19 08:27:46

标签: php javascript oop forms

我最近开始研究一个PHP / JS表单类,它还包含一个SQL表单构建器(例如,从sql和自动插入/更新构建简单表单)。

我已经尝试了几个类(zend_form,clonefish,PHP Form Builder类,phorms等)但是还没有遇到一个简单,可定制和完整的完整解决方案(服务器端和客户端验证,涵盖所有简单的html元素和许多dhtml元素:排序,wysiwyg,mutli文件上传,日期选择器,ajax验证等)

我的问题是为什么有些“类”通过数组实现元素,而其他类通过适当的OO类调用实现元素。

例如。 Clonefish(流行的商业php类):

    $config = Array( 

  'username' => Array( 
    'type'           => 'inputText', 
    'displayname'    => 'Username', 
    validation     => Array( 
      Array(  
        'type'    => 'string', 
        'minimum' => 5, 
        'maximum' => 15, 
      ), 
    ), 
  ));

$clonefish = new clonefish( 'loginform', 'test.php', 'POST' ); 

$clonefish->addElements( $config, $_POST );

然后其他人如。 Zend_Form的

$form = new Zend_Form;
$username = new Zend_Form_Element_Text('username');
$username->addValidator(new Zend_Validate_Alnum());
$form->addElement($username);

我意识到Zend_Form可以通过类似于clonefish的数组传递元素,但为什么要这样做呢?

有什么好处吗?它似乎使事情变得更复杂,尤其是在使用像Komodo这样的适当IDE时。

任何想法都会受到赞赏,因为我不想走得太远,并且意识到使用数组添加元素有很大的好处(尽管这不是一个很容易添加的任务)。

干杯

2 个答案:

答案 0 :(得分:2)

  

我的问题是为什么一些“类”通过数组实现元素,而其他通过适当的OO类调用实现元素。

为方便起见。它不那么冗长,感觉不像编码,更像是配置,你需要更少的API知识。

顺便说一下,你还没有遇到一个简单,可定制和完整的完整解决方案的原因是因为它并不简单。表单,它们的验证和呈现是复杂的,特别是如果您想要为任何目的定制它。 ZF的表单组件是如何正确地解耦和分离所有关注点以获得最终可扩展表单构建器(包括通过Zend_Dojo或ZendX_Jquery的客户端代码)的一个很好的示例。但它们也是这方面所需复杂性的一个很好的例子。即使使用方便的阵列配置,也很难让它们随意弯曲,特别是如果您需要偏离默认配置和渲染。

答案 1 :(得分:1)

为什么要使用对象?因此,他们是一个更复杂的类型。请考虑以下示例(我从未使用过Zend_Form,所以我甚至不知道它的架构):

class MySuperAlnumValidator extends Zend_Validate_Alnum {
     protected $forbiddenWords = array();

     public function addForbiddenWord($word) {
         $this->forbiddenWords[] = $word;
     } 

     // Override Zend_Value_Alnum::validate() - I don't know whether such a method even exists 
     // but you know what's the point
     public function validate() {
          parent::validate();

          if (in_array($this->value, $this->forbiddenWords) {
              throw new Exception('Invalid value.');
          }

          return $this->value;
     }
}

// -----------------------

$validator = new MySuperAlnumValidator();
$validator->addForbiddenWord('admin');
$validator->addForbiddenWord('administrator');

$username->addValidator($validator);

这只是一个简单的例子,但是当你开始编写更复杂的验证器/表单字段/等时。那么对象原则上是唯一有意义的工具。