article.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 1,497 行 · 第 1/4 页

PHP
1,497
字号
     */
    function &parseNotes(&$text)
    {
		if(empty($GLOBALS["xoopsModuleConfig"]["do_footnote"]) || empty($text)) {
			return $text;
		}
		$text = preg_replace_callback( "/\(\((.*)\)\)/U", array(&$this, "_convertNotes"), $text );
		return $text;
    }
    
    /**
     * Generate footnote of the article
     * 
     * @param array $matches matched items
     * @return string 
     */
    function _convertNotes($matches)
    {
	    static $ii=0;
	    $ii ++;
	    $this->notes[] = "<a name=\"footnote_content".$ii."\" id=\"footnote_content".$ii."\"></a><a href=\"#footnote_index".$ii."\"><span class=\"noteitem\">". $matches[1]. "</span></a>";
	    return "<a name=\"footnote_index".$ii."\" id=\"footnote_index".$ii."\"></a>[<a href=\"#footnote_content".$ii."\">". $ii. "</a>]";
    }

    /**
     * get text raw content of a specified page of the article
     * 
 	 * {@link Text} 
 	 *
     * @param int $page page no
     * @param string $format text format
     * @return array
     */
    function &_getText($page = -1, $format = "s")
    {
	    $page = $this->getPage(intval($page));
		if(empty($page)) {
			$ret = null;
			return $ret;
		}
		$text_handler =& xoops_getmodulehandler("text", $GLOBALS["artdirname"]);
		$text =& $text_handler->get($page);
		if($format=="raw"){
			$res = array("title"=>$text->vars["text_title"]["value"], "body"=>$text->vars["text_body"]["value"]);
		}elseif(empty($format)){
			$res = array("title"=>$text->getVar("text_title"), "body"=>$text->getVar("text_body"));
		}else{
			$res = array("title"=>$text->getVar("text_title"), "body"=>$text->getVar("text_body", $format));
		}
		return $res;
    }
}
}

/**
* Article object handler class.  
* @package module::article
*
* @author  D.J. (phppp)
* @copyright copyright &copy; 2000 The XOOPS Project
*
* {@link ArtObjectHandler} 
*
* @param CLASS_PREFIX variable prefix for the class name
*/

