1. 程式人生 > >Yii1.1.16學習記錄

Yii1.1.16學習記錄

自帶 att 別名 框架 ext 方法 drop direct style

最近工作中用到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()返回的是你在index.php裏創建的CWebApplication實例。在一次請求處理過程中,這是個唯一的實例。
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();  

為模塊設置單獨布局文件

  1. 在模塊下面的視圖views文件夾裏面的components文件中設置public $layout=‘//layouts/xx‘;xx是自己的布局,去掉/
  2. 在模塊下面的視圖views文件夾裏面建立layouts文件夾,裏面放置模塊的布局文件,
  3. 如果後臺模塊沒有公共區域直接在布局文件裏

六、數據庫連接配置與模型定義

數據庫連接配置

'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'=>'&nbsp')
    )
 ?>
//創建上傳圖片
$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;
}

擴展縮略圖類

  1. 在extensions中建立CThumb/CThumb.php文件
  2. 在main.php裏面配置

    'components'=> array(
    'thumb' => array(
        'class' => 'ext.CThumb.CThumb'//路徑別名
    )
    )
  3. 控制器中添加
    ```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學習記錄