1.修改默认控制器/方法
yii默认是site控制器,可以在web.php中设置$config中的'defaultRoute'='xxxx';
使用自定义默认的控制器。也可以改写Yii::$app->defaultRoute
属性。
yii的默认方法是index,可以在vender/yiisoft/yii2/base/Controller.php
中进行初始设置,也可以在控制器中改写defaltAction=’action’。
2.添加独立模块
yii可以在modules文件夹中添加自定义模块,添加完成后在web.php中的$config中的’modules’=[id=..class=…]设置模块的开关。
模块一般用于一些独立的功能,像我站里的admin模块整体负责后台逻辑。
3.模型操作表设置
yii的模型有Model和ActiveRecord两种,Model类用来处理基本的业务逻辑,没有数据库相关方法,如果要操作同名数据表,请继承ActiveRecord类。
我们用一个在models文件夹中的Operation.class里Operation类来继承yii\db\ActiveRecord来操作Operation表。
如果要操作其他表,也可以重写public $tableName属性来设置。或改写其tableName方法(注意是静态方法) :
public static function tableName(){return 'tableName'}
4.视图层构成
yii的视图层使用.php文件,而且其内部的实现也多采用yii内置小部件的形式,如
<?= LinkPager::widget(['pagination'=>$pagination]) ?>
来表示其分页类。
而且,像input这样的小部件,用ActiveForm类来展现,yii会对每个自动加入ajax验证,其一般的小部件都放在yii\widget\里,我们还可以在此文件夹里构建自定义的小部件类。
5.布局模式
yii会默认开启布局模式,其布局模板为view中的layout中的main.php,我们可以在veder/yiisoft/yii2/web/controller.php
基础类中public $layout属性修改模板文件的配置。
我们还可以设置关闭或指定特定的layout:
控制器内控制 public $layout=false/'layout'
控制器成员方法内控制 $this->layout=false/'layout'
视图中选择布局 $this->context->layout=false/'layout'
6.模型的基本设置
yii的模型是MVC的处理器,它执行对MVC逻辑的处理。 model的属性定义是其核心,由于默认定义魔术方法get/set,所以可以直接在model外调用$modle->attr='value'
,对模型的属性进行获取/赋值。
场景设置
yii中有对场景的定义,定义场景可以使得yii在不同的情况下返回不同的数据信息。用model的scenarios()方法来设置返回数据。
我们在使用model时传入场景名 $model=new Model(['scenario'=>'login']);
来确定场景。
规则设置
yii中对验证规则的定义,使用rules()方法可以一条定义多条规则,也可以根据不同的场景进行定义。外部验证时用$model->validate()
方法来执行验证。
在安全模式下,要进行安全验证,即每一个属性都要在rules里验证,如果没有特定规则,也要添加’safe’验证。否则验证失败,存入数据库也会失败。
标签设置
在处理表单时,多用$model->attributes
属性来表示全部的属性。其中attributeLabels方法return一个数组用来表示视图层中ActiveForm产生的各个表单项的label标签
7.引用JS/CSS文件
yii中的view也使用面向对象方式 ,所以引入CSS和JS文件要用特殊的方法。
使用$this->registerJsFile('js.js')
来引入js文件;
使用$this->registerJsFile('js.js')
来引入js文件;
8.分页类的使用
<code class="hljs haskell has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//在模型中计算出总数量 $count=$this->find()-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">where</span>()->count(); //用总条数和设定的每页个数实例化一个yii\<span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>\<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Pagination</span>类</span> $page=new <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Pagination</span>([totalCount' => $count,'defaultPageSize' => <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,]); //使用分页类的属性搜索想要的数据,并返回数据 $res=$this->find()-><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">where</span>()->offset($page->offset)->limit($page->limit)->all(); <span class="hljs-title" style="box-sizing: border-box;">return</span> [$res,$page]; //使用控制器渲染页面 $<span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>=$model->getData<span class="hljs-container" style="box-sizing: border-box;">()</span>;</span> <span class="hljs-title" style="box-sizing: border-box;">return</span> $this->render('index',$<span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span>);</span> //在视图页面中使用数据。 <span class="hljs-title" style="box-sizing: border-box;">foreach</span>($res <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">as</span> key)... <span class="hljs-title" style="box-sizing: border-box;">yii</span>\widgets\<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">LinkPager</span>::widget([pagination=$page,prevPageLabel='上一页'])</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>
。
9.创建url
<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">use</span> <span class="hljs-title" style="box-sizing: border-box;">yii</span>\<span class="hljs-title" style="box-sizing: border-box;">helpers</span>\<span class="hljs-title" style="box-sizing: border-box;">Url</span>; Url::to([<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'xxx/xxx'</span>]); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//或</span> Yii::<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$app</span>->urlManager->createUrl(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'xxx.xxx'</span>)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>
10查询构建器
yii里的QUERY查询语句构造器非常简单好用,它可以用在模型和控制器中,虽然可能会造成模型与表不对应,但其构成接近sql语句,使用它可以轻易写出复杂的sql语句而不必严格遵从yii的内置规则。
方法为:
<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-title" style="box-sizing: border-box;">$res</span>=<span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> yii\db\Query())</span>-></span>select<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>-></span>from<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>-></span>leftJoin<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>-></span>where-><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>-></span>all();</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
其中where语句较为复杂:
where(‘in’,’id’,$array
)或where(‘id’=>$array
)
具体可以查看http://www.yiichina.com/doc/guide/2.0/db-query-builder中对where方法的解析。
11.自定义函数
yii里面自定义函数可以在vendor/yiisoft/yii2/helpers/文件夹里,新建一个XXX.php文件,然后定义一个自定义类,再定义静态方法YYY()。
使用时应用基命名空间,use yii\helpers\XXX,然后用类来引用基静态方法XXX::YYY()
12.关联模型
yii里面的关联模型,用来在取得当前表内的一条记录时,会取出对应表的记录。如A表内每取出一条信息,也取出B表中跟A表对应有信息,在ModelA里定义一个getBtable方法
<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">getBtable</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span> {</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span>->hasOne/hasMany(Btable::className,[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'bid'</span>=><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'aid'</span>]); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>
查询时可以使用joinWith('Btable')->find();
会在查找时查找其关联对象;也可以使用$this->find()
等方法结果对象
使用$res->btable
来直接引用对象。
使用$res[n]->btable->attr
来引用B表的对应属性。
13.使用ActiveForm创建表单
yii2中使用小部件创建view视图的步骤: 设置一个Model设置其属性
<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$username</span>: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$password</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
设置其rule或场景等
<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">rules</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>{</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [ [[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'username'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'password'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'conpass'</span>], <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'required'</span>], [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'conpass'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'password'</span>, ]; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
设置其label
<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">attributeLabels</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>{</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [ <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'username'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'管理员'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'password'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'密码'</span>, ]; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
然后在controller中将model的实例渲染进去:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">$this->render('index',['model'=>(new Model/ActiveRecord)]) //最后在页面中使用ActiveForm use yii\widgets\ActiveForm; <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$form</span> = ActiveForm::begin([ <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'action'</span> => [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'log/login'</span>], <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'method'</span>=><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'post'</span> ]); <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span> <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?</span>= <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$form</span>->field(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$model</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'username'</span>) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span> <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?</span>= <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$form</span>->field(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$model</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'password'</span>) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">div</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">class</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"form-group"</span>></span> <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?</span>= Html::submitButton(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Submit'</span>, [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'class'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'btn btn-primary'</span>]) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">div</span>></span> <span class="php" style="box-sizing: border-box;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?php</span> ActiveForm::end(); <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="box-sizing: border-box; position: absolute; height: 60px; right: 30px; top: 5px; font-size: 14px; color: rgb(255, 255, 255); cursor: pointer; z-index: 2;"> </div><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>
14.使用验证码
在controller中设置验证码的独立方法
<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">actions</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span> {</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [ <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'captcha'</span> => [ <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'class'</span> => <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'yii\captcha\CaptchaAction'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'height'</span> => <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">50</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'width'</span> => <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'minLength'</span> => <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxLength'</span> => <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> ], ]; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>
在model里设置rule和label,label同上
<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span> <span class="hljs-title" style="box-sizing: border-box;">rules</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>{</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'verifyCode'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'captcha'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'captchaAction'</span>=><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'admin/log/captcha'</span>],]; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
(captchaAction要设置为controller中的位置,如果自定义module要设置module) 在view中使用
<code class="hljs php has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">use</span> <span class="hljs-title" style="box-sizing: border-box;">yii</span>\<span class="hljs-title" style="box-sizing: border-box;">captcha</span>\<span class="hljs-title" style="box-sizing: border-box;">Captcha</span>; <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"><?</span>= <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$form</span>->field(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$model</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'verifyCode'</span>)->widget(Captcha::className(), [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'captchaAction'</span>=><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'log/captcha'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'imageOptions'</span>=> [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'alt'</span>=><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'点击换图'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'style'</span>=><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'cursor:pointer'</span>] ]) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">?></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
15.视图中块的使用
块内容在$this->beginBlock(['id'=>xxx])
和$this->endBlock()
之间定义,在layout中使用$view->block[id]
来引用。可以在完成向模板中导入视图数据。
也可以定义$this->var=xxx;
在layout中用$this->var
来引用。
16.更新和删除
更新
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//查找到一条结果</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$res</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>find()<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">where</span>()<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>one(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//对结果修改</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$res</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>attr<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'xxx'</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//执行更新操作</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$res</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>update(); 删除 <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//删除一条数据</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>findOne(<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$id</span>)<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>delete(); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//删除所有符合条件的数据</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$this</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>deleteAll(<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">[</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">where</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">]</span><span class="hljs-markup" style="box-sizing: border-box;">);</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>
注意和窍门
1.URL模块间跳转
在模块中用Url::to()方法创建URL时,会自动在前面添加模块名,导致无法跳转到其他模块,我们可以在字符串前添加’//’符来返回根模块,例如Url::to([‘//index/index’])表示跳转到初始地址。
2.初始化变量
想在控制器中每一个操作前,初始化一个变量的话不要重写__construct构造函数,因为它需要传入各种变量。最好重写beforeAction()函数,它会在执行每一个action时都执行一下。
并且注意:方法的最后一定要添加return true语句。
3.在JS中使用YII的变量
若想在JS中使用YII的URL变量等,可以使用html中的script标签,将变量在第一次渲染视图时预先解析出来,将下面代码放在需要使用变量的地方之前。
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">script</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">type</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"text/javascript"</span>></span><span class="javascript" style="box-sizing: border-box;"> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> key=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<?=Url::to(['xxx/xxx']) ?>"</span> </span><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">script</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
然后在JS文件中正常使用。
4.全局常量的定义
我们可以在config文件夹中的params.php中定义全局常量。
然后在脚本中用Yii::$app->params[‘key’]来引用。
5.yii模型属性转数组
YII用toArray()方法可以将模型的属性转换为数组进行输出,可独立使用,也可以在查询时用连续操作方式使用。
6.在使用controller渲染view页面时
一定要在render前加echo或return 写作echo/return $this->render('view',$data);
7.yii中的属性,谨记!
在ActiveForm中如果数据表中有了此字段,就不要再用public声明一个属性了,会导致attribute无法赋值。。。。(血泪)。