📅  最后修改于: 2020-10-16 07:42:28             🧑  作者: Mango
Zend Framework提供了一个单独的组件zend-form来加速表单创建和验证过程。它连接模型和视图层。它提供了一组表单元素以从预定义的模型创建完整的html表单,提供了InputFilter类以根据表单验证模型,并提供了将数据从表单绑定到模型的选项,反之亦然。
Zend表单组件可以使用Composer命令安装,如下所示:
composer require zendframework/zend-form
Zend表单框架具有三个子组件来管理表单。它们如下文详细解释-
元素-用于定义映射到模型属性的单个html输入控件。
Fieldset-用于以嵌套方式对元素和其他字段集进行分组。
表单-用于创建html表单,并由元素和字段集组成。
Zend表单通常在module // src / Form目录下创建。
现在让我们创建一个简单的表单,将书添加到数据库中。为此,我们应遵循以下步骤-
在* myapp / module / Tutorial / src / Form”目录下创建“ BookForm.php”。在文件中添加以下更改-
add(array(
'name' => 'id',
'type' => 'Hidden',
));
$this->add(array(
'name' => 'author',
'type' => 'Text',
'options' => array(
'label' => 'Author',
),
));
$this->add(array(
'name' => 'title',
'type' => 'Text',
'options' => array(
'label' => 'Title',
),
));
$this->add(array(
'name' => 'submit',
'type' => 'Submit',
'attributes' => array(
'value' => 'Go',
'id' => 'submitbutton',
),
));
}
}
Form类提供了一个add方法来映射模型及其对应的表单详细信息。我们通过扩展Form类创建了BookForm ,并添加了Book模型的表单详细信息。
按照下面指定的过滤器和验证更新模型“ Book” –
inputFilter) {
$inputFilter = new InputFilter();
$inputFilter->add(array(
'name' => 'id',
'required' => true,
'filters' => array(
array('name' => 'Int'),
),
));
$inputFilter->add(array(
'name' => 'author',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$inputFilter->add(array(
'name' => 'title',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$this->inputFilter = $inputFilter;
}
return $this->inputFilter;
}
public function exchangeArray($data) {
$this->id = (!empty($data['id'])) ? $data['id'] : null;
$this->author = (!empty($data['author'])) ? $data['author'] : null;
$this->title = (!empty($data['title'])) ? $data['title'] : null;
}
}
每个模型都应实现InputFilterAwareInterface 。 InputFilterAwareInterface提供了两个方法setInputFilter()和getInputFilter() 。
getInputFilter用于获取模型的验证详细信息。 Zend框架提供了一组丰富的过滤器和验证器来验证表单。书籍模型中使用的一些过滤器和验证器如下-
StripTags-删除不需要的HTML。
StringTrim-删除不必要的空格。
StringLength验证程序-确保用户输入的字符不要超过指定的限制。
包括saveBook方法以将书添加到数据库。
BookTable.php
tableGateway = $tableGateway;
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet;
}
public function getBook($id) {
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $id");
}
return $row;
}
public function saveBook(Book $book) {
$data = array (
'author' => $book->author,
'title' => $book->title,
);
$id = (int) $book->id;
if ($id == 0) {
$this->tableGateway->insert($data);
} else {
if ($this->getBook($id)) {
$this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Book id does not exist');
}
}
}
}
在教程控制器中添加新动作addAction – myapp / module / Tutorial / src / Controller / TutorialController.php。
public function addAction() {
$form = new BookForm();
$form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) {
$book = new Book();
$form->setInputFilter($book->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$book->exchangeArray($form->getData());
$this->bookTable->saveBook($book);
// Redirect to list of Tutorial
return $this->redirect()->toRoute('tutorial');
}
}
return array('form' => $form);
}
addAction方法执行以下过程-
获取请求对象。
检查请求的http方法是否为post方法。
如果请求的http方法不是post ,则仅呈现模板add.phtml
如果请求的http方法不是post ,则它将设置inputfilter ,获取请求数据并将其设置到inputfiler中。
使用Form类的isValid()方法检查表单是否有效。
如果表单无效,它将再次呈现模板add.phtml
如果该表格有效,它将把书保存到数据库中并重定向到主页。
创建模板– myapp / module / Tutorial / view / tutorial / tutorial / add.phtml下的add.phtml
Add.phtml
headTitle($title);
?>
escapeHtml($title); ?>
setAttribute('action', $this->url('tutorial', array('action' => 'add')));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('author'))."
";
echo $this->formRow($form->get('title'))."
";
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
}
在这里,我们使用Form实例$ form渲染书籍表单。
现在,我们可以运行应用程序– http:// localhost:8080 / tutorial / add 。
表格页
验证错误页面