表单

最后更新于:2022-04-02 05:14:53

[TOC] # 表单 `Phalcon\Forms\Form` 是一个有助于在Web应用程序中创建和维护表单的组件。 以下示例显示了其基本用法: ```php add( new Text( 'name' ) ); $form->add( new Text( 'telephone' ) ); $form->add( new Select( 'telephoneType', [ 'H' => 'Home', 'C' => 'Cell', ] ) ); ``` 可以根据表单定义呈现表单: ```php

Contacts

render('name'); ?>

render('telephone'); ?>

render('telephoneType'); ?>

``` 表单中的每个元素都可以根据开发人员的要求进行渲染。在内部,`Phalcon\Tag` 用于为每个元素生成正确的HTML,您可以将其他HTML属性作为`render()`的第二个参数传递: ```php

render('name', ['maxlength' => 30, 'placeholder' => 'Type your name']); ?>

``` HTML属性也可以在元素的定义中设置: ```php add( new Text( 'name', [ 'maxlength' => 30, 'placeholder' => 'Type your name', ] ) ); ``` ## 初始化表单 如前所述,可以通过向表单类添加元素来在表单类之外初始化表单。您可以在单独的文件中重用代码或组织实现表单的表单类: ```php add( new Text( 'name' ) ); $this->add( new Text( 'telephone' ) ); $this->add( new Select( 'telephoneType', TelephoneTypes::find(), [ 'using' => [ 'id', 'name', ], 'useEmpty' => true, 'emptyText' => 'Select one...', 'emptyValue' => '', ] ) ); } } ``` 此外,Select元素支持 `useEmpty` 选项,以便在可用选项列表中使用空白元素。选项`emptyText ` 和 `emptyValue`是可选的,它允许您分别自定义文本和空元素的值 `Phalcon\Forms\Form` 继承了 `Phalcon\Di\Injectable` 因此您可以根据需要访问应用程序服务: ```php security->getToken(); } public function initialize() { // Set the same form as entity $this->setEntity($this); // Add a text element to capture the 'email' $this->add( new Text( 'email' ) ); // Add a text element to put a hidden CSRF $this->add( new Hidden( 'csrf' ) ); } } ``` 在初始化和自定义用户选项中添加到表单的关联实体将传递给表单构造函数: ```php add( new Hidden( 'id' ) ); } else { $this->add( new Text( 'id' ) ); } $this->add( new Text( 'name' ) ); } } ``` 在表单的实例化中,您必须使用: ```php true, ] ); ``` ## 验证 Phalcon表单与`validation`组件集成,以提供即时验证。可以为每个元素设置内置或自定义验证器: ```php addValidator( new PresenceOf( [ 'message' => 'The name is required', ] ) ); $name->addValidator( new StringLength( [ 'min' => 10, 'messageMinimum' => 'The name is too short', ] ) ); $form->add($name); ``` 然后,您可以根据用户输入的输入验证表单: ```php isValid($_POST)) { $messages = $form->getMessages(); foreach ($messages as $message) { echo $message, '
'; } } ``` 验证器的执行顺序与注册顺序相同。 默认情况下,表单中所有元素生成的消息都已连接,因此可以使用单个foreach遍历它们,您可以更改此行为以获取由字段分隔的消息: ```php getMessages(false) as $attribute => $messages) { echo 'Messages generated by ', $attribute, ':', "\n"; foreach ($messages as $message) { echo $message, '
'; } } ``` 或获取元素的特定消息: ```php getMessagesFor('name'); foreach ($messages as $message) { echo $message, '
'; } ``` ## 过滤 表单还可以在验证之前过滤数据。您可以在每个元素中设置过滤器: ```php setFilters( [ 'string', 'trim', ] ); $form->add($name); $email = new Text( 'email' ); // Set one filter $email->setFilters( 'email' ); $form->add($email); ``` >[info] 阅读过滤相关章节,了解有关在Phalcon中过滤的更多信息。 ## Forms + Entities 可以将模型/集合/普通实例或纯PHP类等实体链接到表单,以便在表单元素中设置默认值,或者轻松地将表单中的值分配给实体: ```php add( new Text( 'name' ) ); $form->add( new Text( 'year' ) ); ``` 一旦表单被渲染,如果没有为元素分配默认值,它将使用实体提供的值: ```php render('name'); ?> ``` 您可以通过以下方式验证表单并从用户输入中分配值: ```php bind($_POST, $robot); // Check if the form is valid if ($form->isValid()) { // Save the entity $robot->save(); } ``` 也可以将普通类设置为实体: ```php add( new Select( 'timezone', [ 'America/New_York' => 'New York', 'Europe/Amsterdam' => 'Amsterdam', 'America/Sao_Paulo' => 'Sao Paulo', 'Asia/Tokyo' => 'Tokyo', ] ) ); $form->add( new Select( 'receiveEmails', [ 'Yes' => 'Yes, please!', 'No' => 'No, thanks', ] ) ); ``` 实体可以实现具有比公共属性更高优先级的getter。这些方法使您可以更自由地生成值: ```php <form method='post'> <?php // Traverse the form foreach ($form as $element) { // Get any generated messages for the current element $messages = $form->getMessagesFor( $element->getName() ); if (count($messages)) { // Print each element echo '<div class='messages'>'; foreach ($messages as $message) { echo $message; } echo '</div>'; } echo '<p>'; echo '<label for='', $element->getName(), ''>', $element->getLabel(), '</label>'; echo $element; echo '</p>'; } ?> <input type='submit' value='Send' /> </form> ``` 或者重用表单类中的逻辑: ```php get($name); // Get any generated messages for the current element $messages = $this->getMessagesFor( $element->getName() ); if (count($messages)) { // Print each element echo "
"; foreach ($messages as $message) { echo $this->flash->error($message); } echo '
'; } echo '

'; echo ''; echo $element; echo '

'; } } ``` 在视图中: ```php renderDecorated('name'); echo $element->renderDecorated('telephone'); ``` ## 创建表单元素 除了Phalcon提供的表单元素,您还可以创建自己的自定义元素: ```php forms->set( 'login', new LoginForm() ); ``` 使用唯一名称,可以在应用程序的任何部分访问表单: ```php forms->get('login'); echo $loginForm->render(); ``` ## 外部资源 * [Vökuró](http://vokuro.phalconphp.com)是一个示例应用程序,它使用表单构建器来创建和管理表单, [[Github](https://github.com/phalcon/vokuro)]
';