摘要:文章创建create方法的实现:文章创建保存会涉及到多张表,为保证数据的完整性采用事务。
1、文章创建create方法的实现:
/** * 创建文章 * 文章创建保存会涉及到多张表,为保证数据的完整性采用事务 */ public function create() { //开启事务 $transaction = Yii::$app->db->beginTransaction(); try{ $model = new PostsModel(); $model -> setAttributes($this->attributes); $model -> summary = $this->_getSummary(); $model -> user_id = Yii::$app->user->identity->id; $model -> user_name = Yii::$app->user->identity->username; $model -> is_valid = PostsModel::IS_VALID; $model -> created_at = time(); $model -> updated_at = time(); if (!$model->save()) throw new Exception('文章保存失败!'); $this -> id = $model->id; //文章创建成功以后调用的事件 //获取事件数据传递给事件 $data=array_merge($this->getAttributes(),$model->getAttributes()); $this -> _eventAfterCreate($data); $transaction -> commit(); return true; }catch (Exception $e){ $transaction->rollBack(); $this->_lastError = $e -> getMessage(); return false; } }
2、设置文章发布状态常量
const IS_VALID = 1; //发布 const NO_VALID = 0; //未发布
3、文章摘要截取方法的实现
/** * 截取文章摘要 * @param int $s 起始位置 * @param int $e 结束位置 * @param string $char * @return string|null */ public function _getSummary($s=0,$e=90,$char='utf-8') { if (empty($this->content)) return null; return (mb_substr(str_replace(' ','',strip_tags($this->content)),$s,$e,$char)); }
4、定义文章创建成功后的事件常量
const EVENT_AFTER_CREATE = "evenAfterCreate"; const EVENT_AFTER_UPDATE = "evenAfterUpdate";
5、给文章创建后的调用事件绑定事件
/** * 文章创建成功后调用事件 */ public function _eventAfterCreate($data) { //添加绑定事件 $this->on(self::EVENT_AFTER_CREATE,[$this,'_eventAddTag'],$data); //触发事件 $this->trigger(self::EVENT_AFTER_CREATE); }
文章创建create方法基本实现,更多的细节请看后续教程文章。
到这里可以先创建一篇文章测试下,发布文章后的跳转页面如果是这样的(id后面的参数可以不一样),说明没有问题。
如提示文章保存失败,请检查下PostsModel中的rules规则,看是否如下图中红色下划线标注的那样,如果是请把'string改成'integer',因为我们设置的is_valid的常量值是整形,不是字符型。
如果是其他问题,那就要好好检查代码了。
【提示】为了安全考虑,以及yii2 form表单提交验证机制创建发布文章需要在登录状态下才可以完成,也就是说要登录后才可以发布文章,否则会报错。文章登录验证的具体实现方法可以参考《YII2博客发布文章登录验证设置》这篇文章。