westdc-zf1/application/models/Archive.php

505 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Archive - 统一文档类实现各类文档的读取和IO操作包括新闻、帮助、想法等。
*/
class Archive
{
private $db; //传入PDO对象
public $ptype; //文档分类
public $tbl_archives; //文档表
public $tbl_categorys; //栏目表
public $tbl_catalog; //文档栏目关联表
public $tbl_tag; //关键字表
function __construct($db)
{
$this->db = $db;
//文档的大分类
//在数组中设置文档分类
//"中文名称" => "数据库中标识"
$this->ptype = array(
"新闻" => "news",
"想法" => "idea",
"帮助" => "help",
"关于" => "about"
);
$this->tbl_archives = "archive";
$this->tbl_categorys = "ar_category";
$this->tbl_catalog = "ar_catalog";
$this->tbl_tag = "ar_tag";
}
/*
写入关系表
不能外部调用
*/
private function ToCatalog($aid,$cid,$uuid='',$status=0){
if(empty($aid) || !is_numeric($aid))
{
return false;
}
if(empty($cid) && empty($uuid))
{
return false;
}
$data = array(
"aid" => $aid,
"cid" => $cid,
"status" => $status
);
if(!empty($uuid))
{
$data['uuid'] = $uuid;
}
if($this->db->insert($this->tbl_catalog,$data))
{
return true;
}else{
return false;
}
}//ToCatalog()
//写入关系表,外部只能调用此接口
public function AddToCatalog($aid,$cid,$uuid='',$status=0)
{
if(!is_numeric($aid))
{
return false;
}
if(!is_array($cid) && !is_numeric($cid))
{
return false;
}
if(is_array($cid) && count($cid)<1)
{
return false;
}
if(is_array($cid))
{
foreach($cid as $v)
{
$this->ToCatalog($aid,$v,$uuid,$status);
}
return true;
}else{
return $this->ToCatalog($aid,$cid,$uuid,$status);
}
}//AddToCatalog
//删除一个关系
function DeleteCatalog($id)
{
$sql = "DELETE FROM ".$this->tbl_catalog." WHERE id=$id";
@$this->db->exec($sql);
}
/*
* 更改栏目 ChangeCatalog()
*/
function ChangeCatalog($aid,$typeid,$uuid='',$status=0){
try{
$sql = "SELECT * FROM ar_catalog WHERE aid=$aid";
$sth = $this->db->query($sql);
$rows = $sth->fetchAll();
$types = array();
foreach($rows as $k=>$v)
{
$types[] = $v['cid'];
if(!in_array($v['cid'],$typeid))
{
//删除一个栏目
$this->DeleteCatalog($v['id']);
}
}
foreach($typeid as $v)
{
if(!in_array($v,$types))
{
//添加一个栏目
$this->ToCatalog($aid,$v);
}
}
return true;
}catch(Exception $e){
return $e->getMessage();
}
}//ChangeCatalog
//修改文档状态
function ChangeStatus($aid,$pub){
if(empty($aid) || !is_numeric($aid))
{
return false;
}
if(!is_bool($pub))
{
return false;
}
$data = array(
"is_pub" => $pub
);
if($this->db->update($this->tbl_archives,$data,"id=$aid"))
{
return true;
}else{
return false;
}
}//修改文档状态
//删除文档
function DeleteArchives($aid){
if(empty($aid) || !is_numeric($aid))
{
return false;
}
$this->DeleteTags($aid);
$sql = "DELETE FROM ".$this->tbl_archives." WHERE id=$aid";
@$this->db->exec($sql);
$sql = "DELETE FROM ".$this->tbl_catalog." WHERE aid=$aid";
@$this->db->exec($sql);
return true;
}//DeleteArchives
//写入标签关系
function MakeTags($aid,$keywords){
$keywords = trim($keywords);
if(empty($aid) || !is_numeric($aid))
{
return false;
}
if(preg_match("/,/",$keywords))
{
$tag = explode(",",$keywords);
}else{
if($this->db->insert($this->tbl_tag,array("id"=>$aid,"tag"=>$tag)))
{
return true;
}else{
return true;
}
}
if(is_array($tag))
{
foreach($tag as $v)
{
$v = trim($v);
if($v!='')
{
$this->db->insert($this->tbl_tag,array("id"=>$aid,"tag"=>$v));
}
}
}
return true;
}//MakeTags
//读取标签
function GetTags($aid,$limit=0){
if(empty($aid) || !is_numeric($aid))
{
return false;
}
$sql = "SELECT * FROM ".$this->tbl_tag." WHERE id=$aid";
if(!empty($limit))
{
$sql .= " LIMIT $limit";
}
$sth = $this->db->query($sql);
$rows = $sth->fetchAll();
$keywords = array();
foreach($rows as $k=>$v)
{
$keywords[] = $v['tag'];
}
return $keywords;
}//GetTags
//删除标签
function DeleteTags($aid){
if(empty($aid) || !is_numeric($aid))
{
return false;
}
$sql = "DELETE FROM ".$this->tbl_tag." WHERE id=$aid";
@$this->db->exec($sql);
return true;
}//DeleteTags
/*
* addArchive() 添加档案
*
* @param array $data
*
* @return int;
*/
function addArchive($data,$typeid,$keyword='')
{
$data = $this->scanField($data);
if($data == false)
{
return 0;
}
//执行SQL语句后返回插入文章表的ID
$sql = "INSERT INTO ".$this->tbl_archives." (userid,title,description,image,source,ts_published,is_pub,body)
VALUES (
".$data['userid'].",
".$data['title'].",
".$data['description'].",
".$data['image'].",
".$data['source'].",
".$data['ts_published'].",
".$data['is_pub'].",
".$data['body']."
)
RETURNING id";
try{
$sth = $this->db->prepare($sql);
if($sth->execute())
{
$temp = $sth->fetch(PDO::FETCH_ASSOC);
$newAid = $temp['id'];
$this->AddToCatalog($newAid,$typeid);
if(!empty($keyword))
{
$this->MakeTags($newAid,$keyword);
}
return $newAid;
}else{
return 0;
}
}catch(Exception $e)
{
return 0;
}
}//addArchive()
/*
* updateArchive() 更改文档
*
* @param array $data
*
* @return int
*/
function updateArchive($aid,$data,$typeid,$keyword='')
{
if(!is_numeric($aid))
{
return 0;
}
$data = $this->scanField($data);
if($data == false)
{
return 0;
}
$sql = "UPDATE ".$this->tbl_archives." SET
userid=".$data['userid'].",
title=".$data['title'].",
description=".$data['description'].",
image=".$data['image'].",
source=".$data['source'].",
ts_published=".$data['ts_published'].",
is_pub=".$data['is_pub'].",
body=".$data['body']."
WHERE id=$aid";
try{
if($this->db->exec($sql))
{
if(!empty($keyword))
{
$this->DeleteTags($aid);
$this->MakeTags($aid,$keyword);
}
$this->ChangeCatalog($aid,$typeid);
return $aid;
}else{
return 0;
}
}catch(Exception $e)
{
return 0;
}
}
//扫描字段
function scanField($data){
if(!is_array($data))
{
return false;
}
//对特殊字段进行特别处理
$data['title'] = $this->replaceHtml($data['title']);
$data['description'] = $this->replaceHtml($data['description']);
//将参数过滤一遍,如果是字符型字段
//就执行db->quote()
foreach($data as $k=>$v)
{
if(!is_numeric($v) || !is_bool($v))
{
$data[$k] = $this->db->quote($v);
}
}
return $data;
}//scanField
//过滤UTF-8字符的html代码
function replaceHtml($html)
{
$newString = htmlentities($html, ENT_QUOTES, "UTF-8");
return $newString;
}
/************* 读取 ****************/
/*
* makeArchiveUrl()
* 创建一个文档的链接
* 连接地址需要和路由规则对应
*
* @param array $parts
*
* @return string;
*/
public function makeArchiveUrl($parts)
{
$http_host = "http://".$_SERVER ['HTTP_HOST'];
$controller = "archives";
$url = $http_host."/".$controller."/".$parts['ptype']."/".$parts['type_code']."/archive-".$parts['archive_id'].".html";
//$url = $http_host."/".$controller."/".$parts['type_code']."/".$parts['archive_id'];
return $url;
}
public function makeCategoryUrl($parts)
{
$http_host = "http://".$_SERVER ['HTTP_HOST'];
$controller = "archives";
$url = $http_host."/".$controller."/".$parts['ptype']."/".$parts['type_code']."";
return $url;
}
/*
* getArchiveUrl()
* 通过文档ID和栏目ID获得某个文档的url
* 仅适用于单个栏目的文档且已经得知其栏目ID
* 如果是多个栏目的文档,则获取第一个栏目的文档连接
*
* @param int $aid
*
* @return string;
*/
function getArchiveUrlByCid($aid,$cid=0)
{
if(empty($aid) || !is_numeric($aid))
{
return false;
}
$ecField = array($aid);
$wheresql = "";
if(!empty($cid) && is_numeric($cid))
{
$wheresql = " AND c.id=? ";
$ecField[] = $cid;
}
$sql = "SELECT arc.id,c.id as cid,c.title,c.code,c.ptype FROM ".$this->tbl_archives." arc
LEFT JOIN ".$this->tbl_catalog." ct ON arc.id=ct.aid
LEFT JOIN ".$this->tbl_categorys." c ON ct.cid = c.id
WHERE arc.id=? $wheresql
LIMIT 1";
$sth = $this->db->prepare($sql);
$sth->execute($ecField);
$row = $sth->fetch();
$url_parts = array(
"ptype"=>$row['ptype'],
"type_code"=>$row['code'],
"archive_id"=>$row['id']
);
return array(
'archive_url'=>$this->makeArchiveUrl($url_parts),
'type_title'=>$row['title'],
'type_id'=>$row['cid'],
'type_url'=>$this->makeCategoryUrl($url_parts),
);
}//getArchiveUrlByCid()
function getArchive($code='')
{
$sql = "select a.* from ".$this->tbl_archives." a
left join ".$this->tbl_catalog." ac on a.id=ac.aid
left join ".$this->tbl_categorys." c on ac.cid=c.id ";
if (!empty($code)) $sql.=" where c.code='".$code."'";
$rs=$this->db->query($sql);
$rows=$rs->fetchAll();
return $rows;
}
function getOneArchive($title,$ptype='news')
{
$sql="update ".$this->tbl_archives." set click=click+1";
$this->db->query($sql);
$sql = "select a.* from ".$this->tbl_archives." a
left join ".$this->tbl_catalog." ac on a.id=ac.aid
left join ".$this->tbl_categorys." c on ac.cid=c.id ";
$sql.=" where a.title=? and c.ptype=?";
$sth=$this->db->prepare($sql);
$sth->execute(array($title,$ptype));
$rows=$sth->fetch();
return $rows;
}
}