Yii框架与项目
第一部分:需求
第二部分:初始Yii2
2.1結(jié)構(gòu)
2.2生命周期
上半部分創(chuàng)建了一個(gè)應(yīng)用主體,應(yīng)用主體明確了由哪個(gè)控制器去接管后面的工作。
第1步,發(fā)出url后,apache會(huì)執(zhí)行index.php這個(gè)文件,在Yii框架中,這個(gè)文件叫入口文件。
這個(gè)文件在web目錄下,執(zhí)行此文件件主要做2件事:
1. 讀取配置文件web.php
2. 配置文件的數(shù)據(jù)來(lái)實(shí)例化這個(gè)應(yīng)用主體。
應(yīng)用主體會(huì)控制接下來(lái)的整個(gè)生命周期,直到響應(yīng)出結(jié)果。應(yīng)用實(shí)體具體是什么,稍后詳
解。
第2步,應(yīng)?實(shí)體接下來(lái)要進(jìn)?路由解析,路由解析就是是根據(jù)url中的參數(shù)r, 來(lái)決定由哪些
代碼來(lái)完成用戶的請(qǐng)求。這一步先取得r的值。
第三步,在請(qǐng)求組件的幫助下,解析出路由。這個(gè)例?解析的結(jié)果就是要?jiǎng)?chuàng)建?個(gè)叫
SiteController的控制器的實(shí)例,并且執(zhí)行里面的actionIndex?法
?
2.3入口文件
? 定義全局常量;
? 注冊(cè) Composer 自動(dòng)加載器;
? 包含 Yii 類文件;
? 加載應(yīng)用配置;
? 創(chuàng)建這個(gè)應(yīng)用實(shí)例并配置;
? 調(diào)?用yii\base\Application::run() 來(lái)處理請(qǐng)求。
2.4應(yīng)用主體
應(yīng)用主體是通過(guò)index.php進(jìn)行生成的
<html lang="<?= Yii::$app->language ?>”>
Yii::$app->user->identity->username
Yii::$app->homeUrl
Yii::$app->charset
basePath :指定該應(yīng)用的根目錄
aliases :用一個(gè)數(shù)組定義多個(gè) 別名。數(shù)組的key為別名名稱,值為對(duì)應(yīng)的路徑。
components :這是最重要的屬性,它允許你注冊(cè)多個(gè)在其他地方使用的的應(yīng)用組件.
defaultRoute :該屬性指定缺省的路由規(guī)則,’defaultRoute’=>'site/about'
第三部分:控制器
3.1初識(shí)
3.2小知識(shí)
?控制器從yii\web\Controller類繼承來(lái)
$this是控制器對(duì)象本身,調(diào)的render(中文的意思是著色的意思)法(相當(dāng)于TP中的assign)
第四部分:視圖
4.1初識(shí)
4.2布局
第五部分:模型
5.1初識(shí)
5.2流程
5.3函數(shù)解釋
refresh就是讓頁(yè)面進(jìn)行刷新一次
5.4表單
- 中間是通過(guò)調(diào)用ActiveForm::field() 方法來(lái)創(chuàng)建這個(gè)ActiveField 實(shí)例,這個(gè)實(shí)例會(huì)創(chuàng)建表單的input標(biāo)簽和JavaScript 驗(yàn)證。
- ActiveField有對(duì)應(yīng)的模型和屬性,input 輸入框的 name 屬性會(huì)自動(dòng)地根據(jù)屬性名來(lái)創(chuàng)建;同時(shí),還會(huì)用屬性的驗(yàn)證規(guī)則(由js進(jìn)行驗(yàn)證)來(lái)驗(yàn)證用戶輸入的數(shù)據(jù)。
- ActiveField如何進(jìn)行使用,就要參考手冊(cè)<?= $form->field($model,'email')?>
5.5塊賦值
表單生成的input中的name,實(shí)際是以對(duì)象名來(lái)命名的這個(gè)數(shù)組,數(shù)組的鍵和模型的屬性對(duì)應(yīng),提交的數(shù)據(jù)就是鍵對(duì)應(yīng)的值。 在模型那邊執(zhí)行l(wèi)oad方法,其實(shí)就是對(duì)每個(gè)屬性執(zhí)行這樣語(yǔ)句賦值: $model->name = isset($data['name']) ? $data['name'] : null;5.6助手類HTML
前面按鈕的例子,就是用純html寫(xiě)就這樣。也可以用html 幫助類的submitButton方法來(lái)寫(xiě)。前面得div里面的
第六部分:博客原型
6.1別名
6.2配置文件
箭頭后面的是權(quán)利大的,不會(huì)被覆蓋掉,前面得會(huì)被覆蓋掉
6.3需求分析
?
6.4表結(jié)構(gòu)
分析表結(jié)構(gòu):
post表:對(duì)應(yīng)adminuser外鍵與poststatus外鍵
comment表:對(duì)應(yīng)commitstatus外鍵、user_id外鍵與post_id外鍵
tag表:單獨(dú)的tag標(biāo)簽用于記錄標(biāo)簽云
migration表:系統(tǒng)的yii自己產(chǎn)生的表
6.5Gii
6.5.1概念
Gii 是一個(gè)基于Web的代碼生成器,可以用來(lái)生成模型,控制器,表單,增刪查改等等這些
類或功能的代碼。Gii也叫腳手架程序,是一種輔助工具。
6.5.2配置
首先,要在配置main-local.php,配置Gii模塊開(kāi)啟,我們只要在瀏覽器上輸入這個(gè)網(wǎng)址,注意參數(shù) r=gii,這樣就可以使用Gii了。
6.5.3作用
Gil是可以個(gè)可以幫你寫(xiě)代碼的神奇工具。可以用來(lái)生成模型,增刪查改,控制器,表單,
模塊,擴(kuò)展這些代碼。
6.5.4模型類
1. 首先要我們填寫(xiě)數(shù)據(jù)庫(kù)表名,我們先創(chuàng)建文章的模型類,文章的表名是post, 2. 然后是模型類的類名,我們命名為post。 3. 然后是命名空間,這個(gè)是用common/models,因?yàn)檫@個(gè)類是前后臺(tái)共用的。 4. 其他的都用默認(rèn)值就可以了。 5. 點(diǎn)preview,預(yù)覽這個(gè)按鈕后,告訴你,將會(huì)在common/models這個(gè)目錄下生成Post.php的模型?件。 6. 可以點(diǎn)開(kāi)來(lái)粗略看看?件的內(nèi)容,這些就模型類的代碼。 7. 沒(méi)有問(wèn)題就可以點(diǎn)“生成“這個(gè)按鈕,告訴你已經(jīng)成功生成了Post模型?件。模型文件主要包括以下內(nèi)容:
1.屬性:有屬性,屬性標(biāo)簽,數(shù)據(jù)規(guī)則,塊賦值這些東西。在ActiveRecord這塊也不會(huì)少,這些就是所謂的業(yè)務(wù)數(shù)據(jù)---屬性。
2.業(yè)務(wù)規(guī)則:模型類的業(yè)務(wù)規(guī)則,業(yè)務(wù)數(shù)據(jù)有些是必填項(xiàng),有些必須為字符串,有些字段必須為整數(shù)。title這些要求是字符串,并且不能超過(guò)128個(gè)字符。
3.屬性標(biāo)簽:
4.業(yè)務(wù)邏輯:其它幾個(gè)方法就是業(yè)務(wù)邏輯。里面用到的hasmany hasone這些?法,都是ActiveRecord這
個(gè)類提供的方法
6.5.5增刪改查
1.進(jìn)行增刪查改的代碼生成頁(yè)面,先要輸入模型類的類名,注意要把命名空間寫(xiě)全。先從文章Post開(kāi)始。 2.還要生成一個(gè)PostSearch這個(gè)類,這個(gè)類是用來(lái)進(jìn)文章搜索的,我們?cè)诤笈_(tái)完善文章管理那一章會(huì)詳細(xì)分析這個(gè)類。 3.接下來(lái)是控制器類,注意增刪查改功能是后臺(tái)的功能,我們把它放到backend目錄下的controllers目錄里面,類 名設(shè)為PostController。 4.再下來(lái),這里填寫(xiě)視圖模板文件存放的目錄。@app指的是當(dāng)前應(yīng)用的根目錄,注意這斜杠的方向,和命名空間是有區(qū)別的。 5.點(diǎn)預(yù)覽,可以看到,將要生成一堆文件。?
第七部分:后臺(tái)功能完善
7.1文章查看一(連接數(shù)據(jù)庫(kù))
7.1.1代碼展示
1.文章查看控制器動(dòng)作
public function actionView($id) {return $this->render('view', ['model' => $this->findModel($id),]); }7.2文章查看模型動(dòng)作
protected function findModel($id) {if (($model = post::findOne($id)) !== null) {return $model;} else {throw new NotFoundHttpException('The requested page does not exist.');} }7.1.2使用數(shù)據(jù)庫(kù)
1.定義:
2.使用yii\db\Connection鏈接
?這段代碼表示會(huì)創(chuàng)建一個(gè) yii\db\Connection 對(duì)象,并用這個(gè)對(duì)象來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。
3.使用yii\db\Command訪問(wèn)與操作
他的缺點(diǎn)也很明顯:
1. 不同數(shù)據(jù)庫(kù)系統(tǒng)的SQL語(yǔ)句會(huì)有些差別,因此無(wú)法做到代碼適用于多種數(shù)據(jù)庫(kù)系統(tǒng)。
2. 用數(shù)組保存結(jié)果,而沒(méi)有用到面向?qū)ο蟮姆绞絹?lái)管理數(shù)據(jù),這樣就失去了許多面向?qū)ο?br /> 開(kāi)發(fā)的好處。
3. 不安全,如果不小心,會(huì)留下SQL注入這種不安全的因素,比如你不是通過(guò)綁定,而是直
Yii通過(guò)數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象(Database Access Objects,簡(jiǎn)稱DAO)來(lái)使用數(shù)據(jù)庫(kù)。DAO是建立在 PDO 之上的,一套面向?qū)ο蟮姆绞絹?lái)訪問(wèn)數(shù)據(jù)庫(kù)的API。
我們之前連接數(shù)據(jù)庫(kù),就是在main-local配置文件中,這樣寫(xiě)就可以連上數(shù)據(jù)庫(kù)。
?這個(gè)對(duì)象的寫(xiě)法: Yii::$app->db,等下查詢數(shù)據(jù)時(shí)就會(huì)用到這個(gè)對(duì)象。
?
?
接把$_GET[‘id’]寫(xiě)到sql語(yǔ)句中,那么就危險(xiǎn)了。
7.2文章查看二ActiveRecord
7.2.1什么是ActiveRecord
Active Record (活動(dòng)記錄,以下簡(jiǎn)稱AR)提供了1個(gè)面向?qū)ο蟮慕涌?#xff0c; 用以訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
? 1個(gè) AR 類關(guān)聯(lián)1張數(shù)據(jù)表,每個(gè) AR 對(duì)象對(duì)應(yīng)表中的一行。
? AR對(duì)象的屬性,對(duì)應(yīng)為數(shù)據(jù)標(biāo)的列
? 可以直接以面向?qū)ο蟮姆绞絹?lái)操縱數(shù)據(jù)表中的數(shù)據(jù),這樣就不需要寫(xiě)SQL語(yǔ)句就能實(shí)現(xiàn)數(shù)
據(jù)庫(kù)的訪問(wèn)。
7.2.2聲明ActiveRecord 類
來(lái)看看post類,要聲明1個(gè) AR 類,最少,你需要從 yii\db\ActiveRecord 基類來(lái)繼承, 并
且要實(shí)現(xiàn) tableName 的方法,明確這個(gè)AR類的屬性是關(guān)聯(lián)哪張數(shù)據(jù)表。這樣就已經(jīng)聲明了1
個(gè)最基本的AR類。當(dāng)然,1個(gè)完整的AR類還應(yīng)該有屬性標(biāo)簽,數(shù)據(jù)規(guī)則,業(yè)務(wù)代碼這些內(nèi)
容。
我們來(lái)把post表簡(jiǎn)化一下,比如,只有4個(gè)字段,id是主關(guān)鍵字。 我們只需要實(shí)現(xiàn)Post類中
的tablename方法,就已經(jīng)建立好對(duì)應(yīng)post這個(gè)數(shù)據(jù)庫(kù)表的AR類,類名也是Post。
7.2.3如何查詢數(shù)據(jù)
兩種方法: AR 提供了兩個(gè)靜態(tài)方法來(lái)構(gòu)建 DB 查詢,并且把查詢到的數(shù)據(jù)填充到 AR 對(duì)象實(shí)例中,最 后返回這個(gè)對(duì)象。 這兩個(gè)方法,1個(gè)是find,1個(gè)是findBySql: yii\db\ActiveRecord::find() yii\db\ActiveRecord::findBySql()7.2.4find方法
? ? ? ??第1點(diǎn),ActiveRecord方法有兩個(gè)快捷方法:findOne 和 findAll,可以來(lái)替換find方法。
? ? ? ??第2點(diǎn),可以看出,例子中的兩個(gè)查詢條件是比較簡(jiǎn)單的,我們實(shí)際開(kāi)發(fā)中很多時(shí)候會(huì)遇到
更為復(fù)雜的查詢條件。
? ? ? ??find方法是創(chuàng)建1個(gè)ActiveQueryInterface實(shí)例對(duì)象來(lái)實(shí)現(xiàn)查詢的。這個(gè)創(chuàng)建好的ActiveQueryInterface對(duì)象,需要進(jìn)1步調(diào)用ActiveQueryInterface中已經(jīng)定義好的方法來(lái)設(shè)置查詢條件,最后才通過(guò)調(diào)用one或all方法來(lái)得到AR對(duì)象。 ??
例子 $posts = Post::find()->where(['AND',['status' => 2],['author_id' => 1],['Like','title','yii2']]) ->orderBy(‘id')->all();7.2.5findbysql() 查詢數(shù)據(jù)
? ? ? ??command對(duì)象來(lái)查詢非常類似,都是要寫(xiě)SQL,但是這個(gè)返回的是對(duì)象,而command返回的是數(shù)組。?
7.2.6ActiveRecord? ? ??
7.2.7ActiveRecord如何操作數(shù)據(jù)
? ? ?訪問(wèn)列數(shù)據(jù)
? ? ??find方法得到model對(duì)象后,使用model->id就可以讀出id這個(gè)列的值,這個(gè)的id和title就是數(shù)據(jù)表的列名。
注意,如果返回的是對(duì)象數(shù)組時(shí),我們應(yīng)該使用foreach來(lái)遍歷每個(gè)對(duì)象。
7.2.8操作數(shù)據(jù)
? ? ??AR 提供下面這些方法來(lái)實(shí)現(xiàn)插入、更新和刪除等功能:
? ? ? yii\db\ActiveRecord::save() ? ? ? ?yii\db\ActiveRecord::insert()
? ? ? yii\db\ActiveRecord::update() ? ?yii\db\ActiveRecord::delete()
? ? ??save方法可以用來(lái)替代insert和update方法。
? ? ??ActiveRecord可以說(shuō)是Yii框架的靈魂,它把數(shù)據(jù)庫(kù)和模型建立了聯(lián)系,使用面向?qū)ο蟮姆绞絹?lái)操縱數(shù)據(jù)表中的數(shù)據(jù),一個(gè) AR 類關(guān)聯(lián)一張數(shù)據(jù)表,每個(gè) AR 對(duì)象對(duì)應(yīng)表中的一行。關(guān)于ActiveRecord的知識(shí)還不止這些,我們后面還會(huì)不斷補(bǔ)充。
7.3文章查看三拼接數(shù)據(jù)表
7.3.1數(shù)據(jù)小部件
? ? ? ??顧名思義,數(shù)據(jù)小部件用來(lái)顯示數(shù)據(jù)的小模塊。 常用的小部件有DetailView,ListView。
? ? ? ? DetailView:主要用來(lái)顯示1條記錄數(shù)據(jù)的詳細(xì)情況。
? ? ? ? ListView 和 GridView:他們可以用來(lái)顯示1個(gè)擁有分頁(yè)、 排序和過(guò)濾功能的1組數(shù)據(jù)。
?
7.3.2DetailView數(shù)據(jù)小部件
DetailView小部件通常用來(lái)顯示的是一條記錄的詳情。
?
?
7.3.3關(guān)聯(lián)表查詢
看看代碼,在Post文章類中,只要實(shí)現(xiàn)一個(gè)叫g(shù)etStatus0的方法,就可以建立起兩張表的關(guān)聯(lián)關(guān)系了,getStatus0方法的返回值是執(zhí)行文章對(duì)象本身的hasone方法的結(jié)果,hasone方法參數(shù)中第1項(xiàng)Poststatus::className()就是文章?tīng)顟B(tài)表的表名,第2項(xiàng)是關(guān)聯(lián)的條件,這是poststatus表里面id字段等于Post表中的status字段。
這段代碼就是建立文章章類和文章?tīng)顟B(tài)類的關(guān)聯(lián)關(guān)系。
代碼思路: 這樣的話,我們要拿到“已發(fā)布”這個(gè)?字,就可以了 $thePost->status0->name 這種形式來(lái)拿到了。 $model->status0相當(dāng)于1個(gè) poststatus文章?tīng)顟B(tài)的對(duì)象, 然后取它的name屬性值,就可以了。7.3.4多對(duì)一 一對(duì)多
這里的hasOne方法,因?yàn)槲恼聦?duì)于文章?tīng)顟B(tài)來(lái)說(shuō),是多對(duì)一 一對(duì)一的關(guān)系。
這里的hasMany方法,因?yàn)槲恼聦?duì)于文章評(píng)論來(lái)說(shuō),是一對(duì)多的關(guān)系。
7.3.5圖表展示
一個(gè)拼接的完整過(guò)程
7.4文章查看四
7.4.1日期格式的修改
[ 'attribute'=>'create_time', 'value'=>date("Y-m-d H:i:s",$model->create_time), ]? ? ?detailview的template屬性可以調(diào)節(jié)小部件中一行的模板,我們可以設(shè)置th標(biāo)簽的屬性來(lái)改變這一列的寬度。
7.5修改頁(yè)面一:查詢數(shù)據(jù)
7.5.1下拉菜單(AR的find方法,command對(duì)象方法, QueryBuilder)
ActiveForm讓表單和模型結(jié)合起來(lái),充分利用了模型的數(shù)據(jù)規(guī)則,讓表單的驗(yàn)證代碼幾乎不
用寫(xiě)。同時(shí),activefield簡(jiǎn)化了表單input元素的編寫(xiě),極大的減輕了表單開(kāi)發(fā)工作量,
同時(shí)讓表單代碼的可讀性和可維護(hù)性提高。
第二種方法:
使用command對(duì)象來(lái)取數(shù)據(jù)。 $sts = Yii::$app->db->createCommand('SELECT id,name FROM poststatus')- >queryAll(); command對(duì)象執(zhí)行查詢后返回的是多維數(shù)組,同樣可以用arrayhelper的map靜態(tài)方法來(lái)轉(zhuǎn)換,這就得到鍵值對(duì)數(shù)組作參數(shù)。 刷新看到,也是我們需要的下拉菜單。第三種方法:
querybuilder查詢構(gòu)建器是建在 DAO 基礎(chǔ)上,這樣創(chuàng)建的SQL語(yǔ)句,比原生SQL語(yǔ)句更易讀、更安全。
7.5.2?數(shù)組助手類 Array Helper
里面含有的方法:
獲取值getValue ? ? ? ?獲取值
獲取列g(shù)etColumn ? ?從多維數(shù)組或?qū)ο髷?shù)組中獲取某列的值
????????建立映射表map ? ? ? ?map方法可以從一個(gè)多維數(shù)組或1個(gè)對(duì)象數(shù)組中取出數(shù)據(jù),建1個(gè)新映射表
command對(duì)象執(zhí)行查詢后返回的是多維數(shù)組,同樣可以用arrayhelper的map靜態(tài)方法來(lái)轉(zhuǎn)
換,這里就得到鍵值對(duì)數(shù)組作參數(shù)。
7.5.3QueryBuilder
總得思路: 第1步是構(gòu)建查詢,首先創(chuàng)建1個(gè) yii\db\Query 對(duì)象來(lái)代表1條 SELECT SQL 語(yǔ)句, 然后通過(guò)調(diào)用一套可以串起來(lái)的方法,比如select方法,from方法,where方法等這些方法,構(gòu)建出可以滿足指定要求的查詢條件。 第2步是執(zhí)行查詢,執(zhí)行Query 構(gòu)建出來(lái)的查詢條件,可以執(zhí)行的查詢方法有很多,比如 有all方法取出所有數(shù)據(jù),one方法取第1條數(shù)據(jù),column方法取第1列數(shù)據(jù)等等7.5.4相關(guān)函數(shù)
select方法是用來(lái)指定要取哪些字段,代表要取id和email2個(gè)字段的值,還可用addSelect方法來(lái)附加字段
from來(lái)指定要從哪張表拿數(shù)據(jù)
where方法用來(lái)設(shè)定查詢條件,寫(xiě)法也靈活,可以字符串形式,鍵值對(duì)數(shù)組形式,也可以是操作符形式
orderby,可以用鍵值對(duì)數(shù)組的鍵來(lái)表示需要排序的字段,其值來(lái)設(shè)定升序或降序
limit和offset的寫(xiě)法,比如:從第20條開(kāi)始取數(shù),取10條記錄
indexBy:indexBy(id)來(lái)讓id這一列的值作為索引值,也就是數(shù)組的鍵。
groupBy having:可以用addgroup添加分組字段,having用來(lái)設(shè)置分組過(guò)濾的條件,可以用andHaving() orHaving() 來(lái)添加條件。
join用來(lái)做表的連接查詢,比如這條sql語(yǔ)句,可以寫(xiě)成這樣。在參數(shù)設(shè)定了連接類型,還有
連接表,連接條件,如果需要的話,這里還有連接條件的參數(shù)綁定,這是為了預(yù)防sql注入的。
union用來(lái)聯(lián)合2個(gè)不同的查詢。
all()方法執(zhí)行后,可以得到多個(gè)多維數(shù)組,第1維是1個(gè)普通的索引數(shù)組,每1
項(xiàng)對(duì)應(yīng)從數(shù)據(jù)表中查詢出來(lái)的一行。這些行就是第2維,是一個(gè)由字段名和值構(gòu)成的鍵值對(duì)
數(shù)組。
one()把a(bǔ)ll換成one() 方法看看,這里返回的是第1條記錄,這里就不是1個(gè)多維數(shù)組,只是1個(gè)鍵值對(duì)數(shù)組。
column(),返回的是1個(gè)索引數(shù)組,由數(shù)據(jù)庫(kù)中的第1列數(shù)據(jù)組成。scalar(),返回第1行第1列的數(shù)據(jù),這是個(gè)字符串。
count(),返回記錄條數(shù),是1個(gè)整數(shù)。
7.5.5三種方法對(duì)比
AR的find方法,本質(zhì)上也是用查詢構(gòu)建器來(lái)構(gòu)建查詢,返回的是對(duì)象.
Command對(duì)象:返回?cái)?shù)組
Query對(duì)象:可程序化構(gòu)建,DBMS無(wú)關(guān),易讀,更安全,他的返回值是多個(gè)多維數(shù)組。
7.6修改頁(yè)面二
7.6.1新建修改時(shí)間方法一
方法一:當(dāng)文章改提交后,就會(huì)看到最后修改時(shí)間確實(shí)就是當(dāng)前時(shí)間,沒(méi)問(wèn)題。新
增文章也一樣,實(shí)例化出文章對(duì)象model后,我們只要先把對(duì)象的createtime和updatetime
兩個(gè)屬性,都賦值為當(dāng)前時(shí)間就可以了。
7.6.2新建修改時(shí)間方法二
AR的生命周期
?
對(duì)新增時(shí)間和修改時(shí)間的設(shè)置,最合適的地方法就是beforeSave()這個(gè)方法,在提交的數(shù)據(jù)保存之前,把這個(gè)2個(gè)值設(shè)好,就實(shí)現(xiàn)了時(shí)間的自動(dòng)設(shè)置。
來(lái)代碼中看看如何重寫(xiě)beforeSave方法: public function beforeSave($insert) $instert 是來(lái)區(qū)別對(duì)象的記錄寫(xiě)?數(shù)據(jù)庫(kù)時(shí),是新增還是修改。 if (parent::beforeSave($insert)) { 一定要先調(diào)用父類的beforeSave方法,保證這個(gè)方法原有的代碼先被執(zhí)行,然后再執(zhí)行 我們寫(xiě)的代碼。 $this->create_time=time();$this->update_time=time(); 新增的時(shí)候,2個(gè)時(shí)間都賦值,這2句只會(huì)在新增時(shí)被執(zhí)行一次。 else $this->update_time=time(); 以后發(fā)生修改,只會(huì)改變最后修改時(shí)間。 這樣就完成了修改。7.6.3AR的其他方法
7.7頁(yè)面修改三
7.7.1tags的修改的需求
需求:
當(dāng)這篇文章新增到數(shù)據(jù)庫(kù)以后,這張表的數(shù)據(jù)就會(huì)發(fā)生變化,先看看表中有沒(méi)有yii2這個(gè)標(biāo)簽,
有的話就加1,再看看第2個(gè)標(biāo)簽“小部件”,也有,就加1. 再看看第三個(gè)widget,發(fā)現(xiàn)表中沒(méi)
有這個(gè)標(biāo)簽,那么就新增一條記錄。
7.7.2tags修改思路
7.7.3updateFrequency的調(diào)用
7.8管理頁(yè)面完善一
7.8.1管理頁(yè)面需求
PostSearch搜索類DataProvider數(shù)據(jù)提供者GridView數(shù)據(jù)小部件
7.8.2GridView數(shù)據(jù)小部件
???要?jiǎng)?chuàng)建一個(gè)GridView,也是通過(guò)一個(gè)鍵值對(duì)數(shù)組來(lái)進(jìn)行配置的,鍵值對(duì)包括:
????? dataProvider 鍵指定提供數(shù)據(jù)的數(shù)據(jù)提供者。
????? filterModel 鍵指定一個(gè)能夠提供搜索過(guò)濾功能的搜索模型類。
????? columns 鍵來(lái)指定需要展示的列,以及展示的格式
7.8.3GridView之columns
????? 序號(hào)列類: 用來(lái)產(chǎn)生行號(hào)的,從 1 起始并自動(dòng)增加;
????? 數(shù)據(jù)列: 用于顯示數(shù)據(jù)
????? 動(dòng)作列: 顯示動(dòng)作按鈕,如查看、更新、刪除操作,我們講到評(píng)論管理的時(shí)候,會(huì)增加一個(gè)審核的按鈕,到時(shí)會(huì)詳細(xì)介紹動(dòng)作列這個(gè)類。
????? 復(fù)選框列: 用來(lái)顯示一個(gè)復(fù)選框列
7.8.3.1columns之?dāng)?shù)據(jù)列
這里列出了幾個(gè)經(jīng)常改動(dòng)的鍵, attribute 指定需要展示的屬性 label 標(biāo)簽名 value 值 format 格式 filter 自定義過(guò)濾條件的輸入框 contentOptions 設(shè)定數(shù)據(jù)列的HTML屬性7.8.4ActiveDataProvider
? 可以獲取數(shù)據(jù),并提供給其他組件或頁(yè)面使用
? 可將獲取到的數(shù)據(jù)進(jìn)行分頁(yè)和排序
? 經(jīng)常用來(lái)給數(shù)據(jù)小物件提供數(shù)據(jù),方便用戶互動(dòng)地進(jìn)行數(shù)據(jù)的分頁(yè)與排序
? 實(shí)現(xiàn)了 yii\data\DataProviderInterface 接口類
DataProvider根據(jù)獲取數(shù)據(jù)的方式不同,有這3種類型: ActiveDataProvider是通過(guò)查詢構(gòu)建器的方式從數(shù)據(jù)庫(kù)取數(shù)據(jù)。 SqlDataProvider通過(guò)sql語(yǔ)句從數(shù)據(jù)庫(kù)拿數(shù)據(jù) ArrayDataProvider由數(shù)組提供數(shù)據(jù)。7.8.4.1接口類方法-排序與分頁(yè)
getPagination,是讀出分頁(yè)對(duì)象信息的,可以看到,我們?cè)O(shè)置的pagesize=6. getSort,這些是顯示哪些屬性可以用來(lái)排序,以及支持用哪些順序來(lái)排。 defaultorder是顯示默認(rèn)的排序字段和排序方式 getCount 是當(dāng)前頁(yè)的數(shù)據(jù)條數(shù)。 getTotalCount 則是所有記錄的條數(shù)。 分別是6和11,都沒(méi)問(wèn)題。 我們主要通過(guò)配置pagination和sort來(lái)設(shè)定數(shù)據(jù)提供者的分頁(yè)和排序的設(shè)定。 還要補(bǔ)充一個(gè)車(chē)常用方法getmodels,這個(gè)方法就是把數(shù)據(jù)提供者中的數(shù)據(jù)取出來(lái)。7.9管理頁(yè)面的完善二-PostSearch
此處的主要作用就是用來(lái)根據(jù)輸入的作者的姓名進(jìn)行搜索與排序
7.9.1gridview
gridview會(huì)根據(jù)PostSearch和Post的屬性名,把表單的輸入項(xiàng)和數(shù)據(jù)的展示項(xiàng)一一對(duì)
應(yīng)起來(lái)。比如:id這一列數(shù)據(jù),對(duì)應(yīng)的表單就是PostSearch類中的id屬性。
如果我們把搜索類換成comment,gridview就會(huì)看看comment有哪些屬性,
然后和下面的數(shù)據(jù)展示列對(duì)應(yīng),發(fā)現(xiàn)除了status,其他都對(duì)不上,所以只能能把status展示出
來(lái)。?
7.9.2根據(jù)屬性查詢
既然要用作者姓名來(lái)查詢,用authorid只能按id查,那我們能
不能給PostSearch類額外增加一個(gè)屬性authorName,然后用這個(gè)屬性來(lái)實(shí)現(xiàn)按字符串查詢
姓名。
之后還要在postsearch里面進(jìn)行添加authname的屬性與驗(yàn)證規(guī)則rules
7.9.3PostSearch類的Rules
現(xiàn)在給我們?cè)黾拥膶傩詀uthorName,加上1個(gè)驗(yàn)證規(guī)則,可以認(rèn)為提交的數(shù)據(jù)是安全的。
7.9.4重點(diǎn)搜索
第1句,構(gòu)建了1個(gè)查詢。
第2句,數(shù)據(jù)提供者dataprovider把數(shù)據(jù)、分頁(yè)、排序都封裝了好。
第3句,作為結(jié)果返回dataprovider。
load進(jìn)行塊賦值(是使用的輸入的數(shù)據(jù))
7.9.5屬性name進(jìn)行搜索
1.賦值:使用load進(jìn)行輸入name屬性
2.使用join命令連接關(guān)聯(lián)表adminuse與post文章表格進(jìn)行連接
3.進(jìn)行l(wèi)ike比對(duì)使用andfilterwhere命令
7.9.6對(duì)于dataprovider進(jìn)行排序
添加排序的小插件即可
7.9.7總結(jié)
8.后臺(tái)完善評(píng)論管理
8.1評(píng)論管理頁(yè)面的完善
需求 3. 評(píng)論內(nèi)容的長(zhǎng)短不一,看起來(lái)不方便,考慮截取評(píng)論前面一小段來(lái)展示。 9. 把待審核的評(píng)論排在排前面,并用不同底色區(qū)別。 10.添加一個(gè)審核按鈕,可以對(duì)評(píng)論進(jìn)行審核。 11.顯示待審核評(píng)論條數(shù)的氣泡。8.2匿名函數(shù)$Value
函數(shù)簡(jiǎn)介
關(guān)于這段,用匿名函數(shù)來(lái)設(shè)置value的寫(xiě)法,我們可以查看參考手冊(cè): -value可以用匿名函數(shù)或字符串來(lái)設(shè)置, -匿名函數(shù)用這樣的格式,我們用到的model,指的是當(dāng)前行的數(shù)據(jù)對(duì)象,key 是當(dāng)前行的 鍵,index是當(dāng)前行的索引值,column是數(shù)據(jù)列對(duì)象。 例子中,我們只用到model,在渲染每一行的時(shí)候,我們會(huì)把當(dāng)前的對(duì)象的content值取出來(lái), 進(jìn)行截取處理,然后再作為結(jié)果提供給gridview渲染頁(yè)面。8.3模型類的getter和setter方法
使用方法
先看看語(yǔ)法格式: getter方法的方法名以 get 開(kāi)頭,get后面的部分就是屬性的名字。 setter方法名以 set 開(kāi)頭。 get后面的部分就是屬性的名字。 定義好方法后,就可以像普通屬性一樣使用。但是本質(zhì)有區(qū)別:當(dāng)這種屬性被讀取時(shí),對(duì)應(yīng) 的 getter方法將被調(diào)用;而當(dāng)屬性被賦值時(shí),對(duì)應(yīng)的 setter 方法就調(diào)用。 如果只定義了 getter 方法,但沒(méi)有定義setter方法,那么屬性是只讀屬性,只能讀不能 寫(xiě),對(duì)它賦值會(huì)拋出異常。多數(shù)情況下,我們都是定義只有g(shù)etter方法的只讀屬性,這種屬性一般不會(huì)持久化保存, 多數(shù)是一個(gè)業(yè)務(wù)邏輯需要的計(jì)算結(jié)果。8.4bootstrap
8.4.1全局css樣式
要重點(diǎn)理解柵格系統(tǒng),它把頁(yè)面分成12個(gè)單元,你可以通過(guò)設(shè)置單元格數(shù),來(lái)把頁(yè)面進(jìn)行分 欄: 比如這里,左邊占8個(gè)單元,右邊占4個(gè)。對(duì)應(yīng)代碼就這樣寫(xiě)。 也可以分3欄,每欄4個(gè)單元。這是對(duì)應(yīng)的代碼 博客的前臺(tái)頁(yè)面就分成了2個(gè)欄,左邊是9,右邊是3。8.4.2組件
先看字體圖標(biāo),有許多很漂亮很常見(jiàn)的圖標(biāo),這就是我們選用的審核按鈕,這是class屬性, 使用很簡(jiǎn)單,我們只需要把這段代碼的class屬性改成我們需要的圖標(biāo)屬性就可以了。 還有標(biāo)簽,通過(guò)<h+數(shù)字>這種形式可以控制標(biāo)簽的大小,用label+一個(gè)代表場(chǎng)景的英文單 詞,就可以設(shè)置不同的顏色。我們的標(biāo)簽云就是用到這2個(gè)屬性來(lái)控制顏色和大小的。 徽章,我們會(huì)?它來(lái)做待審核評(píng)論條數(shù)的氣泡。使用也非常簡(jiǎn)單。8.4.3JavaScript 插件
JavaScript 插件使用起來(lái)很簡(jiǎn)單,不需要去編寫(xiě)調(diào)試大量的js代碼,就可以給網(wǎng)頁(yè)帶來(lái)很酷 的用戶體驗(yàn)。8.5評(píng)論審核功能的修改完善
8.5.1需求
先來(lái)看看,如何把待審核的評(píng)論排在排前面,并用不同底色區(qū)別。8.5.2思路
1.排序我們先設(shè)定好排序,狀態(tài)按正序排列,待審核的排前面,相同狀態(tài)的再按id來(lái)倒序排,新發(fā)
表的評(píng)論排前面。可以看到,待審核狀態(tài)的排到了前面,相同狀態(tài)里面,進(jìn)一步是按id倒序
排的。
2.通過(guò)contentOptions來(lái)給狀態(tài)列的css樣式進(jìn)行設(shè)置,設(shè)置待審核的數(shù)據(jù)格有不同的
底色進(jìn)行區(qū)分。
這時(shí)候,要用到匿名函數(shù),在函數(shù)中判斷當(dāng)前對(duì)象的狀態(tài)是否為“待審核”,如果是的話,
我們就給數(shù)據(jù)單元格分配一個(gè)bg-danger類的樣式。
8.5.3代碼
?
添加審核按鈕
排序
待審核變色顯示
第1步,先添加1個(gè)審核按鈕。 在gridview中,是actionColumn這個(gè)類來(lái)負(fù)責(zé)展示動(dòng)作按鈕。現(xiàn)在這個(gè)寫(xiě)法,也是1種簡(jiǎn)寫(xiě), 是最簡(jiǎn)單的配置情況,只展示查看、修改和刪除按鈕。 下面,我們來(lái)看看如何對(duì)這個(gè)類進(jìn)行定義, template 用template 來(lái)定義動(dòng)作列中有哪些按鈕,大括號(hào)內(nèi)括起來(lái)的就是按鈕,按鈕的功能靠控制器 中的動(dòng)作來(lái)實(shí)現(xiàn),按鈕的命名要對(duì)應(yīng)控制器中動(dòng)作的 actionID。 比如view這個(gè)按鈕,對(duì)應(yīng)的就是控制器中文章查看的動(dòng)作:activeView 默認(rèn)情況時(shí),只有前面3個(gè)按鈕。我們現(xiàn)在要增加1個(gè)審核按鈕,那么就在原先的基礎(chǔ)上添 加1個(gè)新的按鈕approve。 buttons 添加以后,還需要buttons來(lái)進(jìn)1步設(shè)置這個(gè)按鈕: 用按鈕名來(lái)作為鍵名,值為按鈕的渲染回調(diào)函數(shù),這里只需要對(duì)approve來(lái)進(jìn)行設(shè)定,其他 的查看,修改和刪除按鈕已經(jīng)默認(rèn)設(shè)置好的,如果感興趣,可以去追蹤源碼看看: protected function initDefaultButtons(){ if (!isset($this->buttons['view'])) { $this->buttons['view'] = function ($url, $model, $key) { $options = array_merge([ 'title' => Yii::t('yii', 'View'), 'aria-label' => Yii::t('yii', 'View'), 'data-pjax' => '0', ], $this->buttonOptions); return Html::a('<span class="glyphicon-eye-open"></span>', $url, $options); }; } 這就是對(duì)評(píng)論查看按鈕的設(shè)置,這還用到了yii的t方法,用來(lái)翻譯成其他語(yǔ)言,比如這是 view,因?yàn)槲覀冊(cè)O(shè)定的語(yǔ)言是中文,所有你看到的提示是查看。 好了,回來(lái)繼續(xù)approve,這是回調(diào)函數(shù)參數(shù)的說(shuō)明,title和label不?翻譯,直接寫(xiě)中文, data-confirm可以在點(diǎn)擊這個(gè)按鈕時(shí)彈出個(gè)提示框,最后,返回的html代碼用到了bootstrap 中的圖標(biāo)check。這樣就寫(xiě)好按鈕的回調(diào)函數(shù)。 此外,還要補(bǔ)充1個(gè)不是很常見(jiàn)的屬性controller,如果按鈕對(duì)應(yīng)的動(dòng)作是在別的控制器中, 那么就通過(guò)controller來(lái)指定那個(gè)控制器,否則默認(rèn)就是當(dāng)前的控制器。 好的,我們到代碼里面來(lái)實(shí)現(xiàn)審核按鈕,保存刷新后,圖標(biāo)出來(lái)了,點(diǎn)來(lái)看看,404沒(méi)有網(wǎng)頁(yè) ,因?yàn)槲覀冞€沒(méi)有在控制器中寫(xiě)對(duì)應(yīng)的動(dòng)作方法。 第2步,到控制器中來(lái)寫(xiě)1個(gè)approve的動(dòng)作,我們知道控制器的代碼總是很簡(jiǎn)單的,有什 么具體任務(wù)讓模型做,做完后看看哪個(gè)視圖來(lái)渲染。 先把需要審核的對(duì)象找出來(lái),然后讓模型去按業(yè)務(wù)需求完成審核工作,這里能不需要特別的 審核頁(yè)面,審核頁(yè)面是改變一下?tīng)顟B(tài),所以頁(yè)面還是回到評(píng)論管理,也就是index這個(gè)頁(yè)面就 可以了。 第三步,是去模型?件去實(shí)現(xiàn)審核這個(gè)業(yè)務(wù)需求,這個(gè)需求?常簡(jiǎn)單,就是把評(píng)論的狀態(tài)從1 改為2,2代表已審核,返回1個(gè)布爾值,保存成功就返回true,這樣就可以了。 看看效果,點(diǎn)審核時(shí)會(huì)有個(gè)提示,確定后就會(huì)去執(zhí)?審核的代碼,執(zhí)?完后,還是回來(lái)這個(gè) 頁(yè)面。這時(shí)候剛才那條就已經(jīng)審核通過(guò)了。
控制器
模型
8.5.4導(dǎo)航欄加個(gè)氣泡
用來(lái)顯示待審核的評(píng)論條數(shù)
8.5.4.1控制器
8.5.4.2視圖
?使用bootstrap進(jìn)行加載氣泡的css樣式
第九部分 后臺(tái)完善用戶管理
9.1用戶管理需求
1. 認(rèn)證 2. 前后臺(tái)認(rèn)證的分離 3. 用戶管理頁(yè)面的完善 4. 授權(quán)9.2簡(jiǎn)述
認(rèn)證是鑒定用戶身份的過(guò)程。通常是使用用戶名和密碼來(lái)鑒別用戶身份。認(rèn)證是登錄功能的基礎(chǔ)。
Yii框架是用用戶組件 yii\web\User 來(lái)管理用戶的認(rèn)證狀態(tài)。分2個(gè)步驟來(lái)實(shí)現(xiàn)認(rèn)證
1. 先給用戶組件 yii\web\User 指定1個(gè)含有實(shí)際認(rèn)證邏輯的認(rèn)證類。比如:app\models\User
2. 讓認(rèn)證類user類實(shí)現(xiàn) yii\web\IdentityInterface (相當(dāng)于驗(yàn)證方法)這個(gè)接口,接口包括這幾個(gè)方法。
9.3思路與步驟
9.3.1控制器
? 登錄頁(yè)面,在sitecontroller的actionlogin方法里面。 第一步 第1句判斷,先看看你是不是沒(méi)有進(jìn)入系統(tǒng)的游客,如果是已經(jīng)登錄進(jìn)去的賬戶,那就不要 來(lái)登錄口這里玩,讓他去到首頁(yè)那里玩,isGuest這部分稍后還會(huì)進(jìn)1步介紹。以下為代碼展示 第二部 接下來(lái)新建1個(gè)loginform對(duì)象,loginform是1個(gè)模型類,對(duì)應(yīng)的是登錄表單,也有1般模 型類都有的屬性,驗(yàn)證規(guī)則,還有業(yè)務(wù)邏輯。 第三步 回來(lái)控制器,這里是塊賦值,通過(guò)LoginForm對(duì)象拿到用戶提交的數(shù)據(jù),然后調(diào)用表單模型的login方法。 login方法如果執(zhí)成功,就代表驗(yàn)證就通過(guò),調(diào)用goBack返回到登錄前的頁(yè)面就可以了。否則依然停在登錄頁(yè)面,讓你繼續(xù)提交用戶名和密碼。 我們看到,是否能驗(yàn)證通過(guò),關(guān)鍵點(diǎn)在表單類model的login方法這里,這里執(zhí)行成功,驗(yàn)證就通過(guò)了。9.3.2LoginForm
表單類的login方法,主要有2個(gè)步驟: 1.第1步,模型類的validate方法,是看看表單提交的數(shù)據(jù)是否符合這些數(shù)據(jù)規(guī)則。 2.第2步,如果符合規(guī)則,接下就會(huì)執(zhí)行Yii::$app->user->login()這句,這1句表示驗(yàn)證已 經(jīng)成功,注冊(cè)進(jìn)入系統(tǒng),這1句稍后會(huì)再解釋。?
9.4前后臺(tái)認(rèn)證分離
?
9.4.1分離步驟
9.4.2代碼操作
修改對(duì)應(yīng)adminuser的模型
9.4.3共用session連接
?
內(nèi)容選擇魏曦教你學(xué)
總結(jié)
- 上一篇: 食品安全责任险多少钱一年食品安全责任险怎
- 下一篇: 反思供应链项目:实践出真知 多反思提升