Phalcon中提供了 Phalcon\Forms组件以方便开发人员创建和维护应用中的表单。 以下的样例中展示了主要的用法:

<?php

use Phalcon\Forms\Form,
Phalcon\Forms\Element\Text,
Phalcon\Forms\Element\Select; $form = new Form(); $form->add(new Text("name")); $form->add(new Text("telephone")); $form->add(new Select("telephoneType", array(
'H' => 'Home',
'C' => 'Cell'
)));

可在表单定义时穿插使用表单元素的字义:

<h1>Contacts</h1>

<form method="post">

    <p>
<label>Name</label>
<?php echo $form->render("name") ?>
</p> <p>
<label>Telephone</label>
<?php echo $form->render("telephone") ?>
</p> <p>
<label>Type</label>
<?php echo $form->render("telephoneType") ?>
</p> <p>
<input type="submit" value="Save" />
</p> </form>

开发人员可依据须要渲染html组件。 当使用render()函数时, phalcon内部会使用 Phalcon\Tag 生成对应的html项,
第二个參数中能够对一些属性进行设置。

<p>
<label>Name</label>
<?php echo $form->render("name", array('maxlength' => 30, 'placeholder' => 'Type your name')) ?>
</p>

html的属性也能够在创建时指定:

<?php

$form->add(new Text("name", array(
'maxlength' => 30,
'placeholder' => 'Type your name'
)));

初始化表单(Initializing forms)

从上面的样例我们能够看到表单项也能够在form对象初始化后进行加入。 当然开发人员也能够对原有的Form类进行扩展:

<?php

use Phalcon\Forms\Form,
Phalcon\Forms\Element\Text,
Phalcon\Forms\Element\Select; class ContactForm extends Form
{
public function initialize()
{
$this->add(new Text("name")); $this->add(new Text("telephone")); $this->add(new Select("telephoneType", TelephoneTypes::find(), array(
'using' => array('id', 'name')
)));
}
}

因为 Phalcon\Forms\Form 实现了 Phalcon\DI\Injectable 接口,
所以开发人员能够依据自己的须要訪问应用中的服务。

<?php

