用户动态页面的实现——php基于CI框架的学习(一)

最近在艰难晦涩地学习php,万事开头难,所以笔者决定从最简单的页面开始学习

然后我们就在项目文件里找到同名文件开始艰难晦涩地学习

<?php
defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );
class Doing extends CI_Controller {
    function __construct() {
       parent::__construct();
       //调用doing_model模型
        $this->load->model("doing_model");
        $this->load->model("topic_model");
    }
    function index() {
        $navtitle = "问答动态";
        $type = 'atentto';
        
        //获取第三分段的参数,无参数就是默认界面
        $recivetype = $this->uri->segment ( 3 );
        if ($recivetype) {
            $type = $recivetype;
        }
        if (!$this->user['uid']) {
            $type = 'all';
        }
        $navtitletable = array(
            'all' => '问答动态',
            'my' => '我的动态',
            'atentto' => '关注的动态' //default
        );
        $navtitle = $navtitletable[$type];

        //分页设置
        $page = max(1, intval($this->uri->segment ( 4 )));
        $pagesize = $this->setting['list_default'];
        $startindex = ($page - 1) * $pagesize;

        //type对应动态类型
        //调用doing_model函数中的list_by_type函数,根据动态类型进行不同条件查询动态,再查询动态对应的行动标号对应的操作,进行doinglist数据的填充
        $doinglist = $this->doing_model->list_by_type($type, $this->user['uid'], $startindex, $pagesize);

        //调用doing_model函数中的rownum_by_type函数,根据动态类型进行不同条件查询动态,再查询动态对应的行动标号对应的操作,进行doinglist数据的填充
        $rownum = $this->doing_model->rownum_by_type($type, $this->user['uid']);
        $departstr = page($rownum, $pagesize, $page, "doing/default/$type");
        if ($type == 'atentto') {
            $recommendsize = $rownum ? 3 : 6;
            $recommandusers = $this->doing_model->recommend_user($recommendsize);
        }
       	$userarticle=$this->topic_model->get_user_articles(0,5);
        include template('doing');
    }
}
?>

代码不是很长,但是这背后引申出好几个文件,还是很需要一番时间来学习的。先一段一段地分析语句吧。从下面这段代码里我们可以知道,这个页面的架构调用了model里面的“doing-model”业务模型

function __construct() {
    parent::__construct();
    //调用doing_model模型
    $this->load->model("doing_model");
    $this->load->model("topic_model");
}

然后接着看index函数里的语句

$navtitle = "问答动态";
$type = 'atentto';

//获取第三分段的参数,无参数就是默认界面
$recivetype = $this->uri->segment ( 3 );
if ($recivetype) {
	$type = $recivetype;
}
if (!$this->user['uid']) {
	$type = 'all';
}
$navtitletable = array(
	'all' => '问答动态',
	'my' => '我的动态',
	'atentto' => '关注的动态' //default
);
$navtitle = $navtitletable[$type];

这一段主要的作用是确定type的属性,由上面三张网页图可知,不同type情况下呈现的动态的数量是不同的,type关系到下面动态数据的筛选。在确定type属性这里我们用到的核心语句是

$this->uri->segment ( );

这行语句来自CI框架URI类中的一个函数

主要目的就是从URI中获得我们想要的一个字段,从index后面的“/”从1开始计数,所以$this->uri->segment ( 3 )就是index后面的第三段

像default界面没有3段,所以返回null值,type还是一开始默认设置的“atentto”,然后就是页面分页的设置,这一部分是所有项目的公共部分,与我们今天讨论的问题无关,所以我们继续往下看

//type对应动态类型
$doinglist = $this->doing_model->list_by_type($type, $this->user['uid'], $startindex, $pagesize);
$rownum = $this->doing_model->rownum_by_type($type, $this->user['uid']);

我们可以发现,这里有两个变量分别调用了doing_model里面的两个函数,所以我们就在doing_model文件里搜索函数名,就能分别得到两个函数,list_by_type函数很长,在这里只截取一部分,不妨碍理解

