Yii2.0框架学习笔记

待我称王封你为后i 2022-02-23 07:22 361阅读 0赞

1、Yii框架工作流程(MVC文件后缀都是php):
models文件夹下建模型,写AR类、对应数据库相关表、定义属性标签、写验证规则、保存表之前调用的方式,用于保存非表单获取的默认数据(如添加数据的时间等,此步如不需要可省略)->controllers文件夹下建控制器、写保存表单的动作->views文件夹下建模板,动态显示视图。

2、YII中各种类
模型中添加:

  1. use yii\base\Model;
  2. use yii\db\ActiveRecord; //活动记录,简称AR,用于访问数据库,一个AR类关联一张数据表
  3. use yii\web\IdentityInterface; //认证接口,登录(身份接口)

控制器中添加:

  1. use yii\web\Controller;
  2. use frontend\models\Test; //引入前台模型中的AR类
  3. use yii\helpers\Url; //url助手类
  4. use Yii; //使用这个后,在控制器动作中的\Yii::$app可以直接写成Yii::$app
  5. use backend\models\Product; //调用后台产品模型类
  6. use yii\data\Pagination; //分页类
  7. use backend\models\UploadForm; //上传模型类
  8. use yii\web\UploadedFile; //上传功能类
  9. use yii\filters\AccessControl; //授权类

视图中添加:

  1. use yii\helpers\Url; //url助手类,用于生成URL
  2. use yii\widgets\ActiveForm; //借助小部件,动态生成表单(创建表单类)
  3. use yii\widgets\LinkPager; //显示分页类
  4. <?php
  5. $this->title="首页"; //定义页面title名称,用于布局中
  6. //$this->title = $info->title; //设置页面标题,同上方
  7. //<link rel="stylesheet" type="text/css" href="css/ssss.css"/>
  8. //$this->registerCssFile('css/ssss.css'); //添加css到布局中,布局中要有$this->head();meta标签和link标签, 需要调用此方法动态生成
  9. //<script src="js/aa.js"></script>
  10. //$this->registerJsFile('js/aa.js'); //加载到布局中$this->endBody()这个位置,</body>前
  11. /*
  12. 添加关键词和简介标签
  13. <meta name="keywords" content="">
  14. <meta name="description" content="">
  15. */
  16. //$this->registerMetaTag(['name'=>'keywords','content'=>'网站关键字']);
  17. //$this->registerMetaTag(['name'=>'description','content'=>'简介']);
  18. ?>

3、使用布局-包含文件

  1. public $layout = 'main'; //属性-使用布局-包含文件,不想使用布局设置false

4、视图中调用视图-相当于包含文件

  1. <?= $this->render('/index/_leftlxwm'); ?> //视图中调用视图

