Skip to content
zhanganzhen edited this page Dec 22, 2011 · 6 revisions

formslib.php中定义了四个类

1. abstract class moodleform`

2. class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless`

3. class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless

4. class MoodleQuickForm_Rule_Required extends HTML_QuickForm_Rule	

moodleform类的构造函数中创建了mooleQuickForm类的实例,moodleQuickForm是从HTML_QuickForm中继承过来的。 下面自定义一个继承moodleform的类。首先要重写definition()函数,在其中定义将要使用的元素,以及规则。在server端还可以进一步定义一些本地化的输入规则,重写validation()函数,它用来判断用户输入的data以及file是否符合规范。

require_once("$CFG->libdir/formslib.php");
 
class simplehtml_form extends moodleform {
 
    function definition() {
        global $CFG; 
        $mform =& $this->_form; 
        $mform->addElement()... 
            ...
    }
    
    function validation($data, $files) {
        $errors = parent::validation($data, $files);
        ...
        return $errors;
    }                     
}      
                        

定义好类之后,创建一个类的实例,即构建一个moodleform。其中setAdvanced()可将指定元素设为高级元素,这样在表单显示页面就会有选项按钮,可选则显示高级,会有更多细致内容展示。display()将表单显示给用户,允许用户填写表单。

  <?php
      require_once "simplehtml.php";

      $form = new simplehtml('frmTest', 'get');
      $form->addElement('header', 'MyHeader', 'Testing QuickForm');
      $form->addElement('select', 'display', get_string('displaymode', 'choice'), $CHOICE_DISPLAY);
      $mform->setAdvanced('display');
       ...
      $form->addRule('MyTextBox', 'Your name is required', 'required');

      if ($form->validate()) {
          $form->freeze();
      }
      $form->display();
  ?>

HTML_QuickForm中各个函数功能以及调用接口

源码: /moodle/lib/pear/HTML/QuickForm.php

1.new HTML_QuickForm($formName='', $method='post', $action='', $target='', $attributes=null, $trackSubmit = false)

创建一个HTML_QuickForm类的对象,提交的目的地址action的缺省值是当前PHP文件,提交的类型method缺省值是post,而使用get的好处是用户可以将返回结果页面加入书签。

2. registerElementType($typeName, $include, $className)

自定义一种元素类型,将其加入到$GLOBALS['HTML_QUICKFORM_ELEMENT_TYPES']中。 参数$include表示新类型所在文件的路径。 在/moodle/lib/pear/HTML/QuickForm/可以查看HTML中已有元素类型的源码。

Moodle新定义了一些元素类型,如modgrade,grading,warning,filemanager,filepicker等。 在/moodle/lib/forms/可以查看到新定义的元素类型以及重新定义的旧元素类型源码。

3.createElement($elementType)

新建一个指定类型的表单元素,可以接受不定数量的参数,根据元素类型而定。

4. addElement($element_name, $type, $contents, $attr_collections, $attributes = array())

向表单中添加元素,常用到的有:advcheckbox,button,checkbox,date,file,header,hidden,hierselect,html,image link,password,radio,reset,select,static,submit,text,textarea。

5. addGroup($elements, $name=null, $groupLabel='', $separator=null, $appendName = true)

把几个元素绑定成一组,使用同一个标签,并且会在同一行显示。

6. registerRule($ruleName, $type, $data1, $data2 = null)

_自定义输入规则,将其加入到$GLOBALS['HTML_QuickForm_registered_rules']中。 参数type可选‘regex’,‘function’或‘rule’ 参数$data1根据type分别对应 regular expression,function名称,HTML_QuickForm_Rule classname。 参数$data2可选function所在类的名称,HTML_QuickForm_Rule所在文件路径。 在/moodle/lib/pear/HTML/QuickForm/Rule/可以查看HTML中已有规范的源码。