use Phalcon\Forms\Form,
Phalcon\Forms\Element\Text,
Phalcon\Forms\Element\Hidden; class ContactForm extends Form
{ /**
* This method returns the default value for field 'csrf'
*/
public function getCsrf()
{
return $this->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

use Phalcon\Forms\Form,
Phalcon\Forms\Element\Text,
Phalcon\Forms\Element\Hidden; class UsersForm extends Form
{
/**
* Forms initializer
*
* @param Users $user
* @param array $options
*/
public function initialize($user, $options)
{ if ($options['edit']) {
$this->add(new Hidden('id'));
} else {
$this->add(new Text('id'));
} $this->add(new Text('name'));
}
}

在表单实例中必需要这样使用:

<?php

$form = new UsersForm(new Users(), array('edit' => true));

验证(Validation)

Phalcon表单组件能够和 validation 集成,以提供验证。
开发人员要单独为每一个html元素提供内置或自己定义的验证器。

<?php

use Phalcon\Forms\Element\Text,
Phalcon\Validation\Validator\PresenceOf,
Phalcon\Validation\Validator\StringLength; $name = new Text("name"); $name->addValidator(new PresenceOf(array(
'message' => 'The name is required'
))); $name->addValidator(new StringLength(array(
'min' => 10,
'messageMinimum' => 'The name is too short'
))); $form->add($name);

然后, 开发人员能够依据用户的输入进行验证:

<?php

if (!$form->isValid($_POST)) {
foreach ($form->getMessages() as $message) {
echo $message, '<br>';
}
}

验证器运行的顺序和注冊的顺序一致。

默认情况下,全部的元素产生的消息是放在一起的, 所以开发人员能够使用简单的foreach来遍历消息, 开发人员能够依照自己的意愿组织输出:

<?php

foreach ($form->getMessages(false) as $attribute => $messages) {
echo 'Messages generated by ', $attribute, ':', "\n";
foreach ($messages as $message) {
echo $message, '<br>';
}
}

或获取指定元素的消息:

<?php

foreach ($form->getMessagesFor('name') as $message) {
echo $message, '<br>';
}

过滤(Filtering)

表单元素能够在进行验证前先进行过滤, 开发人员能够为每一个元素设置过滤器:

设置用户选项(Setting User Options)

表单与实体(Forms + Entities)

我们能够把 model/collection/plain 设置到表单对象中, 这样 phalcon 会自己主动的设置表单元素的值:

<?php

$robot = Robots::findFirst();

$form = new Form($robot);

$form->add(new Text("name"));

$form->add(new Text("year"));

在表单渲染时假设表单项未设置默认值, phalcon会使用对象实体值作为默认值:

<?php echo $form->render('name') ?>

开发人员能够使用以下的方式验证表单及利用用户的输入来设置值:

<?php

$form->bind($_POST, $robot);

//Check if the form is valid
if ($form->isValid()) { //Save the entity
$robot->save();
}

也能够使用一个简单的类做为对象实体进行參数传递:

<?php

class Preferences
{ public $timezone = 'Europe/Amsterdam'; public $receiveEmails = 'No'; }

使用此类做为对象实体,这样能够使用此类中的值作为表单的默认值:

<?php

$form = new Form(new Preferences());

$form->add(new Select("timezone", array(
'America/New_York' => 'New York',
'Europe/Amsterdam' => 'Amsterdam',
'America/Sao_Paulo' => 'Sao Paulo',
'Asia/Tokyo' => 'Tokyo',
))); $form->add(new Select("receiveEmails", array(
'Yes' => 'Yes, please!',
'No' => 'No, thanks'
)));

实体中也能够使用getters, 这样能够给开发人员很多其它的自由, 当然也会洽使开发稍麻烦一些,只是这是值得的:

<?php

class Preferences
{ public $timezone; public $receiveEmails; public function getTimezone()
{
return 'Europe/Amsterdam';
} public function getTimezone()
{
return 'No';
} }

表单控件(Form Elements)

Phalcon提供了一些内置的html元素类, 全部这些元素类仅位于 Phalcon\Forms\Element命名空间下:

名称 描写叙述 演示样例
Text 产生 INPUT[type=text] 项 Example
Password 产生 INPUT[type=password] 项 Example
Select 产生 SELECT tag (combo lists) 项 Example
Check 产生 INPUT[type=check] 项 Example
Textarea 产生 TEXTAREA 项 Example
Hidden 产生 INPUT[type=hidden] 项 Example
File 产生 INPUT[type=file] 项 Example
Date 产生 INPUT[type=date] 项 Example
Numeric 产生 INPUT[type=number] 项 Example
Submit 产生 INPUT[type=submit] 项 Example

事件回调(Event Callbacks)

当扩展表单时, 我们能够在表单类中实现验证前操作及验证后操作:

<?php

class ContactForm extends Phalcon\Mvc\Form
{
public function beforeValidation()
{ }
}

渲染表单(Rendering Forms)

开发人员对表单的渲染操作有全然的控制, 以下的的样例展示了怎样使用标准方法渲染html元素:

<?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

class ContactForm extends Phalcon\Forms\Form
{
public function initialize()
{
//...
} public function renderDecorated($name)
{
$element = $this->get($name); //Get any generated messages for the current element
$messages = $this->getMessagesFor($element->getName()); if (count($messages)) {
//Print each element
echo '<div class="messages">';
foreach ($messages as $message) {
echo $this->flash->error($message);
}
echo '</div>';
} echo '<p>';
echo '<label for="', $element->getName(), '">', $element->getLabel(), '</label>';
echo $element;
echo '</p>';
} }

视图中:

<?php

echo $element->renderDecorated('name');

echo $element->renderDecorated('telephone');

创建表单控件(Creating Form Elements)

除了能够使用phalcon提供的html元素以外, 开发人员还能够使用自己定义的html元素:

<?php

use Phalcon\Forms\Element;

class MyElement extends Element
{
public function render($attributes=null)
{
$html = //... produce some html
return $html;
}
}

表单管理(Forms Manager)

此组件为开发人员提供了一个表单管理器, 能够用来注冊表单,此组件能够使用服务容器来訪问:

<?php

$di['forms'] = function() {
return new Phalcon\Forms\Manager();
};

表单被加入到表单管理器, 然后设置了唯一的名字:

<?php

$this->forms->set('login', new LoginForm());

使用唯一名, 我们能够在应用的不论什么地方訪问到表单:

<?php

echo $this->forms->get('login')->render();

外部资源(External Resources)

  • Vökuró 是一个使用表单构建器来创建和维护表单的演示样例 [Github]

Phalcon之 表单(Forms)的更多相关文章

  1. Laravel教程 六:表单 Forms

    Laravel教程 六:表单 Forms 此文章为原创文章,未经同意,禁止转载. Form laravel 5.2 之后请使用 laravelcollective/html 替换 illuminate ...

  2. BootStrap入门教程 (二) :BASE CSS(排版(Typography),表格(Table),表单(Forms),按钮(Buttons))

    上讲回顾:Bootstrap的手脚架(Scaffolding)提供了固定(fixed)和流式(fluid)两种布局,它同时建立了一个宽达940px和12列的格网系统. 基于手脚架(Scaffoldin ...

  3. 关于创建Django表单Forms继承BaseForm的问题

    在创建Django表单时,因为需要验证用户输入的验证码是否正确,因此需要在session里提取当前验证码的值和POST提交过来的值进行比对,如图: form.py from django import ...

  4. Laravel 5系列教程六:表单 Forms

    免费视频教程地址https://laravist.com/series/laravel-5-basic 在开始之前,我们把界面先美化一点点先: 首先到https://github.com/JellyB ...

  5. [HTML5]HTML表单(Forms)

    表单是HTML最主要的用户输入元素 用户和网页的交互动作有鼠标悬停.点击链接(或移动触摸)和页面滚动等,这些交互方式一般只是服务器单向信息输出. 有时候用户需要输入一些信息给服务器来完成双向交互,这类 ...

  6. 我教女朋友学编程Html系列(6)—Html常用表单控件

    做过网页的人都知道,html表单控件十分重要.基本上我们注册会员.登录用户,都需要填写用户名.密码,那些框框都是表单控件. 本来今天就想写一些常用的html表单控件,于是开始搜资料,找到了一个网页,作 ...

  7. [Django实战] 第9篇 - 表单、视图、模型、模板的交互

    本章通过实现一个用户提交任务请求的页面,讲述表单.视图.模型.模板间的交互. 首先,我们需要定义一个表单(forms.py) class CreatetaskForm(forms.Form): cre ...

  8. 用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单

    目录 目录 前文列表 修改 User Model Flask Bcrypt 将 Bcrypt 应用到 User Model 中 创建登陆表单 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...

  9. WTF Forms – 使用 CSS 实现用户体验更好的表单

    WTF forms 借助 CSS 提供友好的 HTML 表单控件,专为 IE9+ 以及最新的 Chrome.Safari 和 Firefox 浏览器.以文件输入控件的改进,使用 label 包裹在 i ...

随机推荐

  1. sql: sql developer使用

    在sql developer中登陆某数据库,在procedure里面加入一个proc,种类选ARBOR: CREATE OR REPLACE PROCEDURE PROCEDURE23 IS NAM ...

  2. 1.1.5-学习Opencv与MFC混合编程之---画图工具 输入文字和填充图像 修改光标

    源代码:http://download.csdn.net/detail/nuptboyzhb/3961696 输入文字 l 对话框 1.    插入,资源,选择对话框资源 2.    编辑对话框如下: ...

  3. 利用Android属性动画实现Banner的原理与实践

    事实上在Android刚推出属性动画的时候.就想利用它来设计一个Banner控件,一直没什么时间尝试. 在当时看我们应用中的Banner,使用计时器来控制自己主动播放,设置一个非常大的数,利用余数原理 ...

  4. 简易的sniffer程序

    真的非常简易,这个程序不过抓一些发送到本机的数据包,然后显示出来它们的一些信息罢了.      程序很easy!       #include <WinSock2.h> #include ...

  5. C#用链式方法

    C#用链式方法表达循环嵌套   情节故事得有情节,不喜欢情节的朋友可看第1版代码,然后直接跳至“三.想要链式写法” 一.起缘 故事缘于一位朋友的一道题: 朋友四人玩LOL游戏.第一局,分别选择位置:中 ...

  6. 【ASP.NET Web API教程】2 创建各种Web API

    原文 [ASP.NET Web API教程]2 创建各种Web API Chapter 2: Creating Web APIs第2章 创建各种Web API 本文引自:http://www.asp. ...

  7. Google Ads Encryption Key

    aes | floyd's Google Ads Encryption Key

  8. MFC 对话框中动态创建N级菜单以及响应事件

    创建一个基于对话框的工程,工程名为CreateMenu 为该对话框增加一个文件菜单项和测试菜单项,如下图所示   测试菜单项至少要有一个子菜单项 在对话框属性中关联该菜单 在resource.h中增加 ...

  9. 一int考虑什么类型的多少字节

    一int表示的字节数? 问题是,我们经常得到的答案4. 但int究竟占多少个字节,却跟你的机器环境有关. As you can see, the typical data type sizes mat ...

  10. hadoop format过程

    private static boolean format(Configuration conf, boolean isConfirmationNeeded ) throws IOException ...