学习知识点:
关于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模板格式:
`模板内容
模板内容`
在控制器中控制模板,如下:
取消模板的使用;
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]);
}
共同学习,写下你的评论
评论加载中...
作者其他优质文章