百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

专家动态页面的实现——php基于CI框架的学习(二)

ccwgpt 2024-09-26 08:08 21 浏览 0 评论

以下是本次学习的页面

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

class Expert extends CI_Controller{}

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

function __construct() {
    $this->whitelist = "index";
    parent::__construct (  );
    $this->load->model ( 'category_model' );
    $this->load->model ( "expert_model" );}

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

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

可以在页面中一一对应

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

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

private static $instance;
var $cache;
var $currentuid = array ();
var $setting = array ();
var $category = array ();
var $usergroup = array ();
var $whitelist;
var $time;var $ip;

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

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

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

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

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

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

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

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

//上接源代码,即$cid == 'all'的情况
else {  
    $category ['name'] = '';
    $category ['id'] = 'all';
    $cfield = '';
    $category ['pid'] = 0;
}
if ($cid != 'all') 
    $category = $this->category_model->get ( $cid );
$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’] )

function list_by_cid_pid($cid, $pid) {
    $cid=intval($cid);
    $pid=intval($pid);
    $sublist = array ();
    //把cid,pid值等于'all'的分类设置为平级的分类
    if ($cid == 'all') {
        $cid = 0;
    }
    if ($pid == 'all') {
        $pid = 0;
    }
    $where=" and onlybackground!=1 ";
    
    //在数据表里寻找与函数参数pid相同的分类id
    //使pid分类为id的子分类
    $query = $this->db->query ( "select * from " . $this->db->dbprefix . "category where pid=$cid and isuseask=1 $where order by displayorder asc,id asc" );
    
    //给子分类添加封面缩略图和大图
    foreach ( $query->result_array () as $category ) {
        $category ['image'] = get_cid_dir ( $category ['id'], 'big' );
        $category ['bigimage'] = get_cid_dir ( $category ['id'], 'big' );
        $sublist [] = $category;
    }
    return $sublist;}

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

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

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

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

//判断网页是否是付费内容
$orderwhere = '';
switch ($status) {
    case 'all' : //全部
        $orderwhere = '';
        break;
    case '1' : //付费
        $orderwhere = ' and mypay>0 ';
        break;
    case '2' : //免费
        $orderwhere = " and mypay=0 ";
        break;
    default:
        $orderwhere = '';
        break;
}

$page = max ( 1, intval ( $this->uri->segment ( 5 ) ) );
$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开始的

//冗长的,本页面最后一个判断语句
$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 是不是免费的的数量

//展示专家列表,get_list获取user数据表所有专家用户id
//并判断他是否认证,最后一次登陆时间,关注人数,被关注次数,个人擅长分类
$expertlist = $this->expert_model->get_list ( 1, $startindex, $pagesize, $cid, $status );

//通过page函数,以分类的id号,是否免费重新建立两个分页
$departstr = page ( $rownum, $pagesize, $page, "expert/default/$cid/$status" );

//使当前页面,每一页面最多可处理15条数据
$questionlist = $this->expert_model->get_solves ( 0, 15 );

//代码的页面实现include template ( 'expert' );

相关推荐

MFC、Qt、WPF?该用哪个?(mfc和wpf区别)

MFC、Qt和WPF都是流行的框架和工具,用于开发图形用户界面(GUI)应用程序。选择哪个框架取决于你的具体需求和偏好。MFC(MicrosoftFoundationClass)是微软提供的框架,...

一款WPF开发的通讯调试神器(支持Modbus RTU、MQTT调试)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍Wu.CommTool是一个基于C#、WPF、Prism、MaterialDesign...

关于面试资深C#、WPF开发工程师的面试流程和问题

一、开场(2-3分钟)1.欢迎应聘者,简单介绍公司和面试流程。2.询问应聘者是否对公司或岗位有初步的问题。二、项目经验与技术应用(10-20分钟)1.让应聘者详细介绍几个他参与过的C#、...

C# WPF MVVM模式Prism框架下事件发布与订阅

01—前言处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行...

WPF 机械类组件动画制作流程简述(wps上怎么画机械结构简图)

WPF机械类组件动画制作流程简述独立观察员2025年3月4日一、创建组件创建组件用户控件,将组件的各部分“零件”(图片)拼装在一起,形成组件的默认状态:二、给运动部分加上Rend...

C#上位机WinForm和WPF选哪个?工控老油条的&quot;血泪史&quot;

作为一个从互联网卷进工控坑的"跨界难民",在这会摸鱼的时间咱就扯一下上位机开发选框架这档子破事。当年我抱着WPF的酷炫动画一头扎进车间,结果被产线老师傅一句"你这花里胡哨的玩意...

【一文扫盲】WPF、Winform、Electron有什么区别?

近年来,随着软件开发的不断发展,开发人员面临着选择适合他们项目的各种框架和工具的挑战。在桌面应用程序开发领域,WPF、Winform和Electron是三个备受关注的技术。本文将介绍这三者的区别,帮助...

一个开源、免费、强大且美观的WPF控件库

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍HandyControl是一套基于WPF(WindowsPresentationF...

WPF 根据系统主题自动切换浅色与深色模式

WPF根据系统主题自动切换浅色与深色模式控件名:Resources作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopers...

WPF与WinForm的本质区别(wpf与maui)

在Windows应用程序开发中,WinForm和WPF是两种主要的技术框架。它们各自有不同的设计理念、渲染机制和开发模式。本文将详细探讨WPF与WinForm的本质区别,并通过示例进行说明。渲染机制W...

Win10/Win11效率神器再进化:微软发布PowerToys 0.90.0版本

IT之家4月1日消息,微软今天(4月1日)更新PowerToys,在最新发布的0.90.0版本中,修复多个BUG之外,引入多项功能更新,为Windows10、Windows...

一款非常漂亮的WPF管理系统(wpf架构及特性)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!WPFManager项目介绍该项目是一款WPF开发的管理系统,数据库采用的MSSqlserv...

WPF 实现描点导航(wpf按钮的点击事件)

WPF实现描点导航控件名:NavScrollPanel作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPF...

微软更新基于Win11的Validation OS 2504:增强 .NET与WPF

IT之家5月1日消息,科技媒体NeoWin今天(5月1日)发布博文,报道称微软公司更新基于Windows11的ValidationOS,增强支持.NET和WPF,并优...

WPF的技术架构与优势(wpf的前景)

WindowsPresentationFoundation(WPF)是一个现代化的用户界面框架,专为构建Windows应用程序而设计。它通过分层的技术架构和丰富的功能集,提供了全面的应用程...

取消回复欢迎 发表评论: