[关闭]
@octopus 2016-09-23T10:31:48.000000Z 字数 7107 阅读 943

课程:《Yii2打造电商平台》要点笔记

yii2


- 在模型文件的 rules 验证规则中,可以自定义验证规则

  1. 位置:app/models/Admin.php
  2. public function rules(){
  3. return [
  4. [['username', 'email', 'password'], 'required'],
  5. ['password', 'validatePass'], // password字段需要验证是否存在
  6. ];
  7. }
  8. public function validatePass(){
  9. if( !$this->hasError() ){
  10. $data = self.find()->where('username = :username and password = :password',
  11. [":username" => $this->username, ":password" => md5($this->passworld)])->one();
  12. if( is_null($data) ){
  13. $this->addError("password", "用户密码错误");
  14. }
  15. }
  16. }
  17. public function login($data){
  18. if( $this->load($data) && $this->validate() ){ // 加载成功并验证通过
  19. ...
  20. }
  21. }

- 关于 load() 与 validate()

- 自定义视图表单元素

链接:ActiveForm的使用方法详解
简而言之,一行 <?= $form->field($model,'username')->textInput(); 就可以自动生成三个玩意儿,1.label 2.input框 3. 错误信息(如果有的话),默认的模板是这样的:"{label}\n{input}\n{hint}\n{error}" 也就是像这样:效果图
所以如果有改变样式、不想label或错误显示的需求就要改默认模板。关键点: {label} {input} {error}

  1. <?php $form = ActiveForm::begin([
  2. 'id'=>'msg-form',
  3. 'options' => ['class'=>'form-horizontal'],
  4. 'enableAjaxValidation'=>false,
  5. 'fieldConfig' => [
  6. 'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
  7. 'labelOptions' => ['class' => 'col-lg-1 control-label'],
  8. ]
  9. ]);?>
  1. <?php $form = ActiveForm::begin([
  2. 'id' => 'login-form',
  3. 'options' => ['class' => 'form-horizontal'],
  4. 'fieldConfig' => [
  5. 'template' => '{error}{input}', // 所有表单字段的自定义模板格式
  6. ],
  7. ]); ?>
  8. <?php echo $form->field($model, 'user')->textInput(["class" => "xx", "placeholder" => "账号"]); ?>
  9. <?php echo $form->field($model, 'pass')->passwordInput(["class" => "xx", "placeholder" => "密码"]); ?>
  10. <a href="<?php echo yii\helpers\Url::to(['public/password']); ?>" class="forgot">忘记密码?</a>
  11. <?php echo $form->field($model, 'rememberMe')->checkbox([
  12. 'id' => 'remember-me',
  13. 'template' => '<div class="remember">{input}<label for="remember-me">记住我</label></div>',
  14. ]); ?>
  15. <?php echo Html::submitButton('登录', ["class" => "login"]); ?>
  16. <?php ActiveForm::end(); ?>

- 忘记密码的邮件验证

关键类: yii\swiftmailer\Mailer (配置文件有配置)

  1. // config/web.php 配置文件
  2. 'mailer' => [
  3. 'class' => 'yii\swiftmailer\Mailer',
  4. 'useFileTransport' =>false,
  5. 'transport' => [ // transport需要自行去Mailer文件中拷贝
  6. 'class' => 'Swift_SmtpTransport',
  7. 'host' => 'smtp.163.com',
  8. 'username' => 'imooc_shop@163.com',
  9. 'password' => 'imooc123',
  10. 'port' => '465',
  11. 'encryption' => 'ssl',
  12. ],
  13. ],
  14. // 类中使用mailer发送邮件
  15. $mailer = Yii::$app->mailer->compose('sendmail', ['username' => $name, 'time' => $time, 'token' => $token]);
  16. $mailer -> setFrom('imooc_shop@163.com');
  17. $mailer -> setTo($email);
  18. $mailer -> setSubject("找回密码"); // 主题
  19. if( $mailer -> send() ){
  20. return true;
  21. }
  22. // app/mail/sendmail.php
  23. <p>尊敬的 <?php echo $username ?> 您好,您的找回密码链接如下:</p>
  24. <?php $url = Yii::$app->urlManager->createAbsoluteUrl(['admin/manage/findpasswd', 'timestamp' => $time, 'username' => $username, 'token' => $token]); ?>
  25. <a href="<?php ehco $url?>"><?php ehco $url?></a>
  26. <p>该链接五分钟内有效,请勿传递给别人</p>
  27. // admin/manage.controller
  28. public function actionFindpasswd(){
  29. $time = Yii::$app->request->get("time");
  30. $username = Yii::$app->request->get("username");
  31. $token = Yii::$app->request->get("token");
  32. $checkToken = $model->createToken($time,$username); // 固定的生成token算法
  33. if $token != $checkToken || time()-$time > 300 ){
  34. $this->redirect(['public/login']);
  35. Yii::$app->end(); // 看详解
  36. }
  37. $model = new Admin;
  38. $model->adminuser = $username;
  39. return $this->render("chengePassword",['model' => $model]);
  40. }

1、注意: Yii::\$app->mailer->compose('sendmail', ['username' => $name]); 参数 sendmail 为邮件模板,是放在 app/mail/sendmail.php 中的。mail 目录下还有 layout 目录为通用模板文件。参数2为模板要用到的变量,和 rander 方法很像。
2、一定要传递token,不然谁都可以拿到链接修改密码。
3、createAbsoluteUrl 会生自动生成 www.xxx.com/index.php?r=admin/manage/findpasswd&timestamp=xxx&username=xxx&token=xxx
4、Yii::$app->end(); 表示终止程序;默认的表示正常终止,状态默认为0;其它状态均异常;redirect不能终止程序 必须使用return 或者 Yii::$app->end(); 终止程序。