5、模型中的写法

  1. <?php
  2. namespace frontend\models;
  3. use yii\db\ActiveRecord;
  4. //模型命名不用带有model和.class
  5. class Msg extends ActiveRecord {
  6. //设定对应表,如果此步省略, 代表表名和类名一致(表前缀,在配置中设置)
  7. public static function tableName() {
  8. return '{
  9. {%msg}}'; //return 'msg';表名,如果配置里设置了表前缀,那么{
  10. {%msg}}是给msg表加前缀的
  11. }
  12. //定义属性标签,固定函数
  13. public function attributeLabels() {
  14. return[
  15. 'title' => '留言主题',
  16. 'sex' => '性别',
  17. 'tel' => '联系电话',
  18. 'lxr' => '联系人',
  19. 'content' => '留言内容'
  20. ];
  21. }
  22. //验证规则,固定函数
  23. public function rules() {
  24. return[
  25. [['title','sex','tel','lxr','content'],'required','message' => '{attribute}不能为空'],
  26. ['title','string','min' => 4,'max' => 30,'tooShort' => '{attribute}最小长度必须在4个字以上','tooLong' => '{attribute}最大长度必须在30个字以内'],
  27. ['tel','match','pattern' => '/^1[34578]\d{9}$/','message' => '手机格式不正确'],
  28. ['lxr','match','pattern' => '/^[\x{4e00}-\x{9fa5}]+$/u','message' => '{attribute}只能使用中文'],
  29. ['content','string','min' => 10,'max' => 140,'tooShort' => '{attribute}最小长度必须在10个字以上','tooLong' => '{attribute}最大长度必须在140个字以内']
  30. ];
  31. }
  32. //保存表之前调用的方式,用于保存非表单获取的默认数据,此步不需要时可省略
  33. public function beforeSave($insert) {
  34. if(parent::beforeSave($insert)) {
  35. if($insert) { //插入,即新增
  36. //属性对应表中字段
  37. $this->status = 0;
  38. $this->ip = \Yii::$app->request->getUserIP(); //获取访问者IP
  39. $this->add_time = time();
  40. return true;
  41. } else { //修改
  42. $this->edit_time = time();
  43. return true;
  44. }
  45. } else { //非添加和修改
  46. return false;
  47. }
  48. }
  49. }
  50. /*
  51. * 上传模型类
  52. */
  53. <?php
  54. namespace backend\models;
  55. use yii\base\Model;
  56. class UploadForm extends Model {
  57. //定义属性,表单中上传控件名
  58. public $img;
  59. public function attributeLabels() {
  60. return [
  61. 'img' => '上传图片'
  62. ];
  63. }
  64. public function rules() {
  65. return [
  66. ['img', 'file', 'extensions' => 'png, jpg'], //上传文件扩展名
  67. ['img', 'file', 'mimeTypes' => 'image/jpeg, image/png'], //上传文件类型
  68. ['img', 'file', 'minSize' => '30720', 'tooSmall' => '{attribute}不能小于30Kb'], //单位字节
  69. ['img', 'file', 'maxSize' => '512000', 'tooBig' => '{attribute}不能大于500Kb'],
  70. ];
  71. }
  72. }
  73. /*
  74. * 登陆模型类
  75. */
  76. <?php
  77. namespace backend\models;
  78. use yii\db\ActiveRecord;
  79. use yii\web\IdentityInterface; //认证接口
  80. class Login extends ActiveRecord implements IdentityInterface {
  81. //定义属性对应表单(表中不存在的字段,临时使用的)
  82. public $rel = true; //记住我,默认勾选
  83. public $_user; //保存查询的用户信息
  84. public static function tableName() {
  85. return 'user';
  86. }
  87. public function attributeLabels() {
  88. return [
  89. 'username' => '用户名',
  90. 'pwd' => '密码',
  91. 'rel' => '记住我'
  92. ];
  93. }
  94. public function rules() {
  95. return [
  96. [['username','rel', 'pwd'], 'required', 'message' => '{attribute}不能为空'],
  97. ['pwd', 'checkLogin'] //调用方法实现验证用户+密码
  98. ];
  99. }
  100. //checkLogin方法(验证用户名和密码是否正确($attribute对应值为pwd))
  101. public function checkLogin($attribute) { //self::即当前类
  102. $this->_user = self::findOne(['username' => $this->username, 'pwd' => md5($this->pwd), 'status' => 0]); //查询,保存查询结果
  103. if ($this->_user) { //登陆成功
  104. //记录上次登录时间
  105. \Yii::$app->session->set('login_time', $this->_user->login_time); //使用session
  106. //更新数据,登录时间,登录次数,登录IP
  107. self::updateAll(['login_time' => time(), 'login_num' => ($this->_user->login_num + 1), 'ip' => \Yii::$app->request->getUserIP()], ['username' => $this->username]);
  108. } else {
  109. $this->addError($attribute, '用户名或密码错误!');
  110. }
  111. }
  112. //验证登录信息,保存登录状态
  113. public function login() {
  114. if ($this->validate()) { //使用rules定义的规则进行验证
  115. //保存登录信息(有效期1个月)
  116. return \Yii::$app->user->login($this->_user, $this->rel ? 3600 * 24 * 30 : 0); //参数:用户对象,有效期单位秒
  117. } else { //验证失败
  118. return false;
  119. }
  120. }
  121. //以下就是固定格式,必须在验证模型中,实现接口中定义的方法
  122. /**
  123. * @return int|string 当前用户ID
  124. */
  125. public function getId() {
  126. return $this->id;
  127. }
  128. /**
  129. * 根据给到的ID查询身份。
  130. *
  131. * @param string|integer $id 被查询的ID
  132. * @return IdentityInterface|null 通过ID匹配到的身份对象
  133. */
  134. public static function findIdentity($id) {
  135. return static::findOne($id);
  136. }
  137. /**
  138. * 根据 token 查询身份。不使用token认证,方法体内代码可以删除
  139. *
  140. * @param string $token 被查询的 token
  141. * @return IdentityInterface|null 通过 token 得到的身份对象
  142. */
  143. public static function findIdentityByAccessToken($token, $type = null) {
  144. return static::findOne(['access_token' => $token]);
  145. }
  146. /**
  147. * 表中要有auth_key字段(值随机生成),用于加密cookie使用
  148. * @return string 当前用户的(cookie)认证密钥,
  149. */
  150. public function getAuthKey() {
  151. return $this->auth_key;
  152. }
  153. /**
  154. * @param string $authKey
  155. * @return boolean 判断当前认证秘钥是否过期
  156. */
  157. public function validateAuthKey($authKey) {
  158. return $this->getAuthKey() === $authKey;
  159. }
  160. }