Moodle中仅更改了一条规范,‘required’。 _registerRule('required', null, 'MoodleQuickForm_Rule_Required', "$CFG->libdir/formslib.php"); _

7.(1)addRule($element, $message, $type, $format=null, $validation='server', $reset = false, $force = false)

制定用户输入数据的格式。默认是在服务器端检验提交的数据是否符合定义的规范,若要在客户端进行检测,将'server'改为‘client’。 常用到的规范有:required,maxlength,rangelength,regex,email,emailorblank,lettersonly,alphanumeric _numeric,nopunctuation,nonzero _

(2)addGroupRule($group, $arg1, $type='', $format=null, $howmany=0, $validation = 'server', $reset = false)

为指定的组设定规范,相当于对组内全部元素都添加此规范。

(3)addFormRule($rule)

设置全局整个表单的规范

8.(1)setDefaults($defaultValues = null, $filter = null)

给元素设置缺省值,该值可由用户修改。

(2)setConstants($constantValues = null, $filter = null)

将元素赋值为常量,不可被用户更改。

(3)setDatasource(&$datasource, $defaultsFilter = null, $constantsFilter = null)

为表单选择数据源对象,若该对象有setDefault,setConstant方法,可以用第二,三个参数为该数据源设置默认值或常量。

9.(1)getElement($element)

返回指向元素的指针

(2)getElementValue($element)

返回元素未经过滤的值,或其默认值,常量值。

(3)exportValue($element)

返回提交的‘clean-up’过的元素值或setValue/setDefault/setConstant中的值。

(4)getSubmitValue($elementName)

返回提交后的经过滤处理的元素值。

(5)getSubmitValues($mergeFiles = false)

返回全部提交的元素值

(6)getElementType($element)

返回元素类型。

10.removeElement($elementName, $removeRules = true)

删除一指定元素,并返回指向它的指针。

11.process($callback,$option = false)

处理用户提交的数据。用第一个参数可以是自定义的数据处理函数,第二个参数用来选择是否处理提交的文件。

12. applyFilter($element, $filter)

指定某函数处理用户输入数据,如使用内建函数trim,可以过滤掉用户提交内容中开始与结尾的空白符,常和addRule(required)配合使用, 由于用户输入空白字符也被认为符合“required”规范。其中第一个参数若设为__ALL__则对所有元素进行过滤处理。

13.(1)validate()

判别一个表单是否有效,调用此函数需要至少一个GET/POST参数,若参数还能满足预先定义好的规范(rules),此时函数返回TRUE,否则FALSE。

(2)validate($value, $options = null)

在MoodleQuickForm_Rule_Required类中,改写了validate函数,该函数在服务器端识别给定的元素是否符合规范,允许用户输入 space或empty tag作为元素值。

(3)getValidationScript($format = null)

在MoodleQuickForm_Rule_Required中,该函数返回在客户端判别给定元素是否为空的javaScript code。

14.freeze($elementList=null)

冻结表单元素。去掉input tag,用户不能再编辑此表单。通过改变元素渲染(render)实现此函数。

15.toHtml ($in_data = null)

返回HTML版本的表单。

Moodle的formslib中新定义的各函数功能及接口 详细文档

源码/moodle/lib/formslib

1.definition()

该函数在modleform类的构造函数中使用,它用来定义表单中可使用的全部元素,以及表单的输入规范。为validate提供依据。若要删除元素则在 definition_after_data()中处理。

3.addHelpButton($elementname,$identifier,$component)

为元素添加帮助按钮,在$component中寻找由标识符$identifier标识的两个string: get_string($identifier, $component): 文章的标题 _get_string("{$identifier}help", $component):文章的内容

4.disabledIf($elementName, $dependentOn, $condition = 'notchecked', $value='1')

判断条件是否满足决定是否要禁用一组元素或某个元素。

5.setType($elementname, $paramtype)

为元素指定PARAM* types,选择提交的变量如何清除。除了select,radio,checkbox外,其余元素必须指明其类型。_