@octopus
2016-09-23T10:31:48.000000Z
字数 7107
阅读 1197
yii2
位置:app/models/Admin.phppublic 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.controllerpublic 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' => '确定删除该项?',] ) ;}],],],]);?>

// Controlleruse 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,]);}// Viewuse 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.phppublic 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.phppublic 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']];}
// Controllerif(...){return $this->goBack( Yii::$app->request->referrer );}