yii中建立模型和建立yii 模型 活动记录录和建立表有什么区别

创建表单(Creating Forms) - 接收用户数据(Getting Data from Users) - Yii Framework 2.0 权威指南 - 文档 - Yii Framework 中文社区
接收用户数据(Getting Data from Users) - 创建表单(Creating Forms)
在 Yii 中使用表单的主要方式是通过 。如果是基于
模型的表单应首选这种方式。此外,在 中也有一些实用的
方法用于添加按钮和帮助文本。
在客户端上显示的表单,大多数情况下有一个相应的,用来验证其输入的服务器数据
一节获取关于验证的细节)。
当创建基于模型的表单时,第一步是定义模型本身。该模式可以是一个基于的类,
表示数据库中的数据,也可以是一个基于通用模型的类(继承自
来获取任意的输入数据,如登录表单。在下面的例子中,我们展示了一个用来做
登录表单的通用模型:
class LoginForm extends \yii\base\Model
public $username;
public $password;
public function rules()
在控制器中,我们将传递一个模型的实例到视图,其中
小部件用来显示表单:
use yii\helpers\Html;
use yii\widgets\ActiveForm;
$form = ActiveForm::begin([
'id' =& 'login-form',
'options' =& ['class' =& 'form-horizontal'],
&?= $form-&field($model, 'username') ?&
&?= $form-&field($model, 'password')-&passwordInput() ?&
&div class="form-group"&
&div class="col-lg-offset-1 col-lg-11"&
&?= Html::submitButton('Login', ['class' =& 'btn btn-primary']) ?&
&?php ActiveForm::end() ?&
在上面的代码中,yii\widgets\ActiveForm::begin() 不仅创建了一个表单实例,同时也标志着表单的开始。
放在 yii\widgets\ActiveForm::begin() 与 yii\widgets\ActiveForm::end()
之间的所有内容都被包裹在 HTML 的 &form& 标签中。
与任何小部件一样,你可以指定一些选项,通过传递数组到 begin 方法中来配置该小部件。在这种情况下,
一个额外的 CSS 类和 ID 会在 &form& 标签中使用。要查看所有可用的选项,
请参阅 API 文档的 。
为了在表单中创建表单元素与元素的标签,以及任何适用的 JavaScript 验证,
方法在调用时,会返回一个
直接输出该方法时,结果是一个普通的(文本)输入。要自定义输出,可以附加上
的其它方法来一起调用:
&?= $form-&field($model, 'password')-&passwordInput() ?&
&?= $form-&field($model, 'username')-&textInput()-&hint('Please enter your name')-&label('Name') ?&
&?= $form-&field($model, 'email')-&input('email') ?&
它会通过在
中定义的表单字段来创建 &label&,&input& 以及其它的标签。
input 输入框的 name 属性会自动地根据
以及属性名来创建。
例如,对于在上面的例子中 username 输入字段的 name 属性将是 LoginForm[username]。
这种命名规则使所有属性的数组的登录表单在服务器端的 $_POST['LoginForm'] 数组中是可用的。
Tip: If you have only one model in a form and want to simplify the input names you may skip the array part by
overriding the
method of the model to return an empty string.
This can be useful for filter models used in the
to create nicer URLs.
指定模型的属性可以以更复杂的方式来完成。例如,当上传时,多个文件
或选择多个项目的属性,可能需要一个数组值,你可以通过附加 [] 来
指定它的属性名称:
echo $form-&field($model, 'uploadFile[]')-&fileInput(['multiple'=&'multiple']);
echo $form-&field($model, 'items[]')-&checkboxList(['a' =& 'Item A', 'b' =& 'Item B', 'c' =& 'Item C']);
命名表单元素,如提交按钮时要小心。在
中有一些保留的名称,可能会导致冲突:
表单和它们的子元素不应该使用与表单的属性冲突的 input name 或 id,
例如 submit,length,或者 method。
要检查你的标签是否存在这些问题,一个完整的规则列表详见 。
额外的 HTML 标签可以使用纯 HTML 或者 -辅助类中的方法来添加到表单中,就如上面例子中的
yii\helpers\Html::submitButton()。
提示: 如果你正在你的应用程序中使用 Twitter Bootstrap CSS 你可以使用yii\bootstrap\ActiveForm
前者继承自后者并在生成表单字段时使用 Bootstrap 特有的样式。
提示: 为了设计带星号的表单字段,你可以使用下面的 CSS:
.required :after {
content: " *";
color: red;
创建下拉列表
可以使用 ActiveForm 的
方法来创建一个下拉列表:
use app\models\ProductCategory;
$this yii\web\View */
$form yii\widgets\ActiveForm */
$model app\models\Product */
echo $form-&field($model, 'product_category')-&dropdownList(
ProductCategory::find()-&select(['category_name', 'id'])-&indexBy('id')-&column(),
['prompt'=&'Select Category']
模型字段的值将被自动预先选定。
Working with Pjax
widget allows you to update a certain section of a
page instead of reloading the entire page. You can use it to update only the form
and replace its contents after the submission.
You can configure
to specify
which form submission may trigger pjax. If not set, all forms with data-pjax
attribute within the enclosed content of Pjax will trigger pjax requests.
use yii\widgets\Pjax;
use yii\widgets\ActiveForm;
Pjax::begin([
$form = ActiveForm::begin([
'options' =& ['data' =& ['pjax' =& true]],
ActiveForm::end();
Pjax::end();
Tip: Be careful with the links inside the
widget since
the response
will also be rendered inside the widget. To prevent this, use the
data-pjax="0" HTML attribute.
Values in Submit Buttons and File Upload There are known issues using jQuery.serializeArray() when dealing with
[[ button values]] which
won't be solved and are instead deprecated in favor of the FormData class
introduced in HTML5.
That means the only official support for files and submit button values with
ajax or using the
widget depends on the
[[ support]]
for the FormData class.
处理提交的表单数据的服务器端验证,
以及 ajax- 和客户端验证。
要学会有关表格的更复杂的用法,你可以查看以下几节:
同一种类型的多个模型的采集数据。
在同一窗口中处理多个不同的模型。
如何使用表格来上传文件。问题:Yii2中数据模型问题
描述:RT,刚开始用Yii2,现在想把一些个默认的数据保存在数据表中(setting),如站点信息、模板设置等,表分为俩字段 key =& value,我现在的代码是:写一个 Setting ActiveReocrd 放入 common\models 中;然后几个站点信息、模板设置这几个都设置为 Model,主要为为了表单和验证。请问,怎样的方式是否主流和优雅?如果不是,请大家提点。解决方案1:首先不要重复造轮子,除非你造的轮子更加优秀。现在想把一些个默认的数据保存在数据表中(setting),如站点信息、模板设置等,表分为俩字段 key =& value这个功能可以使用现成的: /funson86/yii2-setting
以上介绍了“Yii2中数据模型问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:/itwd/1373653.html
上一篇: 下一篇:YII&对象&table::model()&与&new&table()区别
创建一个CActiveRecord模型
class table extends CActiveRecord{ //table为表名,为了使用方便
& & public function
tableName(){
& return __CLASS__;
& & public static function
model($className = __CLASS__){
& return parent::model($className);
使用时可以直接使用
table::model()-&find() ;
$model = new table();
$model-&find();
但其实两者是有所区别的,前者使用静态方法创建类实例 与
类中所使用的$this为相同,单一操作不会有影响,当有查询后的添加操作时,将导致无法新增数据,log里看到程序是进行的update操作。
而后者,new一个新对象,与类中$this对象是不冲突的
所以建议:
模型中既有查询又有插入操作时使用 new 方法创建对象进行操作
只在使用单纯的查询时使用table::model()方法
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。4149人阅读
YII中实现两种类型的模型,分别是表单模型和活动记录。在持久化数据方面,YII只实现了活动记录,对于复杂的数据关系可以用框架提供的DAO来自己写model,对应集成doctrine这样的ORM还没有仔细研究过。
框架中的model是CModel子类,CModel主要是一些验证与错误处理,并实现迭代器和数组访问接口,活动记录模型CActiveRecord是AR模型的基类。
每个AR类代表一个单独的数据表,一个AR实例则代表那个表中的一行。AR是一种对象关系映射(ORM)的设计模式,它负责数据持久化. 封装了数据库CURD操作,同时它是一种领域模型(Domain Model), 封装了部分业务逻辑。一个AR类中包括了表结构(Table Schema),约束以及 CURD
实例化model有两种方法,直接new一个新的实例,或者用静态方法mode(),后者与前者的区别是略过构造函数执行的代码(主要是避免元数据的多次获取),用静态方法mode()创建ar对象经过一下步骤://$model::model($class)
$model=self::$_models[$className]=new $className(null);//创建一个mode实例
new CActiveRecordMetaData($model)//创建元数据类
//1、获取表模式实例
$model-&getDbConnection() //获取数据库连接
-&getSchema()//获取数据库schema
-&getTable($tableName)//获取表shema
-&loadTable()//获取表对象
-&findColumns()//获取表中列对象以及其中的约束
-&findConstraints()//获取表约束(代码实际上是外键关系)
//2、主键配置
//3、添加关系(关系包括BELONGS_TO、HAS_ONE、HAS_MANY、MANY_MANY、STAT)
$model-&attachBehaviors($model-&behaviors());//添加行为上面流程下来会遇到一个问题,每一次创建model都会执行&SHOW COLUMNS FROM $tableName&和&SHOW CREATE TABLE $tableName&的查询,在高并发下会影响性能。可以在主配置文件中的数据库配置中添加schemaCachingDuration和schemaCacheID的配置来缓存数据库schema,前者是设置缓存的时间,后者是缓存组件的id,但缓存带来的问题是修改数据库中表结构不能立即生效,所以在生产环境下写一个刷新缓存的脚本是又必要的。
ar模型带来的好处是将开发中SQL语句的编写减到最小,ar模型既封装了数据库记录的状态和持久化到数据库的访问方法,也封装了业务逻辑,这在关系不是很复杂的应用中带来的好处显而易见,但如果数据库关系复杂,业务逻辑复杂,有必要将对数据的操作单独提出来,YII中的DAO就是将业务逻辑和数据交换分开,也降低了业务和数据库的耦合性。
YII中DAO基于PDO,统一的接口可以访问不同的数据库管理系统。在框架中CDbConnection、CDbCommand、CdbDataReader、CDbTransaction类分别管了数据量的连接、命令、读取和事务。
YII还对数据库的schema进行映射,一个数据库是对应一个对象,一个表对应一个对象,一列对应一个对象,这些对象分别封装其对应schema的一些操作。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:152433次
积分:1956
积分:1956
排名:第17793名
原创:42篇
评论:20条
(1)(3)(2)(1)(1)(1)(2)(5)(2)(11)(1)(16)(1)(1)(1)君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
学习yii过程中记录的零星片段.doc
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 yii2 表单模型 的文章

 

随机推荐