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 &copy; 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 &copy; 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 + -
显示快捷键?