6、控制器中的原生与Yii框架写法

  1. <?php
  2. namespace frontend\controllers;
  3. use yii\web\Controller;
  4. use frontend\models\Test;//引入AR类
  5. echo "<meta charset='utf-8'/>";
  6. class TestController extends Controller{
  7. //行为方法,用于授权,写法固定
  8. public function behaviors() {
  9. return [
  10. 'access' => [ //访问控制
  11. 'class' => AccessControl::className(),
  12. 'rules' => [ //规则
  13. [
  14. 'allow' => false, //false是拒绝
  15. 'roles' => ['?'], // 匹配访客用户(未经认证)
  16. ],
  17. [
  18. 'allow' => true, //true是允许
  19. 'roles' => ['@'], //匹配已认证用户
  20. ],
  21. ],
  22. ],
  23. ];
  24. }
  25. //显示新闻列表
  26. public function actionNews($keyword = null, $typeid = 0) {
  27. $news = News::find(); //相当于连接这个模型的对应表,类似于TP框架中的M('News');
  28. //添加搜索条件
  29. if (!empty($keyword)) { //添加模糊搜索
  30. $news->andWhere(['like','title',$keyword]); //添加一个条件用And拼接,orWhere/或
  31. }
  32. if (!empty($typeid)) { //添加分类
  33. $news->andWhere(['typeid' => $typeid]); //添加一个条件用And拼接
  34. }
  35. //分页
  36. $count = $news->count(); //表总记录数
  37. $page = new Pagination(['totalCount' => $count, 'pageSize' => 2]); //分页类,计算limit
  38. $list = $news->orderBy('newsid desc')
  39. ->offset($page->offset) //偏移量,从哪行开始取limit(0,2)
  40. ->limit($page->limit) //取几行
  41. ->all();
  42. //加载视图,传递数据给视图使用
  43. return $this->render('news',['list' => $list, 'page' => $page, 'keyword' => $keyword, 'typeid' => $typeid]);
  44. }
  45. //执行原生SQL
  46. public function actionTestdb($id = 1){
  47. //添加数据,直接在浏览器地址栏输入控制器及动作即可添加到数据库,以下相同
  48. //echo \Yii::$app->db->createCommand("insert into msg(title,sex,tel,lxr,content,ip,status,add_time) values('标题','先生','17245678944','张三','留言内容123','127.0.0.1','0','".time()."')")->execute();
  49. //修改数据
  50. //echo \Yii::$app->db->createCommand("update msg set lxr='熊二' where msgid=5")->execute();
  51. //删除数据
  52. //echo \Yii::$app->db->createCommand("delete from msg where msgid=11")->execute();
  53. //查询数据
  54. //$list = \Yii::$app->db->createCommand("select * from msg")->queryAll(); //查询所有数据,返回二维数组
  55. //$list = \Yii::$app->db->createCommand("select * from msg where msgid=5")->queryOne(); //查询一条数据,返回一维数组
  56. $list = \Yii::$app->db->createCommand("select * from msg where msgid>:id")->bindValue(':id',$id)->queryAll(); //绑定参数,为了防止SQL注入攻击,可以使用此方式
  57. var_dump($list);
  58. }
  59. //测试AR模型
  60. public function actionTestAR(){
  61. // $model = new Test(); //头部namespace下需要加use frontend\models\Test;
  62. // //写入数据
  63. // //属性对应表中字段
  64. // $model->title = '主题';
  65. // $model->sex = '女士';
  66. // $model->tel = '1324567899';
  67. // $model->lxr = '熊三';
  68. // $model->content = '1111内容';
  69. // $model->ip = '127.0.0.1';
  70. // $model->status = '0';
  71. // $model->add_time = time();
  72. // $model->save(); //保存数据,同$model->insert()
  73. // //修改数据
  74. // $model1 = Test::findOne(1); //修改一条数据,主键=1。
  75. // $model1->title = '主题';
  76. // $model1->save(); //保存数据,同$model->update()
  77. // Test::updateAll(['title' => '主题'],'msgid > 1'); //修改多条数据
  78. // //删除数据
  79. // Test::findOne(5)->delete(); //删除一条数据
  80. // Test::deleteAll("msgid IN(10,16)"); //删除所有符合条件的数据
  81. // //查询数据
  82. // $msg = Test::find()->where(['status' => 0])->orderBy('msgid desc')->all();//查询所有符合条件的数据
  83. // var_dump($msg);
  84. // $msg = Test::find()->where(['status' => 0])->orderBy('msgid desc')->one();//查询一条数据
  85. // var_dump($msg);
  86. $msg = Test::find() //查询
  87. ->select(['msgid','title']) //选择显示字段
  88. ->where('status=:status',[':status' => 0]) //条件绑定方式
  89. ->limit(2) //取数
  90. ->orderBy('msgid desc') //排序
  91. ->asArray() //以数组方式返回结果
  92. ->all(); //获取所有符合条件的数组
  93. var_dump($msg);
  94. }
  95. //产品列表及分页
  96. public function actionProduct() {
  97. $product = Product::find();
  98. $count = $product->count();
  99. $page = new Pagination(['totalCount' => $count, 'pageSize' => 6]);
  100. $list = $product->orderBy('id desc')
  101. ->offset($page->offset) //偏移量
  102. ->limit($page->limit)
  103. ->all();
  104. return $this->render('product', ['list' => $list, 'page' => $page]);
  105. }
  106. //产品详细
  107. public function actionInfo($id = 0) {
  108. $info = Product::findOne($id);
  109. if (empty($info)) {
  110. return $this->goHome();
  111. }
  112. //更新数量
  113. $info->updateCounters(['show_num' => 1]);
  114. return $this->render('product_show', ['info' => $info]);
  115. }
  116. }

