h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
margin-top: 0;
padding-top: 0;
}

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
margin-top: 0;
padding-top: 0;
}

h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
margin-top: 10px;
}

/* LINKS
=============================================================================*/

a {
color: #4183C4;
text-decoration: none;
}

a:hover {
text-decoration: underline;
}

/* LISTS
=============================================================================*/

ul, ol {
padding-left: 30px;
}

ul li > :first-child,
ol li > :first-child,
ul li ul:first-of-type,
ol li ol:first-of-type,
ul li ol:first-of-type,
ol li ul:first-of-type {
margin-top: 0px;
}

ul ul, ul ol, ol ol, ol ul {
margin-bottom: 0;
}

dl {
padding: 0;
}

dl dt {
font-size: 14px;
font-weight: bold;
font-style: italic;
padding: 0;
margin: 15px 0 5px;
}

dl dt:first-child {
padding: 0;
}

dl dt>:first-child {
margin-top: 0px;
}

dl dt>:last-child {
margin-bottom: 0px;
}

dl dd {
margin: 0 0 15px;
padding: 0 15px;
}

dl dd>:first-child {
margin-top: 0px;
}

dl dd>:last-child {
margin-bottom: 0px;
}

/* CODE
=============================================================================*/

pre, code, tt {
font-size: 12px;
font-family: Consolas, "Liberation Mono", Courier, monospace;
}

code, tt {
margin: 0 0px;
padding: 0px 0px;
white-space: nowrap;
border: 1px solid #eaeaea;
background-color: #f8f8f8;
border-radius: 3px;
}

pre>code {
margin: 0;
padding: 0;
white-space: pre;
border: none;
background: transparent;
}

pre {
background-color: #f8f8f8;
border: 1px solid #ccc;
font-size: 13px;
line-height: 19px;
overflow: auto;
padding: 6px 10px;
border-radius: 3px;
}

pre code, pre tt {
background-color: transparent;
border: none;
}

kbd {
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
background-color: #DDDDDD;
background-image: linear-gradient(#F1F1F1, #DDDDDD);
background-repeat: repeat-x;
border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
border-image: none;
border-radius: 2px 2px 2px 2px;
border-style: solid;
border-width: 1px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
line-height: 10px;
padding: 1px 4px;
}

/* QUOTES
=============================================================================*/

blockquote {
border-left: 4px solid #DDD;
padding: 0 15px;
color: #777;
}

blockquote>:first-child {
margin-top: 0px;
}

blockquote>:last-child {
margin-bottom: 0px;
}

/* HORIZONTAL RULES
=============================================================================*/

hr {
clear: both;
margin: 15px 0;
height: 0px;
overflow: hidden;
border: none;
background: transparent;
border-bottom: 4px solid #ddd;
padding: 0;
}

/* TABLES
=============================================================================*/

table th {
font-weight: bold;
}

table th, table td {
border: 1px solid #ccc;
padding: 6px 13px;
}

table tr {
border-top: 1px solid #ccc;
background-color: #fff;
}

table tr:nth-child(2n) {
background-color: #f8f8f8;
}

/* IMAGES
=============================================================================*/

img {
max-width: 100%
}
-->

前些天准备写一个自己的博客CMS,考虑PHP框架的时候想到了据说非常强大的yii,接触yii时发现有2.0版本,果断尝最鲜的。这么一尝试感觉入了坑了,yii2.0是2014年12月发布的,估计国内用的人比较少,资料比较少,遇到问题百度yii2.0查出来好多1.0版本的答案,只好去google看英文站。一个小问题没人提醒,又是STACK OVERFLOW又是自己翻源码,弄了一天多。。。可谓是吃尽了苦头。

不过网站总算是做出来了,地址:http://www.alwayscoding.cn,以后博客在此站同步更新,而且,我也可以在上面肆无忌惮的放上自己喜欢的文章了~~另外源码也放在了github上,地址:https://github.com/zhenbianshu/blog-cms,有想使用本CMS的我可以提供支持~最后自己也总结出来了下列的使用心得,准备入手yii2.0的可以看一下,留个爪。


基础总结

1.修改默认控制器/方法

yii默认是site控制器,可以在web.php中设置$config中的'defaultRoute'='xxxx';使用自定义默认的控制器。也可以改写Yii::$app->defaultRoute属性。

yii的默认方法是index,可以在vender/yiisoft/yii2/base/Controller.php 中进行初始设置,也可以在控制器中改写defaltAction='action'。

2.添加独立模块

yii可以在modules文件夹中添加自定义模块,添加完成后在web.php中的$config中的'modules'=[id=..class=...]设置模块的开关。

模块一般用于一些独立的功能,像我站里的admin模块整体负责后台逻辑。

3.模型操作表设置

yii的模型有Model和ActiveRecord两种,Model类用来处理基本的业务逻辑,没有数据库相关方法,如果要操作同名数据表,请继承ActiveRecord类。

我们用一个在models文件夹中的Operation.class里Operation类来继承yii\db\ActiveRecord来操作Operation表。

如果要操作其他表,也可以重写public $tableName属性来设置。或改写其tableName方法(注意是静态方法) : public static function tableName(){return 'tableName'}

4.视图层构成

yii的视图层使用.php文件,而且其内部的实现也多采用yii内置小部件的形式,如<?= LinkPager::widget(['pagination'=>$pagination]) ?>来表示其分页类。

而且,像input这样的小部件,用ActiveForm类来展现,yii会对每个自动加入ajax验证,其一般的小部件都放在yii\widget\里,我们还可以在此文件夹里构建自定义的小部件类。

5.布局模式

yii会默认开启布局模式,其布局模板为view中的layout中的main.php,我们可以在veder/yiisoft/yii2/web/controller.php基础类中public $layout属性修改模板文件的配置。

我们还可以设置关闭或指定特定的layout:

  • 控制器内控制 public $layout=false/'layout'
  • 控制器成员方法内控制 $this->layout=false/'layout'
  • 视图中选择布局 $this->context->layout=false/'layout'

6.模型的基本设置

yii的模型是MVC的处理器,它执行对MVC逻辑的处理。 model的属性定义是其核心,由于默认定义魔术方法get/set,所以可以直接在model外调用$modle->attr='value',对模型的属性进行获取/赋值。

场景设置

yii中有对场景的定义,定义场景可以使得yii在不同的情况下返回不同的数据信息。用model的scenarios()方法来设置返回数据。

我们在使用model时传入场景名 $model=new Model(['scenario'=>'login']);来确定场景。

规则设置

yii中对验证规则的定义,使用rules()方法可以一条定义多条规则,也可以根据不同的场景进行定义。外部验证时用$model->validate()方法来执行验证。

在安全模式下,要进行安全验证,即每一个属性都要在rules里验证,如果没有特定规则,也要添加'safe'验证。否则验证失败,存入数据库也会失败。

标签设置

在处理表单时,多用$model->attributes属性来表示全部的属性。其中attributeLabels方法return一个数组用来表示视图层中ActiveForm产生的各个表单项的label标签

7.引用JS/CSS文件

yii中的view也使用面向对象方式 ,所以引入CSS和JS文件要用特殊的方法。

  • 使用$this->registerJsFile('js.js')来引入js文件;
  • 使用$this->registerJsFile('js.js')来引入js文件;

8.分页类的使用

//在模型中计算出总数量
$count=$this->find()->where()->count();
//用总条数和设定的每页个数实例化一个yii\data\Pagination类
$page=new Pagination([totalCount' => $count,'defaultPageSize'   => 2,]);
//使用分页类的属性搜索想要的数据,并返回数据
$res=$this->find()->where()->offset($page->offset)->limit($page->limit)->all();
return [$res,$page];
//使用控制器渲染页面
$data=$model->getData();
return $this->render('index',$data);
//在视图页面中使用数据。
foreach($res as key)...
yii\widgets\LinkPager::widget([pagination=$page,prevPageLabel='上一页'])。

9.创建url

use yii\helpers\Url;
Url::to(['xxx/xxx']);
//或
Yii::$app->urlManager->createUrl('xxx.xxx')

10查询构建器

yii里的QUERY查询语句构造器非常简单好用,它可以用在模型和控制器中,虽然可能会造成模型与表不对应,但其构成接近sql语句,使用它可以轻易写出复杂的sql语句而不必严格遵从yii的内置规则。

方法为:

$res=(new yii\db\Query())->select()->from()->leftJoin()->where->()->all();

其中where语句较为复杂:

where('in','id',$array)或where('id'=>$array)

具体可以查看http://www.yiichina.com/doc/guide/2.0/db-query-builder中对where方法的解析。

11.自定义函数

yii里面自定义函数可以在vendor/yiisoft/yii2/helpers/文件夹里,新建一个XXX.php文件,然后定义一个自定义类,再定义静态方法YYY()。

使用时应用基命名空间,use yii\helpers\XXX,然后用类来引用基静态方法XXX::YYY()

12.关联模型

yii里面的关联模型,用来在取得当前表内的一条记录时,会取出对应表的记录。如A表内每取出一条信息,也取出B表中跟A表对应有信息,在ModelA里定义一个getBtable方法

function getBtable()
{
    return $this->hasOne/hasMany(Btable::className,['bid'=>'aid']);
}

查询时可以使用joinWith('Btable')->find();会在查找时查找其关联对象;也可以使用$this->find()等方法结果对象

使用$res->btable来直接引用对象。

使用$res[n]->btable->attr来引用B表的对应属性。

13.使用ActiveForm创建表单

yii2中使用小部件创建view视图的步骤: 设置一个Model设置其属性

public $username;
public $password;

设置其rule或场景等

public function rules(){
    return [
            [['username', 'password','conpass'], 'required'],
            ['conpass', 'password',
        ];
}

设置其label

public function attributeLabels(){
        return [
            'username' => '管理员',
            'password' => '密码',
        ];
    }

然后在controller中将model的实例渲染进去:

$this->render('index',['model'=>(new Model/ActiveRecord)])

最后在页面中使用ActiveForm

use yii\widgets\ActiveForm;
<?php $form = ActiveForm::begin([
    'action' => ['log/login'],
    'method'=>'post'
    ]); ?>
    <?= $form->field($model, 'username') ?>
    <?= $form->field($model, 'password') ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>
<?php ActiveForm::end(); ?>

14.使用验证码

在controller中设置验证码的独立方法

public function actions() {
        return [
            'captcha' =>  [
                'class' => 'yii\captcha\CaptchaAction',
                'height' => 50,
                'width' => 80,
                'minLength' => 4,
                'maxLength' => 4
            ],
        ];
    }

在model里设置rule和label,label同上

public function rules(){
    return [['verifyCode', 'captcha','captchaAction'=>'admin/log/captcha'],];
}

(captchaAction要设置为controller中的位置,如果自定义module要设置module) 在view中使用

use yii\captcha\Captcha;
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(),
    ['captchaAction'=>'log/captcha',
        'imageOptions'=>
        ['alt'=>'点击换图', 'style'=>'cursor:pointer']
    ]) ?>

15.视图中块的使用

块内容在$this->beginBlock(['id'=>xxx])和$this->endBlock()之间定义,在layout中使用$view->block[id]来引用。可以在完成向模板中导入视图数据。

也可以定义$this->var=xxx;在layout中用$this->var来引用。

16.更新和删除

更新
//查找到一条结果
$res=$this->find()->where()->one();
//对结果修改
$res->attr='xxx';
//执行更新操作
$res->update();
删除
//删除一条数据
$this->findOne($id)->delete();
//删除所有符合条件的数据
$this->deleteAll([where]);

注意和窍门

1.URL模块间跳转

在模块中用Url::to()方法创建URL时,会自动在前面添加模块名,导致无法跳转到其他模块,我们可以在字符串前添加'//'符来返回根模块,例如Url::to(['//index/index'])表示跳转到初始地址。

2.初始化变量

想在控制器中每一个操作前,初始化一个变量的话不要重写__construct构造函数,因为它需要传入各种变量。最好重写beforeAction()函数,它会在执行每一个action时都执行一下。

并且注意:方法的最后一定要添加return true语句。

3.在JS中使用YII的变量

若想在JS中使用YII的URL变量等,可以使用html中的script标签,将变量在第一次渲染视图时预先解析出来,将下面代码放在需要使用变量的地方之前。

<script type="text/javascript">
    var key="<?=Url::to(['xxx/xxx']) ?>"
</script>

然后在JS文件中正常使用。

4.全局常量的定义

我们可以在config文件夹中的params.php中定义全局常量。

然后在脚本中用Yii::$app->params['key']来引用。

5.yii模型属性转数组

YII用toArray()方法可以将模型的属性转换为数组进行输出,可独立使用,也可以在查询时用连续操作方式使用。

6.在使用controller渲染view页面时,一定要在render前加echo或return 写作echo/return $this->render('view',$data);

7.yii中的属性,谨记!在ActiveForm中如果数据表中有了此字段,就不要再用public声明一个属性了,会导致attribute无法赋值。。。。(血泪)。

yii2开发后记的更多相关文章

  1. 网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述

    上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑 ...

  2. 网站实现微信登录之嵌入二维码——基于yii2开发的描述

    之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...

  3. yii2史上最简单式安装教程,没有之一

    写一篇绝对堪称史上最easy的Yii2安装教程教你入门. 既然是安装Yii,我们先去官网下载一份Yii的高级模版,什么,你说打开页面乱七八糟的英文字母你看不懂?那这样大哥,你按照下面的截图进行操作好吧 ...

  4. yii2干货

    Sites 网站 yiifeed:Yii 最新动态都在这里 yiigist:Yii 专用的 Packages my-yii:Yii 学习资料和新闻 Docs 文档 Yii Framework 2.0 ...

  5. [原]零基础学习在Android进行SDL开发系列文章

    [原]零基础学习SDL开发之移植SDL2.0到Android [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 [原]零基础学习SDL开发之在Android使用SDL2.0显示 ...

  6. Yii2之AR类的坑与总结

    本文主要记录本人从学习yii2到使用yii2开发项目过程中遇到的一些问题以及解决方法和知识点总结. 1. AR类关联哪个数据表? 默认情况下,AR类会根据类名称关联和类名相关的数据表,如:类名为Cou ...

  7. C 基于UDP实现一个简易的聊天室

    引言 本文是围绕Linux udp api 构建一个简易的多人聊天室.重点看思路,帮助我们加深 对udp开发中一些api了解.相对而言udp socket开发相比tcp socket开发注意的细节要少 ...

  8. Apache 流媒体 拖动模块编译

    Windows使用apxs独立编译 Apache 模块 http://blog.sina.com.cn/s/blog_43b83d340100mdhl.html 安装 apxs 1.解压apxs.zi ...

  9. YII相关资料(干货)

    Sites 网站 yiifeed:Yii 最新动态都在这里 yiigist:Yii 专用的 Packages my-yii:Yii 学习资料和新闻 Docs 文档 Yii Framework 2.0 ...

随机推荐

  1. SQL分组多列统计(GROUP BY后按条件分列统计)

    as tjsl from fyxx group by zt,whbmbh end) as ybhsl from fyxx group by whbmbh 下面是摘自别人的博客 最近遇到一个问题,需要对 ...

  2. 聊下git pull --rebase

    有一种场景是经常发生的. 大家都基于develop拉出分支进行并行开发,这里的分支可能是多到数十个.然后彼此在进行自己的逻辑编写,时间可能需要几天或者几周.在这期间你可能需要时不时的需要pull下远程 ...

  3. border

    1.border-width:不支持百分比值 支持下面属性值: thin:1px medium:3px thick:5px 2.border-style类型 solid:实线 dashed:虚线(方形 ...

  4. bzoj刷水

    因为最近的生活太颓废总是不做题而被老师D了一番, 所以今天晚上到bzoj上去刷了几道水题.....   bzoj 4320: ShangHai2006 Homework 题目大意 维护一个支持两个操作 ...

  5. java-装箱/拆箱-字符串转换成基本数据类型

    一.理解java中包的含义及种类 java是一个面向对象编程,即一切皆是对象,那么有一个矛盾,从数据上划分知道java中的数据分为基本数据类型和引用数据类型,但是基本数据类型如何是一个对象呢?此时,就 ...

  6. dp常见模型

    1.背包问题.0/1背包.完全背包.多重背包.分组背包.依赖背包. 2.子序列.最长非上升/下降子序列.最长先上升再下降子序列.最长公共子序列.最大连续子区间和. 3.最大子矩阵. 4.区间dp. 5 ...

  7. JSP out乱码

    在form method="post" 写post 在接受页面jsp代码前面加request.setCharacterEncoding("UTF-8");

  8. C# for和 foreach 的数组遍历 比较

    刚学习程序,感觉写代码 很有意思,所以把自己的感悟写下来啦,第一次写博客,可能是菜鸟中的菜鸟  时间久了,相信就会写的很好哦! for和 foreach 的数组遍历 比较 很简单的程序,不解释啦! u ...

  9. 【学习笔记】【C语言】循环结构-do while

    用法: while (条件) {     } do {   } while(条件);   while和do-while的区别 1.很多情况下,while和do while可以互换   2.while特 ...

  10. fancybox 点击 js脚本判断验证,fancybox的宽度高度设置

    当我们在使用fancybox做弹出窗口的时候,可能在弹窗之前就需要判断一些验证条件,例如我这里有个案例,用户必须先得勾选一个 那么怎么做呢?我们用到fancybox的一个onStart方法就可以了 $ ...