Yii 1.1.17 一、安装、目录结构、视图、控制器、扩展自定义函数

2020-02-08 13:36栏目:编程
TAG:

本文总结了YiiFramework入门知识点。分享给大家供大家参考,具体如下:

这几天了解了一下Yii框架,以简单的博客项目实战入门。大致的实现流程做个记录。

创建Yii应用骨架

 

web为网站根目录yiic webapp /web/demo

一、Yii 安装与环境检测

从 www.yiiframework.com 获取一份Yii的拷贝,解压到 /wwwroot/yii 目录

打开浏览器访问 

 

通过GII创建model和CURD时需要注意

二、建立项目与目录介绍

在命令行环境,cd命令进入到 Yii 框架核心目录 /wwwroot/yii/framework ,键入命令行: php yiic webapp ../blog (注意:确保php.exe的路径配置到环境变量)

回车后,得到一条确认提示,yes 确定即可。这时在 yii 目录下有了blog 目录,结构如下:

图片 1

assets: 公共资源目录,存放JS,CSS,图片资源等等
protected:书写MVC代码的主要目录 
themes:主题目录
uploads:这个是我自己添加的图片上传目录
.htaccess: 用于Apache重写
index-text.php:功能测试的入口文件,没用 
index.php:单入口文件

 

1、Model Generator 操作

三、设置默认控制器与载入模板

 1、创建控制器

class IndexController extends Controller{
  public function actionIndex() {
    //...
  }
}

访问:index.php?r=index/index

r是 route 路由的缩写,/ 分隔 index 控制器和 index 方法

 

2、配置默认控制器

默认访问:控制器SiteController下面的actionIndex方法

 

Config/main.php是主配置文件,在其中加入:

'defaultController' => 'Index',

 

3、载入视图

在控制器方法中,有两个方法可以加载视图:

$this->render();         // 会加载布局文件
$this->renderPartial();  // 不会加载布局文件(也不能加载框架自带的jQuery等)

 方法中传递视图文件名(YII 1.1.17 中的控制器方法名以 "action" 为前缀,比如 "actionIndex" )

 

在视图目录:

根据控制器名字建立文件夹,里面的文件名是 render 或者 renderPartial 方法传递的名字

例如:

控制器是 Index ,则需要建立 Index 文件夹,在 Index 文件夹下建立 index.php 文件,然后渲染视图

$this->render('index');
// 或者
$this->renderPartial('index');

 

即使在有表前缀的情况下,Table Name中也要填写表的全名,即包括表前缀。如下图:

四、布局介绍

1、什么是局部

在 views/layouts 下面的文件是布局文件(有每个模板的公共区域),用 render() 方法渲染视图时会自动加载的文件

 

修改步骤:

  • views/layouts下面的,新建布局文件
  • 修改默认布局文件:

位置:  components/Controller.php ,基类控制器

修改属性, public $layout = '//layouts/column1';

这表示使用 protected/views/layouts/column1.php 文件作为默认的布局文件

 

2、布局内容

举个栗子就明白了,比如,一张 html 网页:

上面是公用头部 html:一般是顶栏,logo, 导航栏等等

中间左侧的主内容依照不同的网页有不同的内容,使用 <?php echo $content; ?> 

中间右侧是侧栏 html

尾部是公用尾部 html:一般是版权信息等等

 

2、Crud Generator 操作

五、载入外部文件

CSS与Js等资源文件放入assets里面,按照前后台目录分开

Yii::app()->request->baseUrl;可以获取请求的基础路径

例如: <?php echo Yii:app()->request->baseUrl; ?>/assets/index/css/index.css  将得到一个纸箱前台首页的 css 文件 url

 

Yii::app() 返回的是在index.php入口里创建的CWebApplication实例。在一次请求处理过程中,这是唯一的实例

Yii::app() 主要负责一些全局性的功能模块。

 

该界面中,Model Class中填写model名称。首字母大写。也可参照在生成model时,在proctected/models目录中通过model generator生成的文件名。如下图:

六、分配变量并在视图中调用

1、控制器分配变量

$data = array(
  'articleList' => $articleList,
  'page' => $page
);
$this->render('index', $data);

2、视图中调用变量

<?php foreach($article as $v): ?>
  <li><?php echo $v->title; ?></li>
<?php endforeach; ?>

 

如果对news、newstype、statustype这三个表生成CURD控制器,则在Model Generator中,在Model Class中输入:News、newsType、StatusType。大小写与创建的文件名的大小写相同。如果写成NEWS或NeWs等都不可以。

七、扩展自定义函数

在protected目录下建立function.php文件

 

在单入口中引入,

require_once('./protected/function.php');

 

创建模块注意事项

通过GII创建模块,Module ID一般用小写。无论如何,这里填写的ID决定main.php配置文件中的配置。如下:

