侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

YiiFramework入门知识点总结(图文教程)

框架(架构)  /  管理员 发布于 7年前   114

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

创建Yii应用骨架

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

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

1、Model Generator 操作

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

2、Crud Generator 操作

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

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

创建模块注意事项

通过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表示创建的应用(比如d:\wwwroot\blog)下的protected目录。
application.modules.Admin.AdminModule
表示应用程序目录(比如:d:\wwwroot\blog\protected)目录下的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'),//表示任意用户可访问index、view方法      'users'=>array('*'),//表示任意用户    ),    array('allow', // allow authenticated user to perform 'create' and 'update' actions      'actions'=>array('create','update'),//表示只有认证用户才可操作create、update方法      'users'=>array('@'),//表示认证用户    ),    array('allow', // allow admin user to perform 'admin' and 'delete' actions      'actions'=>array('admin','delete'),//表示只有用户admin才能访问admin、delete方法      'users'=>array('admin'),//表示指定用户,这里指用户:admin    ),    array('deny', // deny all users      'users'=>array('*'),    ),  );}

看以上代码注释。

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

public function beforeSave(){  if(parent::beforeSave())  {    if($this->isNewRecord)    {      $this->password=md5($this->password);      $this->create_user_id=Yii::app()->user->id;//一开始这样写,User::model()->user->id;(错误)      //$this->user->id;(错误)      $this->create_time=date('Y-m-d H:i:s');    }    else    {      $this->update_user_id=Yii::app()->user->id;      $this->update_time=date('Y-m-d H:i:s');    }    return true;  }  else  {    return false;  }}

getter方法或/和setter方法

username);    $user=User::model()->find('LOWER(username)=?',array($username));    if($user===null)    {      $this->errorCode=self::ERROR_USERNAME_INVALID;    }    else    {      //if(!User::model()->validatePassword($this->password))      if(!$user->validatePassword($this->password))      {        $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(parent::beforeSave())  {    if($this->isNewRecord)    {      $this->password=md5($this->password);      $this->create_user_id=Yii::app()->user->id;//====主要为此句。得到登陆帐号的ID      $this->create_time=date('Y-m-d H:i:s');    }    else    {      $this->update_user_id=Yii::app()->user->id;      $this->update_time=date('Y-m-d H:i:s');    }    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('abc');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($value) { ... }*/public function getUrl(){  return Yii::app()->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("Y-m-d H:i:s");$this->render('helloWorld',array('time'=>$theTime));

视图文件:

复制代码 代码如下:

调用的render()方法第二个参数的数据是一个array(数组类型),render()方法会提取数组中的值提供给视图脚本,数组中的 key(键值)将是提供给视图脚本的变量名。在这个例子中,数组的key(键值)是time,value(值)是$theTime则提取出的变量名$time是供视图脚本使用的。这是将控制器的数据传递给视图的一种方法。

3、视图与控制器是非常紧密的兄弟,所以视图文件中的$this指的就是渲染这个视图的控制器。修改前面的示例,在控制器中定义一个类的公共属性,而不是局部变量,它是值就是当前的日期和时间。然后在视图中通过$this访问这个类的属性。

视图命名约定

视图文件命名,请与ActionID相同。但请记住,这只是个推荐的命名约定。其实视图文件名不必与ActionID相同,只需要将文件的名字作为第一个参数传递给render()就可以了。

DB相关

$Prerfp = Prerfp::model()->findAll(  array(    'limit'=>'5',    'order'=>'releasetime desc'  ));
$model = Finishrfp::model()->findAll(  array(    'select' => 'companyname,title,releasetime',    'order'=>'releasetime desc',    'limit' => 10  ));foreach($model as $val){  $noticeArr[] = "  在".$val->title."竞标中,".$val->companyname."中标。";}
$model = Cgnotice::model()->findAll (  array(    'select' => 'status,content,updatetime',    'condition'=> 'status = :status ',    'params' => array(':status'=>0),    'order'=>'updatetime desc',    'limit' => 10  ));foreach($model as $val){  $noticeArr[] = $val->content;}
$user=User::model()->find('LOWER(username)=?',array($username));
$noticetype = Dictionary::model()->find(array( 'condition' => '`type` = "noticetype"'));
// 查找postID=10 的那一行$post=Post::model()->find('postID=:postID', array(':postID'=>10));

也可以使用$condition 指定更复杂的查询条件。不使用字符串,我们可以让$condition 成为一个CDbCriteria 的实例,它允许我们指定不限于WHERE 的条件。例如:

$criteria=new CDbCriteria;$criteria->select='title'; // 只选择'title' 列$criteria->condition='postID=:postID';$criteria->params=array(':postID'=>10);$post=Post::model()->find($criteria); // $params 不需要了

注意,当使用CDbCriteria 作为查询条件时,$params 参数不再需要了,因为它可以在CDbCriteria 中指定,就像上面那样。

一种替代CDbCriteria 的方法是给find 方法传递一个数组。数组的键和值各自对应标准(criterion)的属性名和值,上面的例子可以重写为如下:

$post=Post::model()->find(array( 'select'=>'title', 'condition'=>'postID=:postID', 'params'=>array(':postID'=>10),));

其它

1、链接

复制代码 代码如下:
title,0,26),array('prerfp/details','id'=>$val->rfpid),array('target'=>'_blank'));?>

具体查找API文档:CHtml的link()方法

复制代码 代码如下:
title,0,26); ?>
具体请查找API文档:CController的createUrl()方法

