Yii 的安装
一:从 Yii 的官方网站下载 Yii 框架
二:把下载的文件解压缩到一个 Web 可以访问的文件夹里
如果想验证 Yii 是否安装成功,只需要在浏览器中输入下面的 URL 就可以了。
http://hostname/path/to/yii/requirements/index.php
使用命令行工具 yiic 创建 web 应用
YiiRoot/framework/yiic webapp WebRoot/testdrive注意:配置环境变量,否则无法运行命令行
也可以修改
Yii 自带的yiic.bat 找不到php.exe.
解决方法: 用notepad++打开yii/framework/yiic.bat,修改
if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe
→→→ if "%PHP_COMMAND%" == "" set PHP_COMMAND=D:\wamp\php\php.exe
我的就是修改为
if "%PHP_COMMAND%" == "" set PHP_COMMAND=C:\wamp\bin\php\php5.4.3\php.exe
../../ 注意路径的书写
盘符\wamp\bin\php\php5.3.5
访问:http://localhost/abc/index.php
创建控制器
在controllers文件夹下新建控制器,文件名为IndexControer,注意区分大小写;
控制器名与文件名相同,大小写也一致,这点和CI的稍有不同;
每个新建的类都需要extends一个主类 Controller;
class IndexController extends Controller{
public function actionIndex(){
echo ‘www.houdunwang.com’;
}
}
方法的书写规则:
每个方法明必须是actionIndex这样到类型,action小写,真正的方法名首字母大写;
访问:index.php?r=index/index
r=后面,第一个是控制器,第二个是方法, r就是路由route的缩写
配置默认控制器
默认访问:控制器SiteController下面的actionIndex方法
Config/main.php是主配置文件,在其中加入:
'defaultController' => 'Index',
载入视图
在控制器中:
$this->render();
$this->renderPartial();
建立文件夹需要根据控制器名字来建立,里面的文件名也就是render或
者renderPartial方法传递的名字
例如:
控制器是category,你就需要在view文件夹下建立一个category文件夹,
$this->render(‘index’);或者$this->renderPartial(‘index’);,需要
在里面建立index.php文件。
在控制器中:
$this->render();
会加载布局
$this->renderPartial();
不会加载布局(也不能载入框架自带的jquery等)
什么是布局
在views/layouts下面的文件是布局文件,公共区域,用render自动加载的文件
修改步骤
(1).views/layouts下面的,新建好布局文件。
(2).修改默认布局文件:
位置:
components/Controller.php
public $layout='//layouts/column1';
布局内容
上边是公用头部
中间<?php echo $content ?>
尾部是公共尾部
载入外部文件CSS,JS等(暂时有问题)
Css与js等一些文件放入assets里面,按照前后台分开,分别建立不同的文件夹。
Yii::app()->request->baseUrl
可以用户 echo打印出来看看;
例如:
<?php echo Yii::app()->request->baseUrl;?>/assets/index/css/index.css
绝对地址:
var_dump(Yii::app()->request->getBaseUrl(true));
Yii::app()返回的是你在index.php里创建的CWebApplication实例。
在一次请求处理过程中,这是个唯一的实例。
Yii::app()主要负责一些全局性的功能模块。
如何分配给视图数据
这个和CI的数据分配有点儿像;
$data = array(
'title' => ‘扬子鳄',
'heading' => '欢迎年',
'message' => '我是程序员'
);
$this->render('index',$data);;
如何在视图中处理分配的数据
在Yii框架中,数据以对象的形式存在
<?php foreach ($article as $v):?>
<li><?php echo $v->title;?></li>
<?php endforeach;?>
扩展自定义函数
在protected目录下建立funtions.php文件
在单入口引入函数,即根目录下上的 index.php
require_once('./protected/functions.php');
一个控制器对应一个视图文件夹
注意视图文件夹名和控制器之间的关系
比如 控制器:ArticleController
控制器中的方法名: actionIndex
actionAdd类似这样的写法
那么对应的视图文件夹名为:article
布局 layouts/ 新建一个php文件
比如说新建一个blog.php
其实CSS文件可以在页面的任意位置加载,这就可以解决多个页面有相同的头部却有着不同的CSS文件的问题
事例文件:
网站页面的公共区域,比如头部和尾部
头部代码
<?php echo $content ?>
尾部代码
修改默认载入的布局layouts
components/Controller.php 文件名
不能用 renderpartial 用 render
gii模块
打开模块
config/ main.php 去掉关于gii的注释
访问GII
r=gii/default/login
设置密码
'password'=>'Enter Your Password Here', 这里填写密码
使用GII创建后台模块
选择 Module Generator //应该是最后一项
Module ID 填写: 模块名 这里我们填 admin,意为我们所建的后台模块名为admin
点击预览,创建就可以完成,这时在modules文件夹下就会多出一个admin文件夹
在创建时权限问题 、会造成失败 ,windows不存在问题
如何访问
首先添加模块:
'modules'=>array(
// uncomment the following to enable the Gii tool
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),
//添加新模块
'admin'
),
r=admin/default/test
模块、控制器,方法
小物件 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
)
)
在视图中显示:
(1)普通写法:
<?php$this->widget('CCaptcha')?>
(2)带有点击刷新:
<?php$this-
>widget('CCaptcha',array('showRefreshButton'=>false,'clickableI
mage'=>true,'imageOptions'=>array('alt'=>'点击换图','title'=>'点
击换图','style'=>'cursor:pointer'))); ?>
注意:使用renderpartal不会点击刷新
修改核心类:在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’];
if
$loginForm->validate();
为模块设置单独布局文件
(1). 把protected里面的components文件夹复制一份,放到modules里
面的模块文件夹下面,不需要components里面的UserIdentity.php。
(2). 在模块下面的视图views文件夹里面建立layouts文件夹,里面放置
模块的布局文件,
(3).设置public $layout=‘//layouts/xx’;xx是自己的布局,去掉/
(4).如果后台模块没有公共区域直接在布局文件里<?php echo
$content?>
数据库连接配置
在main.php里面开启:
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=blog',
'emulatePrepare' => true,//PDO扩展
'username' => 'root',
'password' => '123456',
'charset' => 'utf8',
'tablePrefix' => ’hd__'//定义表前缀,
‘enableParamLogging’=> TRUE//开启调试信息的SQL语句具体值
信息
),
用var_dump(Yii::app()->db);可以测试数据库是否连接成功;
创建表单:
<?php echo CHtml::beginForm(); ?>
<?php echo CHtml::errorSummary($model); ?>
<div class="row">
<?php echo CHtml::activeLabel($model,'username'); ?>
<?php echo CHtml::activeTextField($model,'username') ?>
</div>
<div class="row">
<?php echo CHtml::activeLabel($model,'password'); ?>
<?php echo CHtml::activePasswordField($model,'password') ?>
</div>
<div class="row rememberMe">
<?php echo CHtml::activeCheckBox($model,'rememberMe'); ?>
<?php echo CHtml::activeLabel($model,'rememberMe'); ?>
</div>
<div class="row submit">
<?php echo CHtml::submitButton('Login'); ?>
</div>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->
<?php $form=$this->beginWidget('CActiveForm'); ?>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->label($model,'username'); ?>
<?php echo $form->textField($model,'username') ?>
</div>
<div class="row">
<?php echo $form->label($model,'password'); ?>
<?php echo $form->passwordField($model,'password') ?>
</div>
<div class="row rememberMe">
<?php echo $form->checkBox($model,'rememberMe'); ?>
<?php echo $form->label($model,'rememberMe'); ?>
</div>
<div class="row submit">
<?php echo CHtml::submitButton('Login'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
针对以上登录表单的模型:
定义模型
位置:protected/models/
模型是 CModel 或其子类的实例。模型用于保持数据以及与其相关的业务逻辑。
Yii 实现了两种类型的模型:表单模型和 Active Record。二者均继承于相同的基类 CModel。
取决于使用用户所输入数据的方式,我们可以创建两种类型的模型。
1. 如果用户输入被收集、使用然后丢弃,我们应该创建一个 表单模型;
2. 如果用户的输入被收集后要保存到数据库,我们应使用一个 Active Record 。
两种类型的模型共享同样的基类 CModel ,它定义了表单所需的通用接口。
具体事例:
1. 定义模型类
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
}
我们将这些成员变量称为 特性(attributes) 而不是 属性(properties),
2. 声明验证规则
一旦用户提交了他的输入,模型被填充,我们就需要在使用前确保用户的输入是有效的。 这是通过将用户的输入和一系列规则执行验证实现的。我们在 rules()
方法中指定这些验证规则, 此方法应返回一个规则配置数组。
class LoginForm extends CFormModel
{
public $username;
public $password;
public $rememberMe=false;
private $_identity;
public function rules()
{
return array(
array('username, password', 'required'),
array('rememberMe', 'boolean'),
array('password', 'authenticate'),
);
}
public function authenticate($attribute,$params)
{
$this->_identity=new UserIdentity($this->username,$this->password);
if(!$this->_identity->authenticate())
$this->addError('password','错误的用户名或密码。');
}
}
通过控制器载入表单: