编写Yii框架项目时出现的问题

前言

记录一下编写Yii框架中项目的问题,也可以说是边学习边记录,有点乱,但是自己看得懂就好

正文

web应用根目录下

asset包含yii发布的各种资源文件包括js和css

多用公共模板文件去加载,不多过多去冗余,注意在views文件夹下创建跟controller一样名字的视图文件夹

注意在某些资源文件调进asset文件夹的时候需要修改路径,一般都是要搜索像img script css之类的关键字

复习一下循环将所有内容输出的格式

1
2
3
4
5
6
7
8
9
<?php foreach($a as $b): ?>
<td>
<?php echo $b;?>
</td>


...
//把各部分元素输出就好,这里不一定单单就是$b,也可能是$b->某个元素
<?php endforeach;?>

在新建modules时候我们需要gii脚手架的帮助,这个选项在web.php里面,一般默认开启,需要对他有权限就需要加上你的ip,添加一个allowedIPs选项,如下图
CHkkad.png
CHkAIA.png
CHkVPI.png

新建的modules

这相当于一个小型的Yii框架我感觉。。。。里面也有一个小型的mvc
然后我们还需要在web.php加上相应的modules模块
CHkKsS.png
他好像默认调用的布局文件好像是view里面的layouts/main.php
自己调一下就好了

另外填写命名空间的时候还需要改一下namespace app\modules\controllers;相当于增加了modules

Yii2下的文件一般都是框架重要的配置文件,我们可以在里面的web/application 找到public defaultRoute是指定默认的主页路径的,一般最后开发的时候会把原来的布局给删掉,所以这个参数一般要改,但是我们不会选择直接改,改了Yii框架源码最后检错的时候会有点艰难,而是在web.php这个配置文件中修改,直接添加对应的参数名字就好,如下图
CHkuM8.png

创建SQL文件