art_parse_class('
class [CLASS_PREFIX]ArticleHandler extends ArtObjectHandler
{
	/**
	 * Constructor
	 *
	 * @param object $db reference to the {@link XoopsDatabase} object	 
	 **/
    function [CLASS_PREFIX]ArticleHandler(&$db) {
        $this->ArtObjectHandler($db, art_DB_prefix("article", true), "Article", "art_id", "art_title");
    }

    /**
     * Get the previous article and the next article of an articles
     * 
     * @param   object	$article	reference to the article
     * @param   array	$category	article scope
     * @return  array
     **/
    // To be optimized
    function &getSibling(&$article, &$category)
    {
        $ret = array();
        
        $sql_cat = "";
        if(is_array($category) && count($category)>0){
	        $category = array_map("intval",$category);
        	$sql_cat = " AND ac.cat_id IN (".implode(",", $category).")";
        }else{
        	$cat_id = (is_object($category))? $category->getVar("cat_id"):intval($category);
	        if($cat_id>0) $sql_cat = " AND ac.cat_id = ".intval($cat_id);
    	}

	    $sql = "
			SELECT a.art_id as prev_id, a.art_title
			    FROM " . art_DB_prefix("article"). " AS a
			    LEFT JOIN ". art_DB_prefix("artcat")." AS ac
			    ON ac.art_id=a.art_id
			    WHERE a.art_id < ".$article->getVar("art_id")."
			    ".$sql_cat."
			    ORDER BY a.art_id DESC LIMIT 1
	    ";
        $result = $this->db->query($sql);
        $myrow = $this->db->fetchArray($result);
	    if(!empty($myrow["prev_id"])){
			$ret["previous"] = array("id" => $myrow["prev_id"], "title" => $myrow["art_title"]);
		}

	    $sql = "
			SELECT a.art_id as next_id, a.art_title
			    FROM " . art_DB_prefix("article"). " AS a
			    LEFT JOIN ". art_DB_prefix("artcat")." AS ac
			    ON ac.art_id=a.art_id
			    WHERE a.art_id > ".$article->getVar("art_id")."
			    ".$sql_cat."
			    ORDER BY a.art_id ASC LIMIT 1
	    ";
        $result = $this->db->query($sql);
        $myrow = $this->db->fetchArray($result);
	    if(!empty($myrow["next_id"])){
			$ret["next"] = array("id" => $myrow["next_id"], "title" => $myrow["art_title"]);
		}

	    return $ret;
    }

    /**
     * count articles matching a condition of a category (categories)
     * 
     * @param 	mixed 	$category array or {@link Xcategory}
     * @param 	object 	$criteria {@link CriteriaElement} to match
     * @return int count of articles
     */
   	function getCountByCategory(&$category, $criteria = null)
   	{
        $sql = "SELECT COUNT(DISTINCT a.art_id) as count FROM ".art_DB_prefix("article")." AS a LEFT JOIN ".art_DB_prefix("artcat")." AS ac ON a.art_id=ac.art_id WHERE 1=1 ";
        if(is_array($category) && count($category)>0){
	        $category = array_map("intval",$category);
        	$sql .= " AND ac.cat_id IN (".implode(",", $category).")";
        }else{
        	$cat_id = (is_object($category))? $category->getVar("cat_id"):intval($category);
	        if($cat_id>0) $sql .= " AND ac.cat_id = ".intval($cat_id);
    	}
        if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
            $sql .= " AND ".$criteria->render();
        }
        $result = $this->db->query($sql);
        $myrow = $this->db->fetchArray($result);
        return intval($myrow["count"]);
   	}

    /**
     * count articles matching a condition of a topic
     * 
	 * {@link Xtopic} 
	 *
     * @param 	mixed 	$top_id		topic ID(s)
     * @param 	object 	$criteria 	{@link CriteriaElement} to match
     * @return int count of articles
     */
  	function getCountByTopic($top_id, $criteria = null)
   	{
		$topic_handler =& xoops_getmodulehandler("topic", $GLOBALS["artdirname"]);
		return $topic_handler->getArticleCount($top_id, $criteria);
   	}

    /**
     * get articles matching a condition of a topic
     * 
	 * @param int   	$top_id     Topic ID
	 * @param int   	$limit      Max number of objects to fetch
	 * @param int   	$start      Which record to start at
     * @param object	$criteria 	{@link CriteriaElement} to match
     * @param array		$tags 		variables to fetch
     * @param bool		$asObject 	flag indicating as object, otherwise as array
     * @return array of articles {@link Article}
     */
   	function &getByTopic($top_id, $limit=0, $start = 0, $criteria = null, $tags = null, $asObject = true)
   	{
	    if(is_array($tags) && count($tags)>0) {
		    if(!in_array("art_id",$tags) && !in_array("a.art_id",$tags)) $tags[] = "a.art_id";
		    $select = implode(",", $tags);
	    }
	    else $select = "*";
        $sql = "SELECT $select FROM " . art_DB_prefix("article"). " AS a";
        $sql .= " LEFT JOIN ".art_DB_prefix("arttop")." AS at ON at.art_id=a.art_id";
        $sql .= " WHERE a.art_time_submit>0 AND a.art_time_publish>0";
        if(is_array($top_id) && count($top_id)>0){
        	$sql .= " AND at.top_id IN (".implode(",", $top_id).")";
        }elseif(intval($top_id)){
        	$sql .= " AND at.top_id = ".intval($top_id);
        }
        if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
            $sql .= " AND ".$criteria->render();
            if ($criteria->getSort() != "") {
                $sql .= " ORDER BY ".$criteria->getSort()." ".$criteria->getOrder();
                $orderSet = true;
            }
        }
        if(empty($orderSet)) $sql .= " ORDER BY at.at_time DESC";

        $result = $this->db->query($sql, intval($limit), intval($start));
        $ret = array();
        while ($myrow = $this->db->fetchArray($result)) {
            $article =& $this->create(false);
            $article->assignVars($myrow);
            if($asObject){
            	$ret[$myrow["art_id"]] = $article;
        	}else{
	        	foreach($myrow as $key=>$val){
            		$ret[$myrow["art_id"]][$key] = (@$article->vars[$key]["changed"])?$article->getVar($key):$val;
        		}
        	}
            unset($article);
        }
        return $ret;
   	}

    /**
     * get articles matching a condition of a category (categories)
     * 
	 * @param mixed   	$category   Category ID or object
	 * @param int   	$limit      Max number of objects to fetch
	 * @param int   	$start      Which record to start at
     * @param object	$criteria 	{@link CriteriaElement} to match
     * @param array		$tags 		variables to fetch
     * @param bool		$asObject 	flag indicating as object, otherwise as array
     * @return array of articles {@link Article}
     */
   	function &getByCategory($category, $limit = 0, $start = 0, $criteria = null, $tags = null, $asObject = true)
   	{
	    if(is_array($tags) && count($tags)>0) {
		    $key_artid = array_search("art_id", $tags);
		    if(is_numeric($key_artid)){
			    unset($tags[$key_artid]);
		    }
		    $key_artid = array_search("a.art_id", $tags);
		    if(is_numeric($key_artid)){
			    unset($tags[$key_artid]);
		    }
	    	if(strtolower($tags[0]) != "distinct a.art_id"){
	    		array_unshift($tags, "DISTINCT a.art_id");
    		}
		    $select = implode(",", $tags);
	    }
	    else $select = "*";
        $sql = "SELECT $select FROM " . art_DB_prefix("article"). " AS a";
        $sql .= " LEFT JOIN ".art_DB_prefix("artcat")." AS ac ON ac.art_id=a.art_id";
        $sql .= " WHERE a.art_time_submit>0";
        $sql .= " AND (a.cat_id = ac.cat_id OR a.art_time_publish>0)";
        if(is_array($category) && count($category)>0){
	        $category = array_map("intval",$category);
        	$sql .= " AND ac.cat_id IN (".implode(",", $category).")";
        }else{
        	$cat_id = (is_object($category))? $category->getVar("cat_id"):intval($category);
	        if($cat_id>0) $sql .= " AND ac.cat_id = ".intval($cat_id);
        }
        if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
            $sql .= " AND ".$criteria->render();
            if ($criteria->getSort() != "") {
                $sql .= " ORDER BY ".$criteria->getSort()." ".$criteria->getOrder();
                $orderSet = true;
            }
        }
        if(empty($orderSet)) $sql .= " ORDER BY a.art_id DESC";
        $result = $this->db->query($sql, intval($limit), intval($start));
        $ret = array();
        while ($myrow = $this->db->fetchArray($result)) {
            $article =& $this->create(false);
            $article->assignVars($myrow);
            if($asObject){
            	$ret[$myrow["art_id"]] = $article;
        	}else{
	        	foreach($myrow as $key=>$val){
            		$ret[$myrow["art_id"]][$key] = (@$article->vars[$key]["changed"])?$article->getVar($key):$val;
        		}
        	}
            unset($article);
        }
        return $ret;
   	}

    /**
     * get IDs of articles matching a condition of a category (categories)
     * 
	 * @param mixed   	$category   Category ID or object
	 * @param int   	$limit      Max number of objects to fetch
	 * @param int   	$start      Which record to start at
     * @param object	$criteria 	{@link CriteriaElement} to match
     * @return array of article IDs
     */
   	function &getIdsByCategory($category, $limit = 0, $start = 0, $criteria = null)
   	{
        $sql = "SELECT DISTINCT a.art_id FROM " . art_DB_prefix("article")." AS a LEFT JOIN ".art_DB_prefix("artcat")." AS ac ON ac.art_id=a.art_id";
        $sql .= " WHERE 1=1";
        if(is_array($category) && count($category)>0){
	        $category = array_filter(array_map("intval",$category));
	        if(count($category) >0){
	        	$sql .= " AND ac.cat_id IN (".implode(",", $category).")";
        	}
        }else{
        	$cat_id = (is_object($category))? $category->getVar("cat_id"):intval($category);
	        if($cat_id>0) $sql .= " AND ac.cat_id = ".intval($cat_id);
    	}
        if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
            $sql .= " AND ".$criteria->render();
            if ($criteria->getSort() != "") {
                $sql .= " ORDER BY ".$criteria->getSort()." ".$criteria->getOrder();
                $orderSet = true;
            }
        }
        if(empty($orderSet)) $sql .= " ORDER BY ac.ac_publish DESC";
        $result = $this->db->query($sql, $limit, $start);
        $ret = array();
        while ($myrow = $this->db->fetchArray($result)) {
            $ret[] = $myrow["art_id"];
        }
        $ret = array_unique($ret);
        return $ret;
   	}

    /**
     * Update category ids of the article
     * 
	 * {@link CriteriaCompo} 
	 * {@link Criteria} 
	 *
     * @param object	$article 	{@link Article}
     * @return bool
     */
    function updateCategories(&$article)
    {
		$criteria = new CriteriaCompo(new Criteria("ac_publish", 0, ">"));
	    $ids_new = $this->getCategoryIds($article, $criteria);
	    $ids_curr = $article->getVar("art_categories");
    	if(strcmp(serialize($ids_new), serialize($ids_curr))){
	    	$article->setVar("art_categories", $ids_new, true);
	    	$this->insert($article);
    	}
    	return true;
    }

    /**
     * Update topic ids of the article
     * 
     * @param object	$article 	{@link Article}
     * @return bool
     */
    function updateTopics(&$article)
    {
	    $ids_new =& $this->getTopicIds($article);
	    $ids_curr =$article->getVar("art_topics");
    	if(strcmp(serialize($ids_new), serialize($ids_curr))){
	    	$article->setVar("art_topics", $ids_new, true);
	    	$this->insert($article);
    	}
    	return true;
    }

    /**
     * get IDs of categories matching a condition of the article
     * 
     * @param object	$article 	{@link Article} reference to Article
     * @param object	$criteria 	{@link CriteriaElement} to match
     * @return array 	array of category IDs
     */
    function &getCategoryIds(&$article, $criteria = null)
    {
	    $ret = array();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?