function list_by_type($searchtype = 'all', $uid = 0, $start = 0, $limit = 20) {
	$doinglist = array ();
	$sql = "";
	$uid = intval ( $uid );
	switch ($searchtype) {
		case 'all' :
			$sql .= "select * from " . $this->db->dbprefix . "doing where action in(1,2,3,6,9,11)";
			break;
		case 'my' :
			$sql .= "select * from " . $this->db->dbprefix . "doing where authorid=$uid ";
			break;
		case 'atentto' :
			
			$sql .= "select d.* from " . $this->db->dbprefix . "doing as d," . $this->db->dbprefix . "user_attention as u where d.authorid=u.uid and u.followerid=$uid and action in(1,2,3,6,9,11)";
			break;
	}

可以发现,不同的type使得我们在数据库里检索数据的条件也会不同,因而获得的结果也不同,所以出现了上图三种情况的动态页面。当然,我们也可以在mysql里面找到同名数据表,对应上面代码的查询条件,加深我们对于数据库里各个数据表含义、数据字段的理解。

//list_by_type函数续

$sql .= " ORDER BY createtime DESC LIMIT $start,$limit";
$query = $this->db->query ( $sql );
foreach ( $query->result_array () as $doing ) {
	$doing ['doing_time'] = tdate ( $doing ['createtime'] );//显示几天前的操作
	$doing ['user'] = $this->get_by_uid ( $doing ['authorid'] );
	$doing ['avatar'] = get_avatar_dir ( $doing ['authorid'] );
	$doing ['actiondesc'] = $this->actiontable [$doing ['action']];
	$doing ['followerlist'] = $this->get_follower ( $doing ['questionid'] );
	if ($doing ['refer_authorid']) {
		$doing ['refer_avatar'] = get_avatar_dir ( $doing ['refer_authorid'] );
	}
    
    switch ($doing ['action']) {
	case '1' : // 提出了问题
		$doing ['question'] = $this->getquestionbyqid ( $doing ['questionid'] );
		$doing ['category'] = $this->get_cat_bycid ( $doing ['question'] ['cid'] );
		$doing ['categoryname'] = $doing ['category'] ['name'];
		$doing ['cid'] = $doing ['category'] ['id'];
		$doing ['title'] = $doing ['question'] ['title'];
		$doing ['hidden'] = $doing ['question'] ['hidden'];
		$doing ['views'] = $doing ['question'] ['views'];
		$doing ['answers'] = $doing ['question'] ['answers'];
		$doing ['attentions'] = $doing ['question'] ['attentions'];
		$doing ['content'] = $doing ['question'] ['title'];
		$doing ['image'] = getfirstimg ( $doing ['question'] ['description'] );
		$doing ['description'] = cutstr ( checkwordsglobal ( strip_tags ( $doing ['question'] ['description'] ) ), 240, '...' );
		$doing ['url'] = urlmap ( 'question/view/' . $doing ['questionid'], 2 );
		break;
    case '2' :
    /* other code */
    }

利用CI框架的$this->db->query ( $sql )语句,访问我们前面查询好的数据集的数据,再进行遍历,通过doing-model模型设定的多个其他的函数,提取出数据库里的我们需要的数据及数据格式,然后根据各条数据的“action”对应的值,匹配动态不同的操作,最后输出结果,达到我们书写动态信息的目的。

list_by_type函数查找动态对应的用户的数据,rownum_by_type查找的是动态对应的问题的数据

//页面封装
$departstr = page($rownum, $pagesize, $page, "doing/default/$type");
if ($type == 'atentto') {
    $recommendsize = $rownum ? 3 : 6;
    $recommandusers = $this->doing_model->recommend_user($recommendsize);
}

//侧边栏的实现
$userarticle=$this->topic_model->get_user_articles(0,5);

//template为抽象模板,用于通过filename调用,大概是实现静态网页的模板
include template('doing');

以上就是笔者艰涩的学习过程,希望笔者这些浅显的理解能对你有所帮助。如有错误理解,也希望各位读者能悉心指出,谢谢。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值