- Activedataprovider 分页类的使用 & GridView 常用方法

  1. // Controller 中
  2. use yii\data\ActiveDataProvider; // 包含分页类
  3. use common\models\User;
  4. public function actionList()
  5. {
  6. $model = new User();
  7. $dataProvider = new ActiveDataProvider([
  8. 'query' => $model->find(),
  9. 'pagination => [
  10. 'pagesize' => '10',
  11. ]
  12. ]);
  13. return $this->render('list', ['model' => $model, 'dataProvider' => $dataProvider]);
  14. }
  15. // View 中
  16. use yii\grid\GridView;
  17. <?php echo GridView::widget([
  18. 'dataProvider' => $dataProvider,
  19. 'columns' => [ // 编辑各个列
  20. ['class' => 'yii\grid\CheckboxColumn'], // 列表勾选框
  21. ['class' => 'yii\grid\SerialColumn'], // 在例头添加排序
  22. 'name', // $model 中的 name字段
  23. 'email', // $model 中的 email字段
  24. 'time:datetime', // 时间戳转化为时间格式显示
  25. [
  26. 'attribute' => 'isshow', // 显示状态,且带过滤
  27. 'label' => '状态',
  28. 'value' => function($model) {
  29. return $model->isshow == 0 ? '锁定' : '活跃';
  30. },
  31. 'filter' => [
  32. 0 => '锁定',
  33. 1 => '活跃'
  34. ]
  35. ],
  36. [
  37. 'class' => 'yii\grid\ActionColumn', // 自定义按钮
  38. 'template' => '{test} {view} {update} {delete}',
  39. 'header' => '操作',
  40. 'buttons' => [
  41. 'test' => function ($url, $model, $key) {
  42. return Html::a('测试按钮', $url, ['data-method' => 'post','data-pjax'=>'0'] );
  43. },
  44. 'delete'=> function ($url, $model, $key){
  45. return Html::a('删除', ['delete', 'id'=>$model->id],[
  46. 'data-method'=>'post',
  47. 'data-confirm' => '确定删除该项?',
  48. ] ) ;
  49. }
  50. ],
  51. ],
  52. ],
  53. ]);
  54. ?>

效果图

- Pagination 分页类的使用

  1. // Controller
  2. use yii\data\Pagination;
  3. use app\models\User;
  4. public function actionComment(){
  5. $data = User::find()->all();
  6. $pages = new Pagination(['totalCount' =>$data->count(), 'pageSize' => '10']);
  7. $model = $data->offset($pages->offset)->limit($pages->limit)->all();
  8. return $this->render('comment',[
  9. 'model' => $model,
  10. 'pages' => $pages,
  11. ]);
  12. }
  13. // View
  14. use yii\widgets\LinkPager;
  15. foreach($model as $val){
  16. 遍历数据...
  17. }
  18. <?= LinkPager::widget(['pagination' => $pages, 'prevPageLabel' => '&#8249', 'nextPageLabel' => '&#8250']); ?>

- QQ登录

步骤:
1. 申请QQ互联APP账号
2. 下载SDK,配置APP账号
3. 接入项目

到 connect.qq.com 进行 注册,等待审核成功后即可看到应用名称、APPID。

注册

点击创建应用,填写应用网址(不可以填ip地址),和回调地址。

创建成功以后就会获得 APP IDAPP KEY

到文档资料下载 SDK 文档资料下载 PHP-SDK

PHP-SDK 如下图:

配置 SDK 信息,将文件夹放在服务器下,访问 index.php,就会出现配置页面,填写好后就会自动生成配置信息 (API/comm/config.php),里面会有APP IDAPP KEY 以及 callback 登录成功以后的回调页面等

将 API 文件夹放到 yii 框架的 vendor 文件夹下,并改名为 qqlogin

  1. // views/site/login.php
  2. <button id="login_qq" >qq登录</button>
  3. <script>
  4. var qqbtn = document.getElementById("login_qq");
  5. qqbtn.onclick = function(){
  6. window.location.href = "<?php echo yii\helpers\Url::to(['site/qqlogin']) ?>";
  7. }
  8. </script>
  9. // Controllers/siteController.php
  10. public function actionQqlogin(){
  11. require_once("../vendor/qqlogin/qqConnectAPI.php");
  12. $qc = new \QC();
  13. $qc->qq_login(); // 就可以立刻跳转到qq账号登录页面
  14. }

跳转到登录页面若本机已登录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

具体怎么写呢?

  1. // Controllers/siteController.php
  2. public function actionQqcallback(){
  3. require_once("../vendor/qqlogin/qqConnectAPI.php");
  4. $auth = new \OAuth();
  5. $access_token = $auth->qq_callback();
  6. $openid = $auth->get_openid();
  7. $qc = new \QC($access_token, $openid);
  8. $user_info = $qc->get_user_info();
  9. // 通过 var_dump($user_info)可以看到返回的是用户信息的数组,有昵称、性别、城市、出生日期、各种大小的头像等。
  10. }

获取信息以后就可以对用户增删改查了。注意上文中的 $openid 是腾讯返回的用户唯一标识,可以在用户表中增加 openid 字段用来检查是否已绑定本网站。

注:看下图可以发现,引入了 qqConnectAPI.php 就是引入了 Qc.class.php,而 QC类 又继承了 Oath类,所以最终我们可以通过包含这一个文件来使用 Oath类 提供的方法


- 零散的知识

确认密码的 rules 验证规则

  1. public function rules(){
  2. return [
  3. ['repasswd', 'compare', 'compareAttribute' => 'passwd']
  4. ];
  5. }

URL回到上一页

  1. // Controller
  2. if(...){
  3. return $this->goBack( Yii::$app->request->referrer );
  4. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注