📅  最后修改于: 2020-10-25 04:25:16             🧑  作者: Mango
FuelPHP通过Fieldset和Fieldset_Field类提供了高级表单编程。 Fieldset提供了一种面向对象的方式来创建表单。它完全支持模型。它还具有对客户端和服务器端验证的内置支持。要创建完整的表单,创建具有适当表单和验证设置的模型就足够了。在本章中,让我们了解Fieldset类以及如何使用它创建表单。
Fieldset是Fieldset_Field对象的集合。 Fieldset_Field定义表单的各个条目,例如名字,姓氏等以及验证。 Fieldset类具有添加/编辑/删除字段的方法。它具有识别模型中定义的字段并根据给定模型创建字段的选项。 Fieldset在后台使用Form和Validation类来完成实际工作。让我们看看Fieldset类的一些重要方法。
forge创建一个新的Fieldset实例。它具有以下两个参数-
$ name-字段集的标识符
$ config-配置数组可能的选项是validation_instance和form_instance。 validation_instance可以具有Validation对象,而form_instance可以具有Form对象。
$employee_form = Fieldset::forge('employee');
实例通过标识符返回先前创建的Fieldset实例。
$employee_form = Fieldset::instance('employee');
获取字段集实例的标识符。
$employee_form = Fieldset::forge('employee');
$name = $employee_form->get_name();
add创建一个新的Fieldset_Field实例并将其添加到当前字段集中。它包含以下四个参数,
$ name-字段名称
$ label-字段的标签
$ attributes -HTML标签属性
$ rules-验证规则
$employee_field = $employee_form-> add (
'employee_lastname',
'Lastname',
array ('class' => 'pretty_input')
);
// with validation rules
$employee_form->add (
'email', 'E-mail',
array('type' => 'email', 'class' => 'pretty_input'),
array('required', 'valid_email')
);
add_before与add类似,不同之处在于它具有一个额外的参数来指定将在其之前添加新创建的字段的字段。
$employee_form->add_before (
'employee_firstname',
'Firstname',
array ('class' => 'pretty_input'),
array(),
'employee_lastname'
);
delete从字段集中删除指定的字段。
$employee_form->delete('employee_firstname');
field从字段集中获取所有字段或指定的字段。
$fields = $employee_form->field();
$lastname_field = $employee_form->field('employee_lastname');
build是$ this-> form()-> build()的别名。生成表单的HTML标记。
$employee_form->build(Uri::create('employee/add'));
enable重新启用先前已禁用的字段。
$employee_form->enable('employee_firstname');
disable允许禁用构建字段集中的字段。
$employee_form->disable('employee_firstname');
form返回当前字段集的Form实例。
$form = employee_form->form();
add_model将模型的字段添加到字段集中。它具有以下三个参数,
$ class-类名
$ instance-类的实例,以使用值填充字段
$ method-类中方法的名称。此方法用于将字段添加到字段集中。 Orm \ Model具有必需的方法。默认方法名称为set_form_fields。
$employee_form = Fieldset::forge('employee');
$employee_form->add_model('Model_Employee');
populate使用模型实例设置字段集中字段的初始值。
$emp = new Model_Employee();
$emp->name = "Jon";
$employee_form->populate($emp);
重新填充与填充相同,不同之处在于重新填充字段集中的字段。
验证获取当前字段集的验证实例。
$validation = $employee_form->validation();
$ this-> validation()-> validated()的别名。
输入
$ this-> validation()-> input()的别名。
错误
$ this-> validation()-> error()的别名。
show_errors
$ this-> validation()-> show_errors()的别名。
让我们创建一个高级表单,以使用Fieldset类在示例员工应用程序中添加新员工。
使用必要的验证规则更新员工模型,并添加验证观察者,如下所示。
array (
'data_type' => 'varchar',
'label' => 'Employee Name',
'validation' => array (
'required',
'min_length' => array(3),
'max_length' => array(80)
),
'form' => array (
'type' => 'text'
),
),
'age' => array (
'data_type' => 'int',
'label' => 'Employee Age',
'validation' => array (
'required',
),
'form' => array ('type' => 'text' ),
),
);
// Just add the Observer, and define the required event
protected static $_observers = array('Orm\\Observer_Validation' => array (
'events' => array('before_save')));
}
在这里,我们为名称和年龄字段定义了验证规则,并添加了一个新的观察者以执行服务器端验证,然后再将模型保存到数据库中。相同的验证规则还将在表单中创建必要的输入验证属性。
如下所示在雇员控制器中创建新动作action_advancedform。
public function action_advancedform() {
// create a new fieldset and add employee model
$fieldset = Fieldset::forge('employee')->add_model('Model_Employee');
// get form from fieldset
$form = $fieldset->form();
// add submit button to the form
$form->add('Submit', '', array('type' => 'submit', 'value' => 'Submit'));
// build the form and set the current page as action
$formHtml = $fieldset->build(Uri::create('employee/advancedform'));
// set form in data
$data = array();
$data['form'] = $formHtml;
return Response::forge(View::forge('employee/advancedform', $data, false));
}
在这里,我们使用字段集创建了表单并将表单发送到视图。接下来,如下所示添加操作视图, fuel / app / views / employee / advancedform.php 。
Employee :: add page
现在,请求页面http:// localhost:8080 / employee / add将显示以下形式。
更新操作方法action_advancedform以处理该表单,并将用户输入的雇员数据添加到雇员控制器中的数据库中,如下所示。
public function action_advancedform() {
// create a new fieldset and add employee model
$fieldset = Fieldset::forge('employee')->add_model('Model_Employee');
// get form from fieldset
$form = $fieldset->form();
// add submit button to the form
$form->add('Submit', '', array('type' => 'submit', 'value' => 'Submit'));
// build the form and set the current page as action
$formHtml = $fieldset->build(Uri::create('employee/advancedform'));
if (Input::param() != array()) {
try {
$article = Model_Employee::forge();
$article->name = Input::param('name');
$article->url = Input::param('age');
$article->save();
Response::redirect('employee/list');
}
catch (Orm\ValidationFailed $e) {
$view = View::forge('employee/advancedform');
$view->set('form', $formHtml, false);
$view->set('errors', $e->getMessage(), false);
}
}
return Response::forge($view);
}
在此,一旦用户输入的数据经过验证并保存到数据库中,我们便已重定向到员工列表页面。否则,我们将再次显示该表格。
现在,请求URL http:// localhost:8080 / employee / add并输入一些员工数据并提交表单。如果未提供数据,则该表单将提示用户输入数据,如以下屏幕截图所示。
如果用户绕过客户端验证,则服务器将验证表单并显示错误,如以下屏幕截图所示。
如果数据通过了客户端和服务器端的验证,则员工数据将保存到数据库中,并且该页面将重定向到列表页面。