Yii 框架使用Forms操作详解


Posted in PHP onMay 18, 2020

本文实例讲述了Yii 框架使用Forms操作。分享给大家供大家参考,具体如下:

创建模型

模型类 EntryForm 代表从用户那请求的数据, 该类如下所示并存储在 models/EntryForm.php 文件中。 请参考类自动加载章节获取更多关于类命名约定的介绍。

<?php
 
namespace app\models;
 
use Yii;
use yii\base\Model;
 
class EntryForm extends Model
{
  public $name;
  public $email;
 
  public function rules()
  {
    return [
      [['name', 'email'], 'required'],
      ['email', 'email'],
    ];
  }
}

该类继承自Yii 提供的一个基类 yii\base\Model, 该基类通常用来表示数据。

EntryForm 类包含 nameemail 两个公共成员, 用来储存用户输入的数据。它还包含一个名为 rules() 的方法, 用来返回数据验证规则的集合。上面声明的验证规则表示:

  • nameemail 值都是必须的
  • email 的值必须满足email规则验证

如果你有一个处理用户提交数据的 EntryForm 对象, 你可以调用它的 validate() 方法触发数据验证。 如果有数据验证失败,将把 hasErrors 属性设为 ture, 想要知道具体发生什么错误就调用 getErrors。

<?php
$model = new EntryForm();
$model->name = 'Qiang';
$model->email = 'bad';
if ($model->validate()) {
  // 验证成功!
} else {
  // 失败!
  // 使用 $model->getErrors() 获取错误详情
}

创建动作

下面你得在 site 控制器中创建一个 entry 操作用于新建的模型。 操作的创建和使用已经在说一声你好小节中解释了。

<?php
 
namespace app\controllers;
 
use Yii;
use yii\web\Controller;
use app\models\EntryForm;
 
class SiteController extends Controller
{
  // ...现存的代码...
 
  public function actionEntry()
  {
    $model = new EntryForm;
 
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
      // 验证 $model 收到的数据
 
      // 做些有意义的事 ...
 
      return $this->render('entry-confirm', ['model' => $model]);
    } else {
      // 无论是初始化显示还是数据验证错误
      return $this->render('entry', ['model' => $model]);
    }
  }
}

该操作首先创建了一个 EntryForm 对象。然后尝试从 $_POST 搜集用户提交的数据, 由 Yii 的 yii\web\Request::post() 方法负责搜集。 如果模型被成功填充数据(也就是说用户已经提交了 HTML 表单), 操作将调用 validate() 去确保用户提交的是有效数据。

信息: 表达式 Yii::$app 代表应用实例,它是一个全局可访问的单例。 同时它也是一个服务定位器, 能提供 requestresponsedb 等等特定功能的组件。 在上面的代码里就是使用 request 组件来访问应用实例收到的 $_POST 数据。

用户提交表单后,操作将会渲染一个名为 entry-confirm 的视图去确认用户输入的数据。 如果没填表单就提交,或数据包含错误(译者:如 email 格式不对), entry 视图将会渲染输出,连同表单一起输出的还有验证错误的详细信息。

创建视图

最后创建两个视图文件 entry-confirmentry。 他们会被刚才创建的 entry 操作渲染。

entry-confirm 视图简单地显示提交的 name 和 email 数据。视图文件应该保存在 views/site/entry-confirm.php

<?php
use yii\helpers\Html;
?>
<p>You have entered the following information:</p>
 
<ul>
  <li><label>Name</label>: <?= Html::encode($model->name) ?></li>
  <li><label>Email</label>: <?= Html::encode($model->email) ?></li>
</ul>

entry 视图显示一个 HTML 表单。视图文件应该保存在 views/site/entry.php

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(); ?>
 
  <?= $form->field($model, 'name') ?>
 
  <?= $form->field($model, 'email') ?>
 
  <div class="form-group">
    <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
  </div>
 
<?php ActiveForm::end(); ?>

视图使用了一个功能强大的小部件 ActiveForm 去生成 HTML 表单。 其中的 begin()end() 分别用来渲染表单的开始和关闭标签。 在这两个方法之间使用了 field() 方法去创建输入框。 第一个输入框用于 “name”,第二个输入框用于 “email”。 之后使用 yii\helpers\Html::submitButton() 方法生成提交按钮。

用浏览器访问下面的 URL 看它能否工作:

http://hostname/index.php?r=site/entry

Yii 框架使用Forms操作详解

Yii 框架使用Forms操作详解

数据首先由客户端 JavaScript 脚本验证,然后才会提交给服务器通过 PHP 验证。 yii\widgets\ActiveForm 足够智能到把你在 EntryForm 模型中声明的验证规则转化成客户端 JavaScript 脚本去执行验证。 如果用户浏览器禁用了 JavaScript, 服务器端仍然会像 actionEntry() 方法里这样验证一遍数据。这保证了任何情况下用户提交的数据都是有效的。

警告: 客户端验证是提高用户体验的手段。 无论它是否正常启用,服务端验证则都是必须的,请不要忽略它。

输入框的文字标签是 field() 方法生成的,内容就是模型中该数据的属性名。 例如模型中的 name 属性生成的标签就是 Name

你可以在视图中自定义标签 按如下方法:

<?= $form->field($model, 'name')->label('自定义 Name') ?>
<?= $form->field($model, 'email')->label('自定义 Email') ?>

信息: Yii 提供了相当多类似的小部件去帮你生成复杂且动态的视图。 在后面你还会了解到自己写小部件是多么简单。 你可能会把自己的很多视图代码转化成小部件以提高重用,加快开发效率。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
基于empty函数的判断详解
Jun 17 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
PHP中的流(streams)浅析
Jul 02 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
PHP中字符与字节的区别及字符串与字节转换示例
Oct 15 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
Apr 09 PHP
基于PHP实现微信小程序客服消息功能
Aug 12 PHP
laravel实现前后台路由分离的方法
Oct 13 PHP
thinkphp 框架数据库切换实现方法分析
May 18 #PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 #PHP
php + ajax 实现的写入数据库操作简单示例
May 16 #PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 #PHP
Yii框架应用组件用法实例分析
May 15 #PHP
Yii框架小部件(Widgets)用法实例详解
May 15 #PHP
Yii框架安装简明教程
May 15 #PHP
You might like
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
js断点调试经验分享
2017/12/08 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
JS使用栈判断给定字符串是否是回文算法示例
2019/03/04 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
[52:03]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第三场 1月31日
2021/03/11 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
Python数据类型详解(一)字符串
2016/05/08 Python
python web基础之加载静态文件实例
2018/03/20 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
销售队伍口号
2014/06/11 职场文书
写得不错的求职信范文
2014/07/11 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
大学生党性分析材料
2014/12/19 职场文书
共青团员自我评价
2015/03/10 职场文书
汉字听写大会观后感
2015/06/12 职场文书
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python
详解PyTorch模型保存与加载
2022/04/28 Python
Nginx配置使用详解
2022/07/07 Servers