Yii1.1.16學習記錄
最近工作中用到Yii框架,為此專門在網上找了些相關教程學一下,盡管教程比較老,但學完後至少對Yii框架有了基本了解,特別是widget的使用,感覺Yii真的很強大。
一、框架介紹與安裝
框架源碼下載
點擊官網
安裝
在命令行進入到framework 目錄
執行 :
php yiic.php webapp ../blog
在 windows系統中運行 yiic 時,如果出現"php.exe" 不是內部或外部命令,也不是可運行的程序,或批處理文件,需要把php目錄添加環境路徑裏面去。
二、創建與設置默認控制器並載入模板
創建控制器
class IndexController extends Controller{
public function actionIndex(){
echo 'jesse';
}
}
訪問:index.php?r=index/index
r=後面,第一個是控制器,第二個是方法, r就是路由route的縮寫
配置默認控制器
默認訪問:控制器SiteController下面的actionIndex方法
Config/main.php是主配置文件,在其中加入:
‘defaultController‘ => ‘Index‘,
載入外部文件
Css與js等一些文件放入assets裏面,按照前後臺分開
Yii::app()->request->baseUrl
Yii::app()主要負責一些全局性的功能模塊。
載入視圖
$this->render();會加載布局
$this->renderPartial();不會加載布局(也不能載入框架自帶的jquery等)
建立文件夾需要根據控制器名字來建立,裏面的文件名也就是render或者renderPartial方法傳遞的名字
如何在視圖中處理分配的數據
在Yii框架中,數據以對象的形式存在
<?php foreach ($article as $v):?>
<li><?php echo $v->title;?></li>
<?php endforeach;?>
擴展自定義函數
在protected目錄下建立funtions.php文件
在單入口引入函數require_once(‘./protected/functions.php‘);
三、前臺模板載入與layouts使用
將靜態模板文件(js、css、img)放置在assert文件夾中,在views文件夾下的php模板中調整好靜態文件的鏈接
將php模板中的文件中的公共部分可提取放置在layouts文件夾內,並在components/Controller.php文件中設置所使用的公有布局文件
四、gii模塊使用與widget使用
gii模塊使用
打開模塊,在config/main.php
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',//設置密碼
'ipFilters'=>array('127.0.0.1','::1'),
),
訪問創建http://localhost/yiitest/shop/index.php?r=模塊名字
生成Generators
添加後臺ID
需要在main.php裏面配置
'gii'=>array(
),
'admin'//加入後臺你創建的ID
訪問模塊modules
http://localhost/yiitest/shop/index.php?r=模塊/控制器/方法
小物件widget使用
CActiveForm 類下面找方法
<?php $form = $this->beginWidget('CActiveForm') ?>
<?php echo $form->textField(模型,'表單名',html屬性)) ?>
<?php $this->endWidget() ?>
五、驗證碼的使用與規則設置
驗證碼的使用
public function actions(){
return array (
'captcha'=> array(
'class'=> 'CCatpchaAction',
'height'=> 25,
'width'=>80,
'minLength'=>4,
'maxLength'=>4
)
)
)
帶有點擊刷新:
$this->widget('CCaptcha',array('showRefreshButton'=>false,'clickableImage'=>true,'imageOptions'=>array('alt'=>'點擊換圖','title'=>'點擊換圖','style'=>'cursor:pointer')));
顯示錯誤信息
<?php echo $form->error('模型','name名')?>
修改核心類:
在framework/web/widgets/ captcha/CCaptchaAction.php修改run方法裏面:
$this->renderImage($this->getVerifyCode(TRUE));
設置驗證規則:
在loginForm.php的rules方法裏:
array('name','captcha','錯誤信息');
array('verify',' captcha','message'=>'驗證碼錯誤');
通過驗證:
$loginForm->attributes = $_POST['LoginForm'];
$loginForm->validate();
為模塊設置單獨布局文件
- 在模塊下面的視圖views文件夾裏面的components文件中設置public $layout=‘//layouts/xx‘;xx是自己的布局,去掉/
- 在模塊下面的視圖views文件夾裏面建立layouts文件夾,裏面放置模塊的布局文件,
- 如果後臺模塊沒有公共區域直接在布局文件裏
六、數據庫連接配置與模型定義
數據庫連接配置
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=blog',
'emulatePrepare' => true,//PDO擴展
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'tablePrefix' => 'hd__'//定義表前綴,
'enableParamLogging' => TRUE//開啟調試信息的SQL語句具體值信息
)
查詢動作
User::model()->find(
'username=:name',
array(':name'=>'admin')
)
七、session使用與redirect和createUrl
session使用
存儲:
Yii::app()->session['logintime'] = time();
調用:
Yii::app()->session['logintime']
清除:
Yii::app()->session->clear();
Yii::app()->session->destroy();
退出登陸:
Yii::app()->user->logout();
redirect跳轉
如果在當前控制器下:
$this->redirect(array('index'))//跳轉到當前控制器index方法
訪問其他控制器方法:
$this->redirect(array('控制器/方法'))
createUrl方法使用
在視圖中用
$this->createUrl('控制器/方法',get參數);
$this->createUrl('article/index',array('aid'=>3));
八、模型規則與標簽設置開啟前臺驗證
標簽設置
public function attributeLabels(){
return array(
'passwd' => '原始密碼',
);
}
規則設置
public function rules(){
return array(
array('passwd','required', 'message'=>'原始密碼必填'),
);
}
開啟前臺驗證
必須用render(),在小物件中調用
$form=$this->beginWidget('CActiveForm', array(
'id'=>'contact-form',
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
));
九、修改動作與成功提示信息
操作成功提示
控制器中:
Yii::app()->user->setFlash('s','添加成功');
視圖中:
If(Yii::app()->user->hasFlash('s')){
echo Yii::app()->user->getFlash('s');
}
十、AR類的增刪查改
增加
$model = new Model();
$model->attributes = $_POST['user'];
$model->save();
save方法,在new Model的時候是增加,在$model::model()的時候是修改。
刪除
model::model()->deleteByPk($id)
查詢
find() 查詢一條信息
例:find(‘username=:name‘ ,array(‘:name‘=>‘admin‘))
findByPk() 通過主鍵來查詢
例:findByPk(1)
findBysql() 通過SQL來查詢出一條
例:findBySql(‘SELECT * FROM {{admin}}‘)
findAll() 查詢多條信息
例:findAll(‘color=:color‘ ,array(‘:color‘=>‘red‘))
findAllByPk() 通過主鍵來查詢,可以多個主鍵
例:findAllByPk (array(1,2))
findAllBysql() 通過SQL來查詢出多條
例:findAllBysql (‘SELECT * FROM {{admin}}‘)
更改
$model = Model::model();
$info = $model->findByPk($id);
if(isset($_POST['user'])){
$info->attributes = $_POST['user'];
$info->save()//此時save是修改
}
$this->render('edit',array('model'=>$info));
十一、小物件創建radio與select
//創建redio
<?php
echo $form->radioButtonList(
$articleModel,
'type',
array(0=>'普通',1=>'熱門'),
array('separator'=>' ')
)
?>
//創建上傳圖片
$form = $this->beginWidget('CActiveForm', array('htmlOptions'=>array('enctype'=>'multipart/form-data')));
<?php echo $form->fileField($articleModel, 'thumb') ?>
//創建select
<?php echo $form->dropDownList($articleModel,'cid', $cateArr) ?>
//創建textarea
<?php
echo $form->textArea(
$articleModel,
'info',
array('cols'=>50,'rows'=>10,'maxlength'=>100)
)
?>
十二、上傳類與擴展第三方類略圖類的使用
上傳類
$model = new model();
$model->thumb = CUploadedFile::getInstance($model,'thumb');
if($model->thumb){
$name = 'img_' . time() . mt_rand(0,999);
$img = $name . '.' . $model->thumb->extensionName;
$model->thumb->saveAs('uploads/' . $img);
$model->thumb = $img;
}
擴展縮略圖類
- 在extensions中建立CThumb/CThumb.php文件
在main.php裏面配置
'components'=> array( 'thumb' => array( 'class' => 'ext.CThumb.CThumb'//路徑別名 ) )
控制器中添加
```php
$path = dirname(Yii::app()->BasePath) . ‘/uploads/‘;
$thumb = Yii::app()->thumb;
$thumb->image = $path . $imgName;
$thumb->width = 130;
$thumb->height=95;
$thumb->mode = 4;
$thumb->directory = $path;
$thumb->defaultName = $preRand;
$thumb->createThumb();
$thumb->save();
```
十三、分頁類與後臺權限認證
分頁類
//controller
$criteria = new CDbCriteria();//AR的另一種寫法
$model = Model::model();
$total = $model->count($criteria);//統計總條數
$pager = new Cpagination($total);//實例化分頁類
$pager->pagerSize = 3;//每頁顯示多少條
$pager->applyLimit($criteria);//進行limit截取
$info = $model->findAll($criteria);//查詢截取過的數據
$data = array('info'=>$info,'pages'=>$pager);
$this->render('index',$data);
//views
$this->widget('CLinkPager', array(
'header' => '',
'firstPageLabel' => '首頁',
'lastPageLabel' => '末頁',
'prevPageLabel' => '上一頁',
'nextPageLabel' => '下一頁',
'pages' => $pages,
'maxButtonCount'=> 5,
));
權限驗證
public function filters(){
return array(
'accessControl' //可以用 + -來控制那個方法是否驗證
);
}
public function accessRules(){
return array(
array(
'allow',
'actions' => array('index'),
'users' => array('@')
),
array(
'deny',
'users' => array('*')
),
);
}
allow 允許 deny 拒絕
- 代表所有用戶
- @ 代表登陸用戶
- ? 代表匿名用戶
配置默認登陸界面,在main.php
'user'=> array(
//加上
loginUrl => array('admin/login/index')
)
十四、前臺數據分配
十五、偽靜態路由與緩存
隱藏單入口
- 保證apache配置文件httpd.conf裏的LoadModule rewrite_module modules/mod_rewrite.so開啟(去掉#)
- 將相對應目錄的AllowOverride 改為ALL
- 在根目錄下,即在index.php同級目錄下新建.htaccess
.htaccess文件內容如下
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
開啟緩存
在main.php的組件components中配置設置緩存
'cache' => array(
'class' => 'system.caching.CFileCache'
)
也就是framework/caching/CFileCache.php
片段緩存
<?php if($this->beginCache($id,array('duration'=>1))): ?>
//緩存內容
<?php $this->endCache();endif ?>
duration 時間,以秒為單位
整頁緩存
public function filters(){
return array(
array(
'system.web.widgets.COutputCache + index',
'duration' => 30,
'varyByParam'=> array('aid')
)
);
}
數據緩存
$value = Yii::app()->cache->get($id)
if($value == false){
Yii::app()->cache->set($id, $value);
}
Yii1.1.16學習記錄