为了账号安全,请及时绑定邮箱和手机立即绑定

Yii 2.0开发一个仿京东商城平台

标签:
PHP MySQL Yii

学习知识点:

这里写图片描述

关于yii的几个小功能点:

  • Layout组件
  • 模板引擎
  • ActiveForm表单组建
  • Validation验证组建
  • attributeLabels()和rules()
  • validate函数的建立
  • Url地址生成组建
  • Html标签生成组建
  • Pagination分页组建

商城的几个大模块如下:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

然后我们再看一下使用的技术栈:nginx+PHP5.4版本以上+yiifromework+vim+composer(框架和扩展组件的开发)
对于php的配置是否全部正确开启,我们可以通过php requirements.php来环境监测


遇到的一个小问题,phpStudy 安装 composer
Could not open input file: C:\Windows\System32\composer.phar
解决:https://segmentfault.com/q/1010000000458019
php composer.phar create-project --prefer-dist yiisoft/yii2-app-basic basic

###请求生命周期
这里写图片描述

###无限级分类的实现

这里写图片描述

无限级分类可以说是一个比较重要的小知识点了,这个方法因为首页和后台都要使用,所有抽离出来,放在CommonController中方便调用。

分类模块代码如下
class Category extends ActiveRecord
{
    public static function tableName()
    {
        return "{{%category}}";
    }

    public function attributeLabels()
    {
        return [
            'parentid' => '上级分类',
            'title' => '分类名称'
        ];
    }

    public function rules()
    {
        return [
            ['parentid', 'required', 'message' => '上级分类不能为空'],
            ['title', 'required', 'message' => '标题名称不能为空'],
            ['createtime', 'safe']
        ];
    }

    public function add($data)
    {
        $data['Category']['createtime'] = time();
        if ($this->load($data) && $this->save()) {
            return true;
        }
        return false;
    }

    /**
     * 获取分类表所有数据
     * @return array|ActiveRecord[]
     */
    public function getData()
    {
        $cates = self::find()->all();
        $cates = ArrayHelper::toArray($cates);
        return $cates;
    }

    /**
     * 将无序数据遍历排列成序(子孙树)
     * @param $cates
     * @param int $pid
     * @return array
     */
    public function getTree($cates, $pid = 0)
    {
        $tree = [];
        foreach($cates as $cate) {
            if ($cate['parentid'] == $pid) {
//                拿出顶级分类
                $tree[] = $cate;
//                拿出子分类
                $tree = array_merge($tree, $this->getTree($cates, $cate['cateid']));
            }
        }
        return $tree;
    }

    /**
     * 添加前缀,区分层级
     * 找到对应级别,加相应个数
     * @param $data
     * @param string $p
     * @return array
     */
    public function setPrefix($data, $p = "|-----")
    {
        $tree = [];
        $num = 1;
//        parentid为零的,一个前缀
        $prefix = [0 => 1];
        while($val = current($data)) {
            $key = key($data);
//            跳过parentid-0,第二次遍历
            if ($key > 0) {
//                寻找上一个元素和该元素parentid不一样的位置,也就是说子层级出现的位置
                if ($data[$key - 1]['parentid'] != $val['parentid']) {
//                    层级加一
                    $num ++;
                }
            }
//            首先执行这里
            if (array_key_exists($val['parentid'], $prefix)) {
                $num = $prefix[$val['parentid']];
            }
            $val['title'] = str_repeat($p, $num).$val['title'];
            $prefix[$val['parentid']] = $num;
            $tree[] = $val;
//            指针下移
            next($data);
        }
        return $tree;
    }

    public function getOptions()
    {
        $data = $this->getData();
        $tree = $this->getTree($data);
        $tree = $this->setPrefix($tree);
        $options = ['添加顶级分类'];
        foreach($tree as $cate) {
            $options[$cate['cateid']] = $cate['title'];
        }
        return $options;
    }

    public function getTreeList()
    {
        $data = $this->getData();
        $tree = $this->getTree($data);
        return $tree = $this->setPrefix($tree);
    }

    public static function getMenu()
    {
        $top = self::find()->where('parentid = :pid', [":pid" => 0])->limit(11)->orderby('createtime asc')->asArray()->all();
        $data = [];
        foreach((array)$top as $k=>$cate) {
            $cate['children'] = self::find()->where("parentid = :pid", [":pid" => $cate['cateid']])->limit(10)->asArray()->all();
            $data[$k] = $cate;
        }
        return $data;
    }

}

###前台页面搭建(后台页面)

去掉页眉页脚,也就是上层共用部分和下层的公共部分。然后提取出来,放在一个单独的php文件中,当模板使用。
layout.php模板格式:
`模板内容

<?php echo $content ?>

模板内容`

在控制器中控制模板,如下:
取消模板的使用;
public $layout = false;或者$this->layout = 'false' ;
调用模板
$this->layout= '模板名称'

###gii的使用

  • 在配置文件( config->web.php->gii)开启gii
  • 创建新Module

这里写图片描述

开启后台模块
config->web.php
$config['modules']['admin'] = ['class' => 'app\modules\admin'];
public $defaultRoute = 'site';

添加配置/config/web.php

    'defaultRoute' => 'index',

##后台登录模块
这里写图片描述

邮件类使用时的报错
Expected response code 250 but got code "553", with message "553 Mail from must equal authorized user
原因如下:

  • 1.缺少提交的setFrom(‘用户名@163.com’);
  • 2.配置文件中的From和username不一致问题;
  • 3.邮箱未开启stmp服务;

小知识点
当我们在使用邮箱模板时的确认url时,我们使用创建绝对路径的方式
创建绝对路径:Yii::$app->urlManager->createAbsoluteUrl
创建相对路径:yii\helpers\Url::to()

###后台管理员模块
这个模块需要实现的功能有管理员列表(分页),管理员删除,当前登陆管理员修改信息,注册会员(后台直接添加)

分页的实现
public function actionManagers()
    {
        $this->layout = "layout1";
        $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]);
    }
管理员删除
public function actionDel()
    {
        $adminid = (int)Yii::$app->request->get("adminid");
        if (empty($adminid) || $adminid == 1) {
            $this->redirect(['manage/managers']);
            return false;
        }
        $model = new Admin;
        if ($model->deleteAll('adminid = :id', [':id' => $adminid])) {
            Yii::$app->session->setFlash('info', '删除成功');
            $this->redirect(['manage/managers']);
        }
    }
添加管理员
public function actionReg()
    {
        $this->layout = 'layout1';
        $model = new Admin;
        if (Yii::$app->request->isPost) {
            $post = Yii::$app->request->post();
            if ($model->reg($post)) {
                Yii::$app->session->setFlash('info', '添加成功');
            } else {
                Yii::$app->session->setFlash('info', '添加失败');
            }
        }
        $model->adminpass = '';
        $model->repass = '';
        return $this->render('reg', ['model' => $model]);
    }
点击查看更多内容
5人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
1.6万
获赞与收藏
1807

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消