category.php
来自「php 开发的内容管理系统」· PHP 代码 · 共 868 行 · 第 1/3 页
PHP
868 行
<?php
/**
* Article management
*
* @copyright The XOOPS project http://www.xoops.org/
* @license http://www.fsf.org/copyleft/gpl.html GNU public license
* @author Taiwen Jiang (phppp or D.J.) <php_pp@hotmail.com>
* @since 1.00
* @version $Id$
* @package module::article
*/
if (!defined("XOOPS_ROOT_PATH")) {
exit();
}
include_once dirname(dirname(__FILE__))."/include/vars.php";
mod_loadFunctions("parse", $GLOBALS["artdirname"]);
/**
* Xcategory
*
* @author D.J. (phppp)
* @copyright copyright © 2005 XoopsForge.com
* @package module::article
*
* {@link XoopsObject}
**/
if(!class_exists("Xcategory")){
class Xcategory extends ArtObject
{
/**
* Constructor
*/
function Xcategory()
{
$this->ArtObject();
$this->table = art_DB_prefix("category");
$this->initVar("cat_id", XOBJ_DTYPE_INT, null, false); // auto_increment unique ID
$this->initVar("cat_title", XOBJ_DTYPE_TXTBOX, "", true); // category title
$this->initVar("cat_pid", XOBJ_DTYPE_INT, 0, false); // parent category ID
$this->initVar("cat_description", XOBJ_DTYPE_TXTAREA, "", false); // description
$this->initVar("cat_image", XOBJ_DTYPE_SOURCE, "", false); // header graphic (unique)
$this->initVar("cat_order", XOBJ_DTYPE_INT, 99, false); // display order
$this->initVar("cat_entry", XOBJ_DTYPE_INT, 0, false); // entry article ID for the category. If cat_entry is set, the article will substitute the category index page
// Feature designed by Skalpa
$this->initVar("cat_template", XOBJ_DTYPE_SOURCE, "default", false); // category-wide template
$this->initVar("cat_sponsor", XOBJ_DTYPE_TXTAREA, "", false); // sponsors: url[space]title
$this->initVar("cat_moderator", XOBJ_DTYPE_ARRAY, serialize(array())); // moderators/editors
$this->initVar("cat_track", XOBJ_DTYPE_ARRAY, serialize(array())); // track back to top category, for building Bread Crumbs
$this->initVar("cat_lastarticles", XOBJ_DTYPE_ARRAY, serialize(array())); // last 10 article Ids
}
/**
* get a list of parsed sponsors of the category
*
* @return array
*/
function &getSponsor()
{
$sponsors = art_parseLinks($this->getVar("cat_sponsor", "e"));
return $sponsors;
}
/**
* get verified image url of the category
*
* @return string
*/
function getImage()
{
mod_loadFunctions("url", $GLOBALS["artdirname"]);
$image = art_getImageUrl($this->getVar("cat_image"));
return $image;
}
}
}
/**
* Category object handler class.
* @package module::article
*
* @author D.J. (phppp)
* @copyright copyright © 2005 The XOOPS Project
*
* {@link ArtObjectHandler}
*
* @param CLASS_PREFIX variable prefix for the class name
*/
art_parse_class('
class [CLASS_PREFIX]CategoryHandler extends ArtObjectHandler
{
/**
* Constructor
*
* @param object $db reference to the {@link XoopsDatabase} object
**/
function [CLASS_PREFIX]CategoryHandler(&$db) {
$this->ArtObjectHandler($db, art_DB_prefix("category", true), "Xcategory", "cat_id", "cat_title");
}
/**
* get IDs of latest articles of the category
*
* @param category $category {@link Xcategory}
* @param int $limit Max number of article IDs to fetch
* @return array of article IDs
*/
function &getLastArticleIds(&$category, $limit=0)
{
$art_ids = $category->getVar("cat_lastarticles");
if($limit>0) @array_splice($art_ids, $limit);
return $art_ids;
}
/**#@+
*
* set IDs of latest articles of the category in database
*
* {@link CriteriaCompo}
*
* @return bool true on success
*/
function setLastArticleIds($cat_id = null)
{
if(is_array($cat_id) && count($cat_id)>0){
foreach($cat_id as $id){
$cat =& $this->get($id);
$this->_setLastArticleIds($cat);
unset($cat);
}
}elseif($cat_id = intval($cat_id)){
$cat =& $this->get($cat_id);
$this->_setLastArticleIds($cat);
unset($cat);
}else{
$cats = $this->getAllByPermission("access", array("cat_id"));
foreach($cats as $id => $cat){
$cat =& $this->get($id);
$this->_setLastArticleIds($cat);
}
unset($cats);
}
return true;
}
function _setLastArticleIds(&$category)
{
$criteria = new CriteriaCompo(new Criteria("ac.ac_publish", 0, ">"));
$criteria->setSort("ac.ac_publish");
$criteria->setOrder("DESC");
$artConfig = art_load_config();
$limit = MAX($artConfig["articles_perpage"], 10);
$article_handler =& xoops_getmodulehandler("article", $GLOBALS["artdirname"]);
$articleIds = $article_handler->getIdsByCategory($category, $limit, 0, $criteria);
$category->setVar("cat_lastarticles", $articleIds);
unset($articleIds);
return $this->insert($category, true);
}
/**#@-*/
/**
* insert a new category into the database
*
* @param object $category {@link Xcategory} reference to Xcategory
* @param bool $force flag to force the query execution despite security settings
* @return int category ID
*/
function insert(&$category, $force = true)
{
$cat_id = parent::insert($category, $force);
if(!empty($category->vars["cat_pid"]["changed"])){
$this->updateTracks($category);
}
return $cat_id;
}
/**
* delete an article from the database
*
* {@link Article}
* {@link Xtopic}
* {@link Permission}
*
* @param object $category {@link Xcategory} reference to Xcategory
* @param bool $force flag to force the query execution despite security settings
* @param bool $forceDelete flag to force deleting articles/subcategories, otherwise move to its parent category
* @return bool true on success
*/
function delete(&$category, $force = true, $forceDelete=false)
{
global $xoopsModule;
if($category->getVar("cat_id") == 1){
xoops_error(art_constant("MD_CATEGORY1_CAN_NOT_DELETE"));
return false;
}
$des_cat = ($category->getVar("cat_pid")) ? $category->getVar("cat_pid") : 1; // move to parent category or category #1
$article_handler =& xoops_getmodulehandler("article", $GLOBALS["artdirname"]);
$articles = $article_handler->getByCategory($category);
if(empty($forceDelete)){
$criteria_article = new Criteria("cat_id", $category->getVar("cat_id"));
$article_handler->updateAll("cat_id", $des_cat, $criteria_article, true);
foreach(array_keys($articles) as $id){
if($articles[$id]->getVar("cat_id") == $category->getVar("cat_id")){
$article_handler->moveCategory($articles[$id], $des_cat, $category->getVar("cat_id"));
}else{
$article_handler->terminateCategory($articles[$id], $category->getVar("cat_id"));
}
$article_handler->updateCategories($articles[$id]);
}
$criteria_category = new Criteria("cat_pid", $category->getVar("cat_id"));
$this->updateAll("cat_id", $des_cat, $criteria_category, true);
unset($criteria_article, $criteria_category);
$this->setLastArticleIds($des_cat);
}else{
foreach(array_keys($articles) as $id){
$article_handler->terminateCategory($articles[$id], $category->getVar("cat_id"));
if($articles[$id]->getVar("cat_id") != $category->getVar("cat_id")){
$article_handler->updateCategories($articles[$id]);
}
}
$cats = $this->getChildCategories($category->getVar("cat_id"));
foreach(array_keys($cats) as $id){
$this->delete($cats[$id], $force);
}
}
$queryFunc = empty($force) ? "query" : "queryF";
$sql = "DELETE FROM " . $this->db->prefix("artcat") . " WHERE cat_id=" . $category->getVar("cat_id") . "";
$result = $this->db->{$queryFunc}($sql);
unset($articles);
$topic_handler =& xoops_getmodulehandler("topic", $GLOBALS["artdirname"]);
$topic_handler->deleteAll(new Criteria("cat_id", $category->getVar("cat_id")));
xoops_notification_deletebyitem($GLOBALS["xoopsModule"]->getVar("mid"), "category", $category->getVar("cat_id"));
$sql = "DELETE FROM " . $category->table . " WHERE cat_id=" . $category->getVar("cat_id") . "";
if ($result = $this->db->{$queryFunc}($sql)) {
$permission_handler =& xoops_getmodulehandler("permission", $GLOBALS["artdirname"]);
$permission_handler->deleteByCategory($category->getVar("cat_id"));
return true;
} else {
xoops_error("delte category error: ".$sql);
return false;
}
}
/**
* get a list of categories including a specified article and matching a condition
*
* {@link Permission}
*
* @param mixed $art_id article ID(s)
* @param object $criteria {@link CriteriaElement} to match
* @return array of categories {@link Xcategory}
*/
function &getByArticle($art_id, $criteria = null)
{
$_cachedTop = array();
$ret = array();
if(empty($art_id)) {
return $ret;
}
$sql = "SELECT c.cat_id, c.cat_title FROM " . art_DB_prefix("category"). " AS c";
$sql .= " LEFT JOIN ".art_DB_prefix("artcat")." AS ac ON ac.cat_id=c.cat_id";
if(is_array($art_id) && count($art_id)>0){
$sql .= " WHERE ac.art_id IN (".implode(",", $art_id).")";
}elseif(intval($art_id)){
$sql .= " WHERE ac.art_id = ".intval($art_id);
}else{
$sql .= " WHERE 1=1";
}
mod_loadFunctions("user", $GLOBALS["artdirname"]);
if(!art_isAdministrator()){
$permission_handler =& xoops_getmodulehandler("permission", $GLOBALS["artdirname"]);
$allowed_cats =& $permission_handler->getCategories();
if(count($allowed_cats)==0) return $ret;
$sql .= " AND c.cat_id IN (".implode(",",$allowed_cats).")";
}
if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
$sql .= " AND ".$criteria->render();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?