以下是本次学习的页面

打开相关文件,整个定义了一个Expert类

  1. class Expert extends CI_Controller{}

在Expert类里定义了几个参数以及说明其使用了哪些model

  1. function \_\_construct() {
  2. $this->whitelist = "index";
  3. parent::\_\_construct ( );
  4. $this->load->model ( 'category\_model' );
  5. $this->load->model ( "expert\_model" );}

然后我们看function index() 里的代码,一行行看下来

  1. $navtitle = "问题专家";
  2. $cid = intval ( $this->uri->segment ( 3 ) ) ? $this->uri->segment ( 3 ) : 'all'; //分类id$status = null!== $this->uri->segment ( 4 ) ? $this->uri->segment ( 4 ) : 'all'; //排序



可以在页面中一一对应

  1. if ($cid != 'all') {
  2. $category = $this->category \[$cid\]; //得到分类信息
  3. $navtitle = $category \['name'\] . "专家列表";
  4. $cfield = 'cid' . $category \['grade'\];//获取分类的等级}

第二行语句有点难以理解,选中后面的category查看引用,可以发现当前category是来自System/core目录下文件controller.php的全局变量。

  1. private static $instance;
  2. var $cache;
  3. var $currentuid = array ();
  4. var $setting = array ();
  5. var $category = array ();
  6. var $usergroup = array ();
  7. var $whitelist;
  8. var $time;var $ip;

同时再选中$category右键查看快速引用,会找到下面几行代码

  1. $this->load->database ();$category = $this->category = $this->cache->load ( 'category', 'id', 'displayorder' );

访问缓存数据,通过load()获取数据库里,名字为“category”的数据表里的id和displayorder字段的数据,以下是load函数的源代码

注意: 数据访问之前,会先通过下面的函数从缓存里访问数据,如果失败就会自动去读取数据然后写入缓存

  1. function fromcache($cachename,$cachetime = 3){}

总之,由上方可以得出全局变量$category中读取的是数据库某条数据,源代码

  1. $category = $this->category [$cid]; //得到分类信息

意为:Expert新定义的$category 为 db.category.id = cid 的整条数据库的信息

  1. //上接源代码,即$cid == 'all'的情况
  2. else {
  3. $category \['name'\] = '';
  4. $category \['id'\] = 'all';
  5. $cfield = '';
  6. $category \['pid'\] = 0;
  7. }
  8. if ($cid != 'all')
  9. $category = $this->category\_model->get ( $cid );
  10. $sublist = $this->category\_model->list\_by\_cid\_pid ( $cid, $category \['pid'\] ); //获取子分类

此段代码包含的函数:

$this->category_model->get ( $cid );

该方法里包括了还包括了一个通过cid的值在数据表catagory里获取分类封面图的方法



$this->category_model->list_by_cid_pid ( $cid, $category [‘pid’] )

  1. function list\_by\_cid\_pid($cid, $pid) {
  2. $cid=intval($cid);
  3. $pid=intval($pid);
  4. $sublist = array ();
  5. //把cid,pid值等于'all'的分类设置为平级的分类
  6. if ($cid == 'all') {
  7. $cid = 0;
  8. }
  9. if ($pid == 'all') {
  10. $pid = 0;
  11. }
  12. $where=" and onlybackground!=1 ";
  13. //在数据表里寻找与函数参数pid相同的分类id
  14. //使pid分类为id的子分类
  15. $query = $this->db->query ( "select \* from " . $this->db->dbprefix . "category where pid=$cid and isuseask=1 $where order by displayorder asc,id asc" );
  16. //给子分类添加封面缩略图和大图
  17. foreach ( $query->result\_array () as $category ) {
  18. $category \['image'\] = get\_cid\_dir ( $category \['id'\], 'big' );
  19. $category \['bigimage'\] = get\_cid\_dir ( $category \['id'\], 'big' );
  20. $sublist \[\] = $category;
  21. }
  22. return $sublist;}

我们可以访问相关的数据库来

几个分类之间等级关系在这里

我们发现默认分类下面没有子分类,计算机分类下面有PHP,结合数据表就能得知,分类A的pid属性值等于某分类B的id值,那么分类A就是分类B的子分类,除子分类外,其他分类平级

然后我们再去查看该函数在浏览界面显示子分类的原理,我们就能更好地理解地源码了

  1. //判断网页是否是付费内容
  2. $orderwhere = '';
  3. switch ($status) {
  4. case 'all' : //全部
  5. $orderwhere = '';
  6. break;
  7. case '1' : //付费
  8. $orderwhere = ' and mypay>0 ';
  9. break;
  10. case '2' : //免费
  11. $orderwhere = " and mypay=0 ";
  12. break;
  13. default:
  14. $orderwhere = '';
  15. break;
  16. }
  17. $page = max ( 1, intval ( $this->uri->segment ( 5 ) ) );
  18. $pagesize = $this->setting \['list\_default'\];$startindex = ($page - 1) \* $pagesize;

**$page = max ( 1, intval ( $this->uri->segment ( 5 ) ) );

**令当前页面的page为$this->uri->segment ( 5 )返回的整数值,如果不存在该地址就返回1,此网页返回1,因为最多只有四个分页

**$pagesize = $this->setting [‘list_default’];

**setting同上文的$category一样,都是定义好的全局变量

setting存储的是数据库里的“setting”数据表在此出调用了字段 ‘ list_default ’ 的值,意为一张页面默认显示的列表数量为15条

**$startindex = ($page – 1) * $pagesize;

**网页的起始页码设置,为当前页码减1,因为计算机计数是从0开始的

  1. //冗长的,本页面最后一个判断语句
  2. $rownum = $cid == 'all' ? returnarraynum ( $this->db->query ( getwheresql ( 'user', " expert=1 " . $orderwhere , $this->db->dbprefix ) )->row\_array () ) : returnarraynum ( $this->db->query ( getwheresql ( 'user', " expert=1 " . $orderwhere . "and uid IN (SELECT uid FROM " . $this->db->dbprefix . "user\_category WHERE cid=$cid)" , $this->db->dbprefix ) )->row\_array () );

该语句中调用了以下方法



大概意思为:

当前cid = ‘all’时

查询数据表 user数据中,expert = 1 (代表是专家)的orderwhere 是不是免费的数量

当前cid <> ‘all’时

查询数据表 user数据中,expert = 1 (代表是专家)而且 user_category(用户认证的专家分类数据表).cid = 当前的cid ,这条数orderwhere 是不是免费的的数量

  1. //展示专家列表,get\_list获取user数据表所有专家用户id
  2. //并判断他是否认证,最后一次登陆时间,关注人数,被关注次数,个人擅长分类
  3. $expertlist = $this->expert\_model->get\_list ( 1, $startindex, $pagesize, $cid, $status );
  4. //通过page函数,以分类的id号,是否免费重新建立两个分页
  5. $departstr = page ( $rownum, $pagesize, $page, "expert/default/$cid/$status" );
  6. //使当前页面,每一页面最多可处理15条数据
  7. $questionlist = $this->expert\_model->get\_solves ( 0, 15 );
  8. //代码的页面实现include template ( 'expert' );

专家动态页面的实现——php基于CI框架的学习(二)的更多相关文章

  1. PHP RBAC权限控制,基于CI框架(版本3.1.9)

    2018年11月7日更新:目前功能已做到事件级别权限控制,如:后台用户的添加操作.删除操作和保存操作等具体到事件级的操作方法有权限则展示相应的操作菜单,没权限则隐藏相应菜单或提示无权限到目前算是真正做 ...

  2. 基于CI框架的管理系统

    1:ci框架是有入口文件的,前端和后台入口文件(index.php,admin.php):里面修改$application_folder = 'application/home': 2:项目基本都是在 ...

  3. CI框架浅析(二)

    该文延续上篇文章: CI框架浅析(一) 在CI框架的核心库中,CodeIgniter.php负责加载所有需要的类库,第一个加载的是公共库 core/Common.php Common.php 负责加载 ...

  4. php获取json文件数据并动态修改网站头部文件meta信息 --基于CI框架

    话不多说了.直接开始吧  (如果有中文.请注意json只认utf-8编码) 首先你需要有一个json文件数据 {        "index": {                ...

  5. php获取服务器和mysql等信息输出到页面(基于ci框架)

    function show($varName) {    switch($result = get_cfg_var($varName)) {     case 0:      return '< ...

  6. 基于ci框架 修改出来了一个带农历的万年历。

    1这里没有写model:代码一看就懂,没什么负杂地方,就是麻烦一点. 直接control模块的代码: <?php if ( ! defined('BASEPATH')) exit('No dir ...

  7. nginx location匹配顺序及CI框架的nginx配置

    Nginx location匹配顺序如下: 用前缀字符串定义的location规则对URI进行匹配测试. =号定义了精确的前缀字符串匹配,如果发现精确匹配则使用当前规则.否则继续下一步匹配. 匹配其它 ...

  8. CodeIgniter (CI)框架中的数据库查询汇总

    引言: 前两天业务涉及到一个拉取答题排行榜的需求,数据库里数据是这样的: 同一个人可能提交过多次成绩,所以同一个人可能会有多次记录: 同一个人提交的多次成绩中可能有至少两次成绩是一样的. 于是,查询的 ...

  9. 某cms审计思路,以及ci框架如何找寻注入点

    某cms审计思路,以及ci框架如何找寻注入点 ABOUT 之前闲着没事的时候审的某cms,之前看一群大表哥刷过一次这个cms,想着看看还能不能赶得上分一杯羹,还是审计出来些东西,来说一说一个前台注入吧 ...

随机推荐

  1. ImageCombiner - Java服务端图片合成的工具包,好用!

    自己的第一个也是唯一一个开源项目,因为平时比较懒,很少做宣传,今天刚好突破160个star,发到园子里推荐给大家,算是庆祝一下,哈. 项目地址:https://gitee.com/opensource ...

  2. KSM概念学习

    KSM: Kernel SamePage Merging 内核同页合并 简介 KSM允许内核在两个或多个进程(包括虚拟客户机)之间共享完全相同的内存页. KSM让内核扫描检查正在运行中的程序,并比较他 ...

  3. 如何使用 Navicat Premium 的新“自动运行”工具自动运行行数据库复制。

    数据库复制有至少三种不同的方式: 快照复制:一台服务器上的数据复制到同一台或不同服务器上的另一个数据库. 合并复制:来自两个或多个数据库的数据被合并到一个数据库中. 事务复制:用户收到数据库的完整初始 ...

  4. IDEA总结

    1. 什么是idea? idea是Java开发软件 2. IDEA下载 https://www.jetbrains.com/idea/download/download-thanks.html?pla ...

  5. 生产者与消费者以及ActiveMQ

    生产者与消费者以及ActiveMQ 一. 多线程实现生产者与消费者 1.1 生产者与消费者头文件 #pragma once #include <iostream> #include < ...

  6. Kubernetes-1.概述

    内容主要摘自官网文档资料 官方地址 概述Kubernetes基本信息 前提条件: 掌握容器或Docker知识 文档编写基于kubernetes v1.17版本 目录 概述 Kubernetes对象 K ...

  7. C++共享数据保护机制

    下面随笔说明C++共享数据保护机制. 共享数据的保护 对于既需要共享.又需要防止改变的数据应该声明为常类型(用const进行修饰). 对于不改变对象状态的成员函数应该声明为常函数. (1)常类型 ①常 ...

  8. OpenGL中的坐标系统详细概括:包括Z缓冲

    一: 首先就是关于几个坐标系统的概括: 局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标. 下一步是将局部坐标变换为世界空间坐标,世界空间坐标是处于一个更大的空间范围的.这些坐标相对于世界的全局 ...

  9. Linux速通01 操作系统安装及简介

    操作系统 # a)操作系统的定义:操作系统是一个用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间. # 操作系统分为 系统调用接口 和 系统内核 # b)操作系统内核的定义 ...

  10. Magicodes.IE Excel合并行数据导入教程

    说明 Magicodes.IE.Excel目前已支持合并行单元格导入,如本篇教程所示. 安装包Magicodes.IE.Excel Install-Package Magicodes.IE.Excel ...