性感的农民
- 性感的农民 赞了回答
beforeAction返回的应该是true或者false,要直接输出的话,应该还是返回false,通过response指定输出的内容,类似这样
Yii::$app->response->format = Response::FORMAT_JSON; Yii::$app->response->data = array( 'status' => -1, 'message' => '请先登录', 'url' => \Yii::$app->getHomeUrl() ); return false;
- 性感的农民 2015-05-26 已签到连续签到16天,获得了20个金钱
updateAll()
只返回受影响的行数,那个行数在一个事件里能玩出什么名堂呢?所以afterUpdate对于updateAll来说没有任何意义。你想干什么,就在调用updateAll()
之后调用一个函数就好了,或者触发一个自定义的事件。比较update()和updateAll()的区别。或者看这两个函数的框架源码。
呵呵,不要纠结分的事情,能帮到人也是很开心的。之前我就和舰长说不好意思再答题了,大家一起玩才好玩嘛。
函数就不用说了吧。下面贴一点我原来学习Event用的代码片段你参考一下吧:
1
定义Event派生类
。你要传参给事件句柄才需要这个类,不传参时trigger函数的Event使用缺省值null(第二个参数)。<?php namespace app\modules\advertise\components; use yii\base\Event; class CrudEvent extends Event { public $id; }
2
定义事件句柄
,就是事件被触发之后执行的函数,本例是写成一个杂项类Misc的静态方法:namespace common\helpers; ...... public static function addCustomer($event) { $id = $event->id; die("addCustomer, id: $id"); } public static function delCustomer($event) { $id = $event->id; die("delCustomer, id: $id"); }
3
定义事件名称,并与事件句柄绑定
:事件名称,通常是写成类的const属性,大写。本例写在控制器中,并重载beforeAction函数,绑定“事件名称”和“事件句柄”use app\modules\advertise\components\CrudEvent; #上面的事件类 ...... const EVENT_ADDCUSTOMER = 'add-customer'; #用户添加了客户,该用户的客户总数+1 const EVENT_DELCUSTOMER = 'del-customer'; #用户删除了客户,该用户的客户总数-1 ...... /** * @inheritdoc */ public function beforeAction($action) { if (parent::beforeAction($action)) { $this->on(self::EVENT_ADDCUSTOMER, ['common\helpers\Misc','addCustomer']); $this->on(self::EVENT_DELCUSTOMER, ['common\helpers\Misc','delCustomer']); return true; } else { return false; } }
4
触发事件
。本例是在控制器的actionCreate中测试的,按照MVC的思想,放在Model的afterSave方法中更好。$this->trigger(self::EVENT_ADDCUSTOMER, new CrudEvent(['id'=>$id]));
5
测试
。添加记录后看到浏览器显示addCustomer, id: 2
,就说明trigger成功了。fileinput
是个例外,无论insert
操作还是update
,正常情况在表单中选择文件的地方是清空的,可能是w3c的定义。你也可以在接收POST数据之前
保存文件路径的字段的值,接收post数据之后
如果发现浏览器没有新文件upload,那么save
之前还原你之前保存的值即可。你的方法也可以,有个负面影响就是用户体验会下降一些,和正常的文件上传表单感觉不一样。
- 性感的农民 回答了问题 关于updateAll之后事件触发的问题
updateAll()
只返回受影响的行数,那个行数在一个事件里能玩出什么名堂呢?所以afterUpdate对于updateAll来说没有任何意义。你想干什么,就在调用updateAll()
之后调用一个函数就好了,或者触发一个自定义的事件。比较update()和updateAll()的区别。或者看这两个函数的框架源码。
- 性感的农民 回答了问题 关于服务器端防止短时间内重复提交的问题
可能的原因是
unset($session[$sessionKey]);
在你的第二次POST请求到达之前就执行了,所以session机制不好使。如果在不用unique规则、不用table的key冲突、也不用js屏蔽button的前提下,想在服务器端避免重复insert,可以在book中重载ActiveRecord的beforeSave方法,在里面查重,根据情况返回true/false。