7、视图中的写法
循环输出及跳转并传值:

  1. <ul>
  2. <?php foreach ($list as $val) { ?>
  3. <li><a href="<?= Url::to(['info', 'id' => $val->id]) ?>"><s><img src="<?= $val->pic ?>" /></s><span><?= mb_substr($val->title, 0, 15, 'utf-8'); ?></span></a></li>
  4. <?php } ?>
  5. </ul>

分页:

  1. <div class="message"><i class="blue"><?= $page->totalCount; ?></i>条记录,当前显示第 <i class="blue"><?= $page->getPage()+1; ?>/<?= $page->getPageCount(); ?> </i></div>
  2. <?= LinkPager::widget(['pagination' => $page, 'maxButtonCount' => 6, 'nextPageLabel' => '下一页', 'prevPageLabel' => '上一页', 'firstPageLabel' => '首页', 'lastPageLabel' => '尾页']); ?>

获取所有分类(视图中也可直接查询):

  1. $cat = backend\models\Category::find()->all();

Ajax为post类型时必须带令牌:

  1. <script>
  2. $(function () {
  3. $('#selectAll').click(function() {
  4. $('#list').find('input[type=checkbox]').attr('checked', $(this).prop('checked'));
  5. });
  6. //提交删除
  7. $('#selectdel').click(function () {
  8. var valArr = new Array;
  9. $('#list :checkbox[checked]').each(function (i) {
  10. valArr[i] = $(this).val();
  11. });
  12. var vals = valArr.join(','); // 方法用于把数组中的所有元素放入一个字符串。//1,2,3
  13. if (vals == ''){
  14. alert('id未获取到');
  15. return;
  16. }
  17. //AJAX提交到PHP中处理
  18. $.ajax({
  19. url: '<?= Url::to(['news/select-del']); ?>',
  20. type: 'post',
  21. data: {'ids': vals, '<?= \Yii::$app->request->csrfParam; ?>':'<?= \Yii::$app->request->csrfToken; ?>'}, //post需要加令牌
  22. dataType: 'text',
  23. success: function (d) {
  24. if (d == 1) { //删除成功
  25. window.location.reload(); //刷新当前页
  26. } else if (d == 2) { //删除失败
  27. alert('删除失败');
  28. } else if (d == 3) { //未登录
  29. window.location.href = 'login.html';
  30. }
  31. }
  32. });
  33. });
  34. });
  35. </script>

发表评论

表情:
评论列表 (有 0 条评论,361人围观)

还没有评论,来说两句吧...

相关阅读

    相关 yii2学习笔记

    yii2 model 每个模型对应一张表,rules方法定义对应的字段格式,长度。attributeLabels设置对应字段名的默认显示名。 yii2 form 每个

    相关 C++学习笔记 20

    B树、B+树和红黑树的区别和联系? B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树。 B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计