这里的comment后面的内容是说明,这里还学到一种使用数据库的新模式,UNIQUE约束,这个东西相当于设定一个对应的SET查询,我猜中间那里应该是SQL约束的名字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DROP TABLE IF EXISTS`shop_admin`;
CREATE TABLE IF NOT EXISTS`shop_admin`(
`adminid`INT UNSIGNED NOT NULL AUTO_INCREMENTCOMMENT'主键ID',
`adminuser`VARCHAR(32) NOT NULL DEFAULT '' COMMENT'管理员帐号',
`adminpass`CHAR(32)NOT NULL DEFAULT '' COMMENT'管理员密码',
`adminemail`VARCHAR(50)NOT NULL DEFAULT '' COMMENT'管理员邮箱',
`logintime`INT UNSIGNED NOT NULL DEFAULT '0' COMMENT'登录时间',
`loginip` BIGINT NOT NULL DEFAULT '0' COMMENT'登录IP',
`createtime` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT'创建时间',
PRIMARY KEY(`adminid`),
UNIQUE shop_admin_adminuser_adminpass(`adminuser`,`adminpass`),
UNIQUE shop_admin_adminuser_adminemail(`adminuser`,`adminemail`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO`shop_admin`(adminuser,adminpass,adminemail,createtime)VALUES('admin',md5('123'),'test@163.com',UNIX_TIMESTAMP());

然后导进数据库文件
注意字节的数据库文件名的列名是否一致,我他么找了很久才找到自己哪里错了

在后台创建models模块,一般不要选择直接在大框架下的models文件夹创建,因为我们得将后天跟前台分离开,别让它们互相影响。。

一般情况下创建的数据库的类名跟表名一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
namespace app\modules\models;
use yii\db\ActiveRecord;


class Admin extends ActiveRecord
{
public static function tableName()
{
return "{{%admin}}"; //这里不用shop_前缀是因为我们在配置数据库文件已把前缀给设定好,可以用左面的方式去写
}


}

然后再在对应的登录页面去把对应的类给调用,并且创建,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php


namespace app\modules\controllers;
use yii\web\Controller;
use app\modules\models\Admin;


class PublicController extends Controller
{
public function actionLogin()
{
$this ->layout = false;
$models = new Admin;
return $this->render("login",['models'=>$models]); //一定要注意返回,经常忘记

}

}

然后去到后台登录页面的HTML代码,首行加载

1
2
3
<?php
use yii\bootstrap\ActiveForm;
?>

这个类有帮助创建form组件
然后在对应部分添加相应的代码

表单操作对应文章

http://www.jb51.net/article/77754.htm

然后我们把对应的静态的input标签给删除掉,还有对应的说明也给删掉,下面再讲
注意他们对应的类型去修改,这里是因为’记住我‘的那一个选项引出来的点,因为他的类型是CheckBox,并且一般来说field函数的第二个参数一般是默认以数据库里面的字段去设置的,所以不存在记住我的这一个选项,我们还需要在models里面添加一个参数rememberMe设定为true就是默认勾选的。。。但是这个CheckBox的复杂性,还存在div属性,于是我们既可以利用yii框架提供给我们的template去完成,所以单独有input属性就比较简单点,直接就是在某在类型的标签里写上对应的东西即可

在提交按钮下,这里就不适用field函数了,用另外的方法实现,用的是Html的类,其实写法也差不多

首先我们得在前面添加相应的模块,这里一定要记得,我这里忘了调了很久
use yii\Helpers\Html;
对比一下就知道怎么写了

1
2
<?php echo Html::submitButton("登录",["class"=>"btn-glowprimarylogin",]);?>
<aclass="btn-glowprimarylogin"href="index.html">登录</a>

到最后还得把刚才多出来的标签给弄掉,但是我们每个区添加template就会很烦,所以
我们直接在begin那部分实现

1
2
3
4
5
6
<?php 
$form=ActiveForm::begin([
'fieldConfig'=>[
'template'=>'{input}'
]
]);?>

最终效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php $form=ActiveForm::begin([
'fieldConfig'=>[
'template'=>'{input}'
]
]);?>
<div class="span4box">
<div class="content-wrap">
<h6>二手商城-后台管理</h6>
<?php echo $form->field($models,'adminuser')->textInput(["class"=>"span12","placeholder"=>"管理员帐号"]);?>
<?php echo $form->field($models,'adminpass')->passwordInput(["class"=>"span12","placeholder"=>'管理员密码']);?>
<a href="#"class="forgot">忘记密码?</a>
<?php echo $form->field($models,'rememberMe')->checkbox([
"id"=>"remember-me",
"template"=>"<div class=\"remember\">{input}<labelfor=\"remember-me\">记住我</label></div>",
]);?>
<?php echo Html::submitButton('登录',["class"=>"btn-glowprimarylogin",]);?>
</div>
</div>
<?php ActiveForm::end();?>

管理后台不需要注册,记得要删除,否则出啥问题后果自负了,hiahia
注意这里的models要对应你在render里面的‘models’参数

对于后台登录页面注意接收数据的页面,然后我们在里面利用yii框架的request模块了,千万要记得记得前面加上use Yii,
我们就可以在下面用这样的语句去判断

1
if(Yii::$app->request->isPost)

我们还可以利用定义函数rules去定义规则,这个规则在调用validate的时候会调用
详情可以看一下下面的链接
https://blog.csdn.net/luze_1226/article/details/65633923

1
2
3
4
5
6
7
8
9
Public function rules()
{
return[
['adminuser','required','message'=>'管理员账号不能为空'],
['adminpass','required','message'=>'管理员密码不能为空'],
['rememberMe','boolean'],
['adminpass','validatePass'],
];
}

但密码检验没有对应的方法,所以得自定义一个validatePass,也就是说规则是有一部分可以自定义的

1
2
3
4
5
6
7
8
9
10
11
public function validatePass() //数据的验证
{
if(!$this->hasErrors())
{
$data = self::find()->where('adminuser=:user and adminpass=:pass',[":user"=>$this->adminuser,":pass"=>md5($this->adminpass)])->one();
if(isNull($data)) //判断数据是否为空
{
$this->addError("adminpass","用户名或者密码错误!");
}
}
}

这样login里面就可以做点有意义的事情了,但是如果想让后台页面显示错误信息的话我们只需要在模板文件里面的begin里面的template{input}的前面或者后面添加{error}即可,位置任选哪里好看放哪里

生成动态url

1
<a href="<?php  echo yii\Helpers\Url::to(['public/logout']); ?>" role="button">

Yii::$app->end();这句在跳转之后的作用看一看下面这个网址,相当于die操作
http://www.yiichina.com/question/2182

在某个models里的这个东西if($this->load($data)&& $this->validate())
可以看下面的链接http://www.yiichina.com/question/955
先是load是填充规则里面的东西,而validate就是用来检查规则的
但是一旦rules规则多起来,调用的时候会把规则里面的东西全检查一遍,非常耗时。。此时要增加场景来提高效率
在每个自定义的检查函数里面添加$this->scenario = "yourname",并且在规则里面添加on参数去规定场景

1
['adminuser','required','message'=>'管理员账号不能为空','on'=>['login','seekpass']]

Email发送类操作

在web.php里面找到mailer这个选项,这个东西就是对email发送的设置、邮箱的配置详情看
https://blog.csdn.net/cjqh_hao/article/details/48501897
http://www.yiichina.com/tutorial/320

还要记得配置里面的password填写的是授权密码啊。。。。。。真心累这东西,解决方案
http://www.yii-china.com/post/detail/10.html

注意在发送邮件的函数中也就是mailer函数调用compose参数的view参数千万不能忘记,一定要在mail文件夹下新建你对应的视图文件,不要像我一样直接在layouts里面新建了。。。而且这里面的内容就是你发送邮件的内容,里面有个函数也要注意一下

1
Yii::$app->session->setFlash('info','电子邮件已经发送成功,请查收');

这句话不要忘记在对应的视图文件里面加上,我自己是public下面的seekpassword.php文件

1
2
3
<?php if(Yii::$app->session->hasFlash('info')){
echo Yii::$app->session->getFlash('info');
}?>

不然不会出现成功的信息的,这里真的是对yii框架太不熟悉了,只能在项目完成过程中慢慢摸索

分页处理

运用了yii框架下的的一个组件
在对应的控制器里面加上use yii\data\Pagination;

1
2
3
4
5
6
$model = Admin::find();
$count = $model->count();
$pageSize = Yii::$app->params['pageSize']['manage'];
$pager = new Pagination(['totalCount'=> $count, 'pageSize'=> $pageSize]);
$managers = $model->offset($pager->offset)->limit($pager->limit)->all();
return $this->render("managers",['managers'=>$managers,'pager'=> $pager]);

这里面把查找的内容放进新建的Pagination对象里面,对应的pageSize里面的设置是分页,可以预先放进设置文件params里面,再通过调用Yii::$app->params的方式去实现就好

记得要在对应的视图文件里面添加分页的输出语句

1
<?php echo yii\widgets\LinkPager::widget(['pagination' => $pager, 'prevPageLabel'=> '&#8249;','nextPageLabel' => '&#8250;']);?>

后面的两个Label参数只是图标的形状,随意就好


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. 前言
  2. 2. 正文
    1. 2.1. web应用根目录下
    2. 2.2. 复习一下循环将所有内容输出的格式
    3. 2.3. 新建的modules
    4. 2.4. 创建SQL文件
    5. 2.5. 表单操作对应文章
    6. 2.6. 生成动态url
    7. 2.7. Email发送类操作
    8. 2.8. 分页处理