以上两个连接效果等同

组件包含

一个示例:

在视图中底部有如下代码:

复制代码 代码如下:
widget ( 'Notice' ); ?>

打开protected/components下的Notice.php文件,内容如下:

render('banner');  }}

渲染的视图banner,是在protected/components/views目录下。

具体查看API,关键字:CPortlet

获取当前host

Yii::app()->request->getServerName();//and$_SERVER['HTTP_HOST'];$url = 'http://'.Yii::app()->request->getServerName(); $url .= CController::createUrl('user/activateEmail', array('emailActivationKey'=>$activationKey));echo $url;

关于在发布新闻时添加ckeditor扩展中遇到的情况

$this->widget('application.extensions.editor.CKkceditor',array(  "model"=>$model,        # Data-Model  "attribute"=>'news_content',     # Attribute in the Data-Model  "height"=>'300px',  "width"=>'80%',"filespath"=>Yii::app()->basePath."/../up/","filesurl"=>Yii::app()->baseUrl."/up/", );

echo Yii::app()->basePath

如果项目目录在:d:\wwwroot\blog目录下。则上面的值为d:\wwwroot\blog\protected。注意路径最后没有返斜杠。

echo Yii::app()->baseUrl;

如果项目目录在:d:\wwwroot\blog目录下。则上面的值为/blog。注意路径最后没有返斜杠。

(d:\wwwroot为网站根目录),注意上面两个区别。一个是basePath,一个是baseUrl

其它(不一定正确)

在一个控制器A对应的A视图中,调用B模型中的方法,采用:B::model()->B模型中的方法名();

前期需要掌握的一些API
CHtml

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

您可能感兴趣的文章:

  • PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
  • yii2 页面底部加载css和js的技巧
  • Yii基于数组和对象的Model查询技巧实例详解
  • Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
  • Yii使用技巧大汇总
  • yii2-GridView在开发中常用的功能及技巧总结
  • Yii编程开发常见调用技巧集锦
  • YII框架行为behaviors用法示例
  • Yii2框架实现数据库常用操作总结
  • PHP的Yii框架中过滤器相关的使用总结
  • YII框架常用技巧总结


  • 上一条:
    Yii快速入门经典教程
    下一条:
    Yii实现单用户博客系统文章详情页插入评论表单的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客