'modules'=>array( 'admin'=>array(//这行的admin为Module ID。与创建Module时填写的Module ID大写写一致 'class'=>'application.modules.admin.AdminModule',//这里的admin在windows os中大小写无所谓,但最好与实际目录一致。 ),),

路由

system表示yii框架的framework目录application表示创建的应用下的protected目录。application.modules.Admin.AdminModule表示应用程序目录(比如:d:wwwrootblogprotected)目录下的modules目录下的Admin目录下的AdminModules.php文件system.db.*表示YII框架下的framework目录下的db目录下的所有文件。

控制器中的accessRules说明

/** * Specifies the access control rules. * This method is used by the 'accessControl' filter. * @return array access control rules */public function accessRules(){ return array( array('allow', // allow all users to perform 'index' and 'view' actions 'actions'=>array,//表示任意用户可访问index、view方法 'users'=>array, array('allow', // allow authenticated user to perform 'create' and 'update' actions 'actions'=>array,//表示只有认证用户才可操作create、update方法 'users'=>array, array('allow', // allow admin user to perform 'admin' and 'delete' actions 'actions'=>array,//表示只有用户admin才能访问admin、delete方法 'users'=>array,//表示指定用户,这里指用户:admin ), array('deny', // deny all users 'users'=>array;}

user: represents the user session information.详情查阅API:CWebUserCWebUser代表一个Web应用程序的持久状态。CWebUser作为ID为user的一个应用程序组件。因此,在任何地方都能通过Yii::app()->user 访问用户状态

public function beforeSave(){ if { if { $this->password=md5; $this->create_user_id=Yii::app()->user->id;//一开始这样写,User::model //$this->user->id; $this->create_time=date; } else { $this->update_user_id=Yii::app()->user->id; $this->update_time=date; } return true; } else { return false; }}

getter方法或/和setter方法

find=?',array; if { $this->errorCode=self::ERROR_USERNAME_INVALID; } else { //if->validatePassword if(!$user->validatePassword { $this->errorCode=self::ERROR_PASSWORD_INVALID; } else { $this->_id=$user->id; $this->username=$user->username; $this->errorCode=self::ERROR_NONE; } } return $this->errorCode===self::ERROR_NONE; } public function getId() { return $this->_id; }}

model/User.php

public function beforeSave(){ if { if { $this->password=md5; $this->create_user_id=Yii::app()->user->id;//====主要为此句。得到登陆帐号的ID $this->create_time=date; } else { $this->update_user_id=Yii::app()->user->id; $this->update_time=date; } return true; } else { return false; }}

/*由于CComponent是post最顶级父类,所以添加getUrl方法。。。。如下说明:CComponent 是所有组件类的基类。CComponent 实现了定义、使用属性和事件的协议。属性是通过getter方法或/和setter方法定义。访问属性就像访问普通的对象变量。读取或写入属性将调用应相的getter或setter方法例如:$a=$component->text; // equivalent to $a=$component->getText();$component->text='abc'; // equivalent to $component->setText;getter和setter方法的格式如下// getter, defines a readable property 'text'public function getText() { ... }// setter, defines a writable property 'text' with $value to be set to the propertypublic function setText { ... }*/public function getUrl->createUrl('post/view',array( 'id'=>$this->id, 'title'=>$this->title, ));}

模型中的rules方法

/* * rules方法:指定对模型属性的验证规则 * 模型实例调用validate或save方法时逐一执行 * 验证的必须是用户输入的属性。像id,作者id等通过代码或数据库设定的不用出现在rules中。 *//** * @return array validation rules for model attributes. */public function rules(){ // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( array('news_title, news_content', 'required'), array('news_title', 'length', 'max'=>128), array('news_content', 'length', 'max'=>8000), array('author_name, type_id, status_id,create_time, update_time, create_user_id, update_user_id', 'safe'), // The following rule is used by search(). // Please remove those attributes that should not be searched. array('id, news_title, news_content, author_name, type_id, status_id, create_time, update_time, create_user_id, update_user_id', 'safe', 'on'=>'search'), );}

1、验证字段必须为用户输入的属性。不是由用户输入的内容,无需验证。2、数据库中的操作字段(即使是由系统生成的,比如创建时间,更新时间等字段——在boyLee提供的yii_computer源码中,对系统生成的这些属性没有放在safe中。见下面代码)。对于不是表单提供的数据,只要在rules方法中没有验证的,都要加入到safe中,否则无法写入数据库

yii_computer的News.php模型关于rules方法

/** * @return array validation rules for model attributes. */public function rules(){ // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( array('news_title, news_content', 'required'), array('news_title', 'length', 'max'=>128, 'encoding'=>'utf-8'), array('news_content', 'length', 'max'=>8000, 'encoding'=>'utf-8'), array('author_name', 'length', 'max'=>10, 'encoding'=>'utf-8'), array('status_id, type_id', 'safe'), // The following rule is used by search(). // Please remove those attributes that should not be searched. array('id, news_title, news_content, author_name, type_id, status_id', 'safe', 'on'=>'search'), );}

视图中显示动态内容三种方法

1、直接在视图文件中以PHP代码实现。比如显示当前时间,在视图中:复制代码 代码如下:2、在控制器中实现显示内容,通过render的第二个参数传给视图

$theTime=date;$this->render('helloWorld',array;

版权声明:本文由bob体育app发布于编程,转载请注明出处:Yii 1.1.17 一、安装、目录结构、视图、控制器、扩展自定义函数