YII框架的使用
spit: 吐痰,吐口水, 過去式: spat
spat: 本身也可以作為一個單詞, 意思是: “小打小鬧”“小的吵鬧”“小爭吵”
-
list函數,“列表”, 表示將數組中 對應的 元素值 相應的賦值給 多個變量...
explode和implode是在數組和字符串之間轉換, 轉換的分隔符不能為空: 如果delimiter為空, 則
會產生一個警告: empty delimiter... -
數組排序用sort, 數組倒序用array_reverse
yii 框架是美籍華人薛強開發的完全免費開源的php框架. Qiang
yii 是 yes it is的首字母縮寫. yee. 讀作 yi: yee, easy extensible, efficient框架, 基於mvc設計模式. 純oop的
下載地址: http://www.yiiframework.com 中文社區是: http://www.yiichina.com
yii仍然是index.php單入口模式, 其中的view視圖層會跟 layout和一些小組件widget如treeview等交互.
而Controller控制器,則包括 Filter>atction等層次...
yii的requirements目錄是環境檢測, 看服務器所在的環境是否滿足yii的安裝環境...
yii對php 的版本要求還是比較低的: 只要 php version > 5.1.0 就好了, 很多集成環境都能夠滿足.
安裝yii框架
- 要使用cmd 命令行方式來安裝;
- 要進入到www下的yii目錄下的 framework目錄:
cd framework/
- 執行命令: php yiic.php webapp your_project_path/project_name //其中yiic.php是一個php腳本, webapp是命令關鍵字.
然后在你的項目目錄下會生成一個project_name的文件夾, 里面是yii創建的各個目錄...
關於項目的路徑, 通常是放在跟framework框架相同級別/同級的目錄中, 因此, 你在進入framework框架下, 執行php命令的時候, 自然創建的項目路徑就是: ../your_project_name
yiic: yii_command, 是yii的命令行腳本, yiic是linux的shell腳本, yiic.php是yiic的php腳本, yiic.bat是yiic的windows腳本.
asset
美 ['æset] 英 ['æset
創建的yii程序的目錄結構是: index.php是入口文件; assets是公共資源文件(asset['2set'] ), css, images, themes,
protected(最重要的就是這個目錄: 包括conf/main.php這個是主配置文件, controllers/這個是控制器目錄, models/是模型目錄,
views/是視圖目錄)..
應該多看的是yii的 文檔- 導航標簽中 的 內容:
兩種方案和思想, 一種是直接訪問localhost,把webapp直接放在localhost下, 另一種是放在localhost下的子目錄中, 這樣的好處是, 可以創建多個這樣的子程序web
views: 包括site/index.php, 和 layouts/main.php, 一個視圖文件就是按照layouts/main.php的布局, 然后加上site/index.php中的內容組成的,
也就說, 最后生成的內容: layouts/是布局/結構, site/index.php是內容.
熟悉了tp后, 來看yii就很容i了, 可以用tp的思維思想來學習yii, 反過來yii也可以加深對tp的理解
注意, yii的目錄結構中的文件夾, 通常用的都是 "小寫的" "復數", 如:views/,contrllers/, models/, commands/, components/等等
控制器的名稱則是首字母大寫的, 默認的是 SiteController. 方法的命名規范是: actionIndex.
class MyController extends Controller{
public function index(){
print('hello yii') ;
$this->render('index');
}
}
這里創建的是My控制器, 控制器文件名應該是: MyController.php,同時, 在views/目錄(注意是views目錄下, 不是site目錄! 那里的site目錄是yii給我們的默認的
一個SiteController控制器所對應的視圖文件夾), 下就應該有對應的文件夾my/. 注意控制器是首字母大寫的, 而views/"控制器對應的視圖目錄名" 是小寫的, 如這里的
MyController控制器對應的視圖目錄就是: views/my/. 然后, my目錄下的文件如:index.php, do.php, login.php, article.php就是這個控制器類對應的方法名稱,如: funtion actionIndex
function actionDo(), function actionLogin(). action的命名規則, 而對應的方法視圖文件要用小寫的!
yii默認給我們提供了一個Site控制器和site視圖子目錄, 是可以直接使用的!
訪問的時候, 輸入的地址是: `localhost/yiidemo/index.php?r=Index/dosomething`, 其中r表示route路由, 后面跟上控制器名稱和操作方法.
yii的組件, 都是以類的方式來提供的, 或許是受c/c++的影響太深, 都是以C開頭的, 表示是"類",如CTreeView.php
渲染者: render+er: renderer.
framework中的內容組成: (a-z排序)
- base是他的核心基本類庫, 包括程序的自舉,啟動, 運行: CApplication, CModel, CError, CException,CBehavior, CComponent, interface |.php
- caching,cli, collections(這個是yii的集合類, 包括CList.php, CMap.php, CQueue.php, CStack.php等類以及每個類對應的迭代類: CListIterator.php, CMapIterator.php,
CQueueIterator.php, CStackIterator.php, CTypedList.php...) - console, db(數據庫相關的類...)
- messages類似於tp的languages
- views類似於ThinkPHP中的tpl/trace_jump.tpl等模板,如error, 404, 300.錯誤等等..
- 框架的核心還是web目錄, 里面有widgets, services,和renderers, vendors第三方的, validators,和一些工具: utils 等等.
當前的yii的穩定版是1.1.17
YiiBase類中的方法基本上都是靜態方法... public static function createWebApplication($config=null){ return self::createWebApplication($config);}
public和static的順序:
- public通常在最前面, 說明訪問權限, 因為這個是從外部 的訪問者來說的, 這個離函數本身 "更遠";
- 然后才是說明這個方法的性質, 是靜態的, 還是動態的, 所以這個時候, 才用 static 來修飾.
即: 一個函數的定義是: public static function a_public_static_func(){....}
-
jquery的find查找方法
find就是查找當前正在處理的元素的后代元素的方法。find方法,由前面的選擇器指定選擇范圍,后面的find參數
指定選擇的內容。
實際上$(parent).find(descend)
就等同於$(parent descend)
-
html方法返回的是 元素的內容,(內部的東西) 元素本身的標簽是不包括的 ,如:
<p> <span> span text<strong> strong text</strong></span></p>,
$('span').html(), 將會輸出: span text<strong> strong text</strong>,
span本身的標簽並不輸出,即不會輸出:<span> span text<strong> strong text</strong></span>
不管是前端還是后端, 都是在服務器上生成好代碼后, 之后再 發送到瀏覽器的, php和html頁面之間進行數據交換的操作都是在服務器上。唯一的區別只是發送到瀏覽器端的代碼量有大有小, 差別只是體現在網絡傳輸延遲上。 服務器端是不會渲染顯示的, 服務器端只有代碼!
鍵盤的選擇還是以“柔和, 輕柔,柔軟”的為好, 那種很硬,彈簧很硬的,質地很硬的不好...
strtr: r是replace替換的意思.
- strtr返回的是str的替換后的副本, 並不是str本身,
- 最好是使用 array replace_pairs
yiidemo用戶自己的項目是如何運行起來的?
yiidemo 自己項目中的入口文件是: index.php, 它首先包含 framework框架中的yii.php, require_once $yii;
,
然后創建自己的應用程序: Yii::createWebApplication($config) -> run();
, 到此, web程序就運行起來了.
而yii.php是框架下的"入口文件", 它實際上是一個Yii的類, 這個類又繼承自YiiBase類:
class Yii extends YiiBase {...}
最終, 由 YiiBase.php提供app的核心功能!
yii的應用程序有兩種, 一種是console應用程序,一種是web應用程序
使用的都是 Yii::createApplication($class, $config=null){ return new $class($config); }
, 返回的是一個類的對象實例;
根據這個class類名參數來決定是創建哪種app, 如果$class是 "CWebApplication", "CConsoleApplication"...
**頁面的標題, 現在可以用函數來動態生成了, 只要使用pageTitle成員屬性: 就好了: $this-> pageTitle = Yii::app() -> name. ' - About' ; **
什么叫Gii? 參考: http://blog.csdn.net/dogfish/article/details/6381402
當gii沒有權限的時候: 設置: module 設置gii的時候 不是本地的要設置允許IP 'allowedIPs' => ['127.0.0.1', '::1', '192.168.1.*', 'XXX.XXX.XXX.XXX']
gii is a magic tool that can write code for you . 是yii的自動生成 代碼 的工具.
在yii中使用gii, 只需要在protected/config/main.php中, 配置gii的模塊module即可..
設置默認的控制器: 在protected/config/main.php中, 加上: defaultController => 'Index';
, 而且默認的方法就是 index: function actionIndex()...
render中的layout主要是包含: 公共的 頭部和尾部...
自定義載入自己的模板文件?
- 將js, css等文件放在 項目/assets/(index或admin)/目錄中
- 在views/controller_name/模板文件.php(zhuyi, 模板文件是php, 不是tp的html).
- 載入外部的css/js文件等. 由於外部項目目錄路徑是通過 <?php ... 來輸出的. 所以這個不管是在action方法中, 還是在模板文件中都是可以使用的, 如果是原來的模板文件, 則用
- 控制器向視圖模板傳遞數據? 在控制器中, 使用 關聯數組, 然后將這個關聯數組變量, 作為render, 或renderPartial的第二個參數, 然后在模板中使用 關聯數組的下標變量來輸出:
$data = array('var1' => 10, 'var2' => 20); $this -> render('index', $data); 然后在模板中使用 <?php echo $var1; ?>
來輸出. - 注意在yii中, 沒有smarty, 等模板引擎, 都是用原生的php語句進行輸出的. 但是對於foreach等具有 大括號的 語句輸出, 也不使用大括號, 而是使用類似 "模板引擎"的方法, 在最后的時候, 用endforeach 的方式來輸出:
<?php foreach($article as $v): ?> 注意foreach后是冒號, 不是分號或大括號; <li> <?php echo $v->title; ?>(這里注意, 如果<?php中 , 只有一條語句, 那么可以不用加 分號!) </li> <?php endforeach; ?>
在yii中如何擴展自定義全局函數?
在protected/中創建一個functions.php文件(或func.php文件都可以, 反正后面要包含的). 然后在里面寫上自定義函數.
使用時, 在 項目的入口文件 index.php中, 包含這個自定義函數文件: include_once './protected/functions.php';
不必只創建一個Index控制器,(雖然 你可以將很多/甚至全部邏輯業務 , 都放在一個Index控制器中,) 但是, 為了將業務邏輯分得更清楚一些, 也便於維護 , 可以多創建幾個控制器,每個業務邏輯(單元模塊功能),(甚至一個頁面 "生成器" ) 創建一個控制器..., 而且注意 名稱的大小寫, 有些大寫只是框架的命名規范所要求的. 其他地方, 該用小寫的還是用小寫.
yii包括其他框架(如tp)中, 使用 公共部分 -> layouts 布局, 一是便於有統一的布局樣式, 另一個就是便於 修改和維護. yii的layouts比 tp要更好更清晰明確.
使用模板布局layouts的方法和步驟是:
- 分析公共區域, 但是要注意, assets中的內容, 如css, js可能不一樣, 可以把link等 放在任何地方, 所以在layouts中要把它提取出來;
- 在protected/layouts/下創建我們自己的布局文件, 如 my.php
這個控制器中, 有幾個 public的成員變量, $layout, $menu, $breadcumbs,
等, 這些可以修改, 或者重載, public $layout = "//layouts/my"
- 創建布局文件, 將公共的部分提取出來, 放在my.php中 , 同時, 在需要單獨顯示具體模板內容的 地方 加入
<?php echo $content ?>
, 注意這個echo content 是放在布局中的, 不是放在具體的模板中的.因為實際在渲染的時候, 是先讀取 布局文件, (這就要求凡是使用布局的 頁面的結構 應該是一樣的! ) 然后將布局文件中的content用 實際模板中的內容來替換的. - 配置, 設置 protected/components/controller.php, 中 將 $this->layouts 換成我們自己的布局文件名: my(不需要加php)
- 修改其他業務對應的模板文件, 將重復的部分removed, 只需要自己單獨顯示的不同的部分
創建好自己的yii應用程序時, 里面的 **css和images和themes ** 是示例站點的資源. 如果你要 開發自己的web 程序, 這些文件夾(css, images, themes)可以刪除不要.
如果你要寫了 $this->render('index');
那么就一定要有views的對應模板文件, 否則就會報錯!
難道link的css文件要放在view 視圖模板文件中嗎? 不能放在 layout中?
<?php echo Yii::app()->request->baseUrl ?>
得到的就是 項目的目錄路徑.
==================
gii自動創建控制器等的用法:
-
在config/main.php中enable gii module :
modules => array( 'gii'=>array(....) );
本身gii是不安全的, 可能被黑客使用, 在開發創建過程中, 可以打開gii, 開發完畢后, 要關閉gii.
class => 'system.gii.GiiModule' (其中, system就是framework框架目錄, GiiModule是指CGiiModule.php文件. 包含了Yii::import "CCodeFile, CCodeModel, CCodeForm" 等類文件. -
主要是用gii來產生 后台 模塊. gii是通過web方式 web-based 來生成的.
-
注意,yii的配置文件, 只有用戶項目中, 才有, yii核心代碼framework中 是沒有 config的.
-
yii產生后台的方式, 和 前台跟后台 分離的方式 不一樣, yii是吧 后台模塊專門用gii來產生 的, 作為 modules/admin 來產生的, 而tp則是把前台和后台作為平等的 項目啦實現的.
-
創建時, 是訪問的 index.php?r=gii, 創建完成后, 要訪問后台模塊: index.php?r=admin/default/index (r=模塊id/控制器/方法). 而且后台模塊也可以使用前台的布局layouts.
-
要調用 yii的面包屑導航, 使用的方法是: 只需要在 對應的 "模板文件" (注意是模板文件, 即
$content
包含的內容中) 定義好 breadcurmbs 成員變量就好了, 不要什么echo, print的, 輸出的語句是在其他框架函數中.
<?php
$this -> breadcrumbs = array(
$this->module->id, // 注意這里要用字符串, 不能是 $this->module. 這個將會是一個模塊! 報錯
'other', 'other2'...
);
?>
<h1> <?php echo $this->uniqueId. '/'. $this->action->id; ?> </h1>
最后生成的面包屑導航格式是: Home (默認就是從Home開始的) >>(indicator就是類似兩個大於符號的) admin >> other >>other2( 因此, breadcrumbs的數組中, 有多少個元素, 就有多少級面包屑導航級數...
注意 , 所有的在views/index.php視圖中的 $this
, 都是指的 當前的控制器! 要獲得控制器的方法和module , 都直接使用 $this->action->id, $this->module->id;
而要獲得類本身的名稱: 則要使用 get_class($this);
__FILE___
, 會把當前文件的 "完整路徑 / + 文件名" 都顯示出來.
通常 控制器 的 默認的 方法 都設置 設置 成 index方法: function actionIndex()..., 而且前台的目錄項目名稱 通常也設置成 index, 后台設置成 admin..
可以100% 的說, 不管是在函數中, 方法中, 還是array數組的配置文件中, 只要是碰到 "字符序列", 只要不是 明確使用的 (const, define(...)) 常量(大寫的), 都應該看作是 "字符串", 都應該加上 字符串引號. 這個就不要再犯這樣的錯了!!
小物件widget的用法:
- widget主要是用在 表單上, 而且, 使用widget, 因為是來自類, 有隱含 的方法和操作 的. 所以有 很多自動化的操作.
- yii是完全oop的, 所以他的 表單 也是以類對象的方式 來使用的.
- 要使用表單的 widget, 先要創建表單對象, 然后調用表單對象的方法, 來創建相應的域:
在視圖.php文件中
<?php
$form = $this -> beginWidget('CActiveForm');
echo $form -> textFiled('LoginModelObj 表單模型', '表單域的名稱, 如usename, password等', '表單域的屬性組成的數組: array('id'=>'username'...) );
$this->endWidget();
?>
$form中的所有方法, 都是來自於 類CActiveForm的, 然后 , LoginModel extends CFormModel
其中, 模型要在 控制器方法中, 用new LoginModel() 的方式創建出來, 然后通過renderPatial的參數 傳遞到視圖文件中...
要注意, $form -> textFiled('model_name', 'form_field_name', array_attr) 中的 表單域的名字, 在相應的模型LoginModel中要有相應的 public 成員變量, ...