@octopus
2016-09-23T18:31:48.000000Z
字数 7107
阅读 1040
yii2
位置:app/models/Admin.php
public function rules(){
return [
[['username', 'email', 'password'], 'required'],
['password', 'validatePass'], // password字段需要验证是否存在
];
}
public function validatePass(){
if( !$this->hasError() ){
$data = self.find()->where('username = :username and password = :password',
[":username" => $this->username, ":password" => md5($this->passworld)])->one();
if( is_null($data) ){
$this->addError("password", "用户密码错误");
}
}
}
public function login($data){
if( $this->load($data) && $this->validate() ){ // 加载成功并验证通过
...
}
}
链接:ActiveForm的使用方法详解
简而言之,一行 <?= $form->field($model,'username')->textInput();
就可以自动生成三个玩意儿,1.label 2.input框 3. 错误信息(如果有的话),默认的模板是这样的:"{label}\n{input}\n{hint}\n{error}"
也就是像这样:
所以如果有改变样式、不想label或错误显示的需求就要改默认模板。关键点: {label}
{input}
{error}
<?php $form = ActiveForm::begin([
'id'=>'msg-form',
'options' => ['class'=>'form-horizontal'],
'enableAjaxValidation'=>false,
'fieldConfig' => [
'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
'labelOptions' => ['class' => 'col-lg-1 control-label'],
]
]);?>
<?php $form = ActiveForm::begin([
'id' => 'login-form',
'options' => ['class' => 'form-horizontal'],
'fieldConfig' => [
'template' => '{error}{input}', // 所有表单字段的自定义模板格式
],
]); ?>
<?php echo $form->field($model, 'user')->textInput(["class" => "xx", "placeholder" => "账号"]); ?>
<?php echo $form->field($model, 'pass')->passwordInput(["class" => "xx", "placeholder" => "密码"]); ?>
<a href="<?php echo yii\helpers\Url::to(['public/password']); ?>" class="forgot">忘记密码?</a>
<?php echo $form->field($model, 'rememberMe')->checkbox([
'id' => 'remember-me',
'template' => '<div class="remember">{input}<label for="remember-me">记住我</label></div>',
]); ?>
<?php echo Html::submitButton('登录', ["class" => "login"]); ?>
<?php ActiveForm::end(); ?>
关键类: yii\swiftmailer\Mailer
(配置文件有配置)
// config/web.php 配置文件
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' =>false,
'transport' => [ // transport需要自行去Mailer文件中拷贝
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.163.com',
'username' => 'imooc_shop@163.com',
'password' => 'imooc123',
'port' => '465',
'encryption' => 'ssl',
],
],
// 类中使用mailer发送邮件
$mailer = Yii::$app->mailer->compose('sendmail', ['username' => $name, 'time' => $time, 'token' => $token]);
$mailer -> setFrom('imooc_shop@163.com');
$mailer -> setTo($email);
$mailer -> setSubject("找回密码"); // 主题
if( $mailer -> send() ){
return true;
}
// app/mail/sendmail.php
<p>尊敬的 <?php echo $username ?> 您好,您的找回密码链接如下:</p>
<?php $url = Yii::$app->urlManager->createAbsoluteUrl(['admin/manage/findpasswd', 'timestamp' => $time, 'username' => $username, 'token' => $token]); ?>
<a href="<?php ehco $url?>"><?php ehco $url?></a>
<p>该链接五分钟内有效,请勿传递给别人</p>
// admin/manage.controller
public function actionFindpasswd(){
$time = Yii::$app->request->get("time");
$username = Yii::$app->request->get("username");
$token = Yii::$app->request->get("token");
$checkToken = $model->createToken($time,$username); // 固定的生成token算法
if( $token != $checkToken || time()-$time > 300 ){
$this->redirect(['public/login']);
Yii::$app->end(); // 看详解
}
$model = new Admin;
$model->adminuser = $username;
return $this->render("chengePassword",['model' => $model]);
}
1、注意:
Yii::\$app->mailer->compose('sendmail', ['username' => $name]);
参数sendmail
为邮件模板,是放在app/mail/sendmail.php
中的。layout
目录为通用模板文件。参数2为模板要用到的变量,和rander
方法很像。
2、一定要传递token,不然谁都可以拿到链接修改密码。
3、createAbsoluteUrl
会生自动生成www.xxx.com/index.php?r=admin/manage/findpasswd×tamp=xxx&username=xxx&token=xxx
4、Yii::$app->end();
表示终止程序;默认的表示正常终止,状态默认为0;其它状态均异常;redirect不能终止程序 必须使用return 或者 Yii::$app->end(); 终止程序。
// Controller 中
use yii\data\ActiveDataProvider; // 包含分页类
use common\models\User;
public function actionList()
{
$model = new User();
$dataProvider = new ActiveDataProvider([
'query' => $model->find(),
'pagination => [
'pagesize' => '10',
]
]);
return $this->render('list', ['model' => $model, 'dataProvider' => $dataProvider]);
}
// View 中
use yii\grid\GridView;
<?php echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [ // 编辑各个列
['class' => 'yii\grid\CheckboxColumn'], // 列表勾选框
['class' => 'yii\grid\SerialColumn'], // 在例头添加排序
'name', // $model 中的 name字段
'email', // $model 中的 email字段
'time:datetime', // 时间戳转化为时间格式显示
[
'attribute' => 'isshow', // 显示状态,且带过滤
'label' => '状态',
'value' => function($model) {
return $model->isshow == 0 ? '锁定' : '活跃';
},
'filter' => [
0 => '锁定',
1 => '活跃'
]
],
[
'class' => 'yii\grid\ActionColumn', // 自定义按钮
'template' => '{test} {view} {update} {delete}',
'header' => '操作',
'buttons' => [
'test' => function ($url, $model, $key) {
return Html::a('测试按钮', $url, ['data-method' => 'post','data-pjax'=>'0'] );
},
'delete'=> function ($url, $model, $key){
return Html::a('删除', ['delete', 'id'=>$model->id],[
'data-method'=>'post',
'data-confirm' => '确定删除该项?',
] ) ;
}
],
],
],
]);
?>
// Controller
use yii\data\Pagination;
use app\models\User;
public function actionComment(){
$data = User::find()->all();
$pages = new Pagination(['totalCount' =>$data->count(), 'pageSize' => '10']);
$model = $data->offset($pages->offset)->limit($pages->limit)->all();
return $this->render('comment',[
'model' => $model,
'pages' => $pages,
]);
}
// View
use yii\widgets\LinkPager;
foreach($model as $val){
遍历数据...
}
<?= LinkPager::widget(['pagination' => $pages, 'prevPageLabel' => '‹', 'nextPageLabel' => '›']); ?>
步骤:
1. 申请QQ互联APP账号
2. 下载SDK,配置APP账号
3. 接入项目
到 connect.qq.com 进行 注册,等待审核成功后即可看到应用名称、APPID。
点击创建应用,填写应用网址(不可以填ip地址),和回调地址。
创建成功以后就会获得 APP ID
与 APP KEY
到文档资料下载 SDK 文档资料、 下载 PHP-SDK
PHP-SDK 如下图:
配置 SDK 信息,将文件夹放在服务器下,访问 index.php,就会出现配置页面,填写好后就会自动生成配置信息 (API/comm/config.php),里面会有APP ID
与 APP KEY
以及 callback
登录成功以后的回调页面等
将 API 文件夹放到 yii 框架的 vendor 文件夹下,并改名为 qqlogin
// views/site/login.php
<button id="login_qq" >qq登录</button>
<script>
var qqbtn = document.getElementById("login_qq");
qqbtn.onclick = function(){
window.location.href = "<?php echo yii\helpers\Url::to(['site/qqlogin']) ?>";
}
</script>
// Controllers/siteController.php
public function actionQqlogin(){
require_once("../vendor/qqlogin/qqConnectAPI.php");
$qc = new \QC();
$qc->qq_login(); // 就可以立刻跳转到qq账号登录页面
}
跳转到登录页面若本机已登录qq,则可点击头像进行登录,若本机没有登录qq则需要填写用户名密码进行登录。登陆成功以后就会跳转到配置文件中的 callback URL (假如我们配置的是 site/qqcallback)。
下面我们要做的就是获取用户信息,来查看是否与网站账号进行过绑定。如何获取用户信息呢?这离不开 API/class 中的几个类。
Qc.class.php
可以通过其中的 get_info
获取用户信息
但是,初始化 QC 类需要传入 $access_token
与 $openid
而这两个内容可以通过 Oauth类
进行获取
Oauth.class.php
分别可以通过 qq_callback()
与 get_openid()
获取到 $access_token
与 $openid
具体怎么写呢?
// Controllers/siteController.php
public function actionQqcallback(){
require_once("../vendor/qqlogin/qqConnectAPI.php");
$auth = new \OAuth();
$access_token = $auth->qq_callback();
$openid = $auth->get_openid();
$qc = new \QC($access_token, $openid);
$user_info = $qc->get_user_info();
// 通过 var_dump($user_info)可以看到返回的是用户信息的数组,有昵称、性别、城市、出生日期、各种大小的头像等。
}
获取信息以后就可以对用户增删改查了。注意上文中的 $openid
是腾讯返回的用户唯一标识,可以在用户表中增加 openid
字段用来检查是否已绑定本网站。
注:看下图可以发现,引入了
qqConnectAPI.php
就是引入了Qc.class.php
,而QC类
又继承了Oath类
,所以最终我们可以通过包含这一个文件来使用Oath类
提供的方法
public function rules(){
return [
['repasswd', 'compare', 'compareAttribute' => 'passwd']
];
}
// Controller
if(...){
return $this->goBack( Yii::$app->request->referrer );
}