article.php

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

PHP
1,497
字号
	    if( $article->getVar("art_id") ==0 ) return $ret;

        $sql = "SELECT cat_id FROM " . art_DB_prefix("artcat") . " WHERE art_id=".$article->getVar("art_id");
        if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
            $sql .= " AND ".$criteria->render();
        }
        $result = $this->db->query($sql);
        while ($myrow = $this->db->fetchArray($result)) {
            $ret[] = $myrow["cat_id"];
        }
        return $ret;
    }

    /**
     * get status of categories of the article
     * 
     * @param object	$article 	{@link Article} reference to Article
     * @return array 	associative array of category IDs and status
     */
    function &getCategoryArray(&$article)
    {
	    $_cachedCats = array();
	    $art_id = is_object($article)? $article->getVar("art_id") : intval($article);
        $sql = "SELECT cat_id, ac_publish AS approved FROM " . art_DB_prefix("artcat") . " WHERE art_id =". $art_id;
        if(!$result = $this->db->query($sql)){
        	return $_cachedCats;
        }
        while ($myrow = $this->db->fetchArray($result)) {
            $_cachedCats[$myrow["cat_id"]] = $myrow["approved"];
        }
        return $_cachedCats;
    }

    /**
     * get IDs of active topics of the article
     * 
     * @param object	$article 	{@link Article} reference to Article
     * @return array 	array of topic IDs
     */
    function &getTopicIds(&$article, $criteria = null)
    {
        $ret = array();
        $art_id = is_object($article) ? $article->getVar("art_id") : intval($article);
		$topic_handler =& xoops_getmodulehandler("topic", $GLOBALS["artdirname"]);
        if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
        }else{
			$criteria = new CriteriaCompo(new Criteria("t.top_expire", time(), ">"));
        }
		if($topics_obj =& $topic_handler->getByArticle($art_id, $criteria)){
			$ret = array_keys($topics_obj);
		}
        return $ret;
    }

    /**
     * insert a new article into the database
     * 
     * @param	object	$article 	{@link Article} reference to Article
     * @param 	bool 	$force 		flag to force the query execution despite security settings
     * @return 	int 	article ID
     */
    function insert(&$article, $force = true)
    {
        global $xoopsUser;
        
        $art_id = parent::insert($article, $force);
        
        if($art_id && $article->getVar("art_time_publish")){
            if (is_object($xoopsUser)) $xoopsUser->incrementPost();
            if (!empty($article->vars["art_keywords"]["changed"])) {
	            $this->updateKeywords($article);
            }
        }
        
        return $art_id;
    }

    /**
     * Update keyword-article links of the article
     * 
     * @param	object	$article 	{@link Article} reference to Article
     * @return 	bool 	true on success
     */
    function updateKeywords(&$article)
    {
		if ($tag_handler = @xoops_getmodulehandler("tag", "tag", true)) {
			$tag_handler->updateByItem($article->getVar("art_keywords", "n"), $article->getVar("art_id"), $GLOBALS["artdirname"]);
		}
	    return true;
    }

    /**
     * Delete keyword-article links of the article from database
     * 
     * @param	object	$article 	{@link Article} reference to Article
     * @return 	bool 	true on success
     */
    function deleteKeywords(&$article)
    {
		if ($tag_handler = @xoops_getmodulehandler("tag", "tag", true)) {
			$tag_handler->updateByItem(array(), $article->getVar("art_id"), $GLOBALS["artdirname"]);
		}
        return true;
    }

    /**
     * delete an article from the database
     * 
     * {@link Text}
     *
     * @param	object	$article 	{@link Article} reference to Article
     * @param 	bool 	$force 		flag to force the query execution despite security settings
     * @return 	bool 	true on success
     */
    function delete(&$article, $force = true)
    {
	    if(empty($force) && xoops_comment_count($GLOBALS["xoopsModule"]->getVar("mid"), $article->getVar("art_id"))){
		    return false;
	    }
	    /*
        $files = $article->getVar("art_files");
        if(count($files)>0){
	        $file_handler =&  xoops_getmodulehandler("file", $GLOBALS["artdirname"]);
	        $file_handler->delete($files);
        }
        */
        
        //$queryFunc = empty($force)?"query":"queryF";

        $text_handler =& xoops_getmodulehandler("text", $GLOBALS["artdirname"]);
	    $text_handler->deleteAll(new Criteria("art_id", $article->getVar("art_id")));

        $rate_handler =& xoops_getmodulehandler("rate", $GLOBALS["artdirname"]);
	    $rate_handler->deleteAll(new Criteria("art_id", $article->getVar("art_id")));

    	$this->terminateCategory($article, $article->getCategories(), false);
        $this->terminateTopic($article);

        $this->deleteKeywords($article);
        
        xoops_comment_delete($GLOBALS["xoopsModule"]->getVar("mid"), $article->getVar("art_id"));
        xoops_notification_deletebyitem($GLOBALS["xoopsModule"]->getVar("mid"), "article", $article->getVar("art_id"));

        parent::delete($article, $force);

        $article = null;
        unset($article);
        return true;
    }

    /**
     * Set article-category status of the article
     * 
     * {@link Xcategory}
     *
     * @param	mixed		$art_id 	article ID
     * @param	mixed		$cat_id 	category ID
     * @param	int			$status 	status value
     * @param	int			$time 		register, publish or feature time; 0 for time()
     * @return 	bool 	true on success
     */
    function setCategoryStatus(&$article, $cat_id, $status = 1, $time = 0)
    {
		if(!is_object($article)) {
			$art_id = intval($article);
			$article_obj =& $this->get($article);
		}else{
			$article_obj =& $article;
			$art_id = $article->getVar("art_id");
		} 
	    if(empty($art_id)) return false;

		$where = " WHERE ac.art_id = ".$art_id;
		$table = art_DB_prefix("artcat")." AS ac";
	    switch($status){
		    case 2:
				$time = empty($time) ? time() : $time;
		    	// Multi-table update only supported by MySQL 4.0.4+
		    	// Version check and update by scottlai
		    	if (version_compare($this->mysql_server_version(), "4.0.4", "<")) {
		    		if ($article_obj->getVar("art_time_publish") > 0) {
		    			$value = "ac_feature = {$time}, ac_publish = IF( ac_publish = 0, {$time}, ac_publish )";
	    			}else {
		    			$value = "ac_feature = 0";
	    			}
		    	} else {
			    	$table .= ", ".art_DB_prefix("article")." AS a";
			    	$value = "ac.ac_feature = {$time}, ac.ac_publish = IF( ac.ac_publish = 0, {$time}, ac.ac_publish )";
			    	$where .= " AND a.art_id = ac.art_id AND a.art_time_publish > 0";
			    }
		    	break;
		    case 0:
		    	$value = "ac.ac_feature = 0, ac.ac_publish = 0";
		    	break;
		    default:
		    case 1:
				$time_feature = empty($time) ? 0 : $time;
				$time_publish = empty($time) ? time() : $time;
		    	// Multi-table update only supported by MySQL 4.0.4+
		    	// Version check and update by scottlai
				if (version_compare($this->mysql_server_version(), "4.0.4", "<")) {
					$art_time_publish = $article_obj->getVar("art_time_publish");
					$a_cat_id = $article_obj->getVar("cat_id");
					$value .= " ac.ac_publish = IF( ac.ac_publish = 0, IF( {$a_cat_id} = ac.cat_id, {$time_publish}, IF( {$art_time_publish} > 0, {$time_publish}, 0 ) ), {$time_publish}),";
					$value .= " ac.ac_feature = IF( ac.ac_feature = 0, 0, {$time_feature} )";
					
					/* Update art_time_publish manually instead of using multi-table update */
					if(!$art_time_publish) {
						$article_obj->setVar("art_time_publish", $time_publish);
						$this->insert($article_obj, false);
					}
				} else {
			    	$table .= ", ".art_DB_prefix("article")." AS a";
			    	$value  = "a.art_time_publish = IF( a.art_time_publish = 0, IF( a.cat_id = ac.cat_id, {$time_publish}, 0 ), a.art_time_publish ), ";
			    	$value .= " ac.ac_publish = IF( ac.ac_publish = 0, IF( a.cat_id = ac.cat_id, {$time_publish}, IF( a.art_time_publish > 0, {$time_publish}, 0 ) ), {$time_publish} ),";
					$value .= " ac.ac_feature = IF( ac.ac_feature = 0, 0, {$time_feature} )";
			    	$where .= " AND a.art_id = ac.art_id";
			    }
		    	break;
	    }
		if(!empty($cat_id)){
		    $cat_id = is_array($cat_id) ? $cat_id : array($cat_id);
		    $where .= " AND ac.cat_id IN (".implode(",", array_map("intval", $cat_id)).")";
	    }

        $sql = "UPDATE ".$table." SET ".$value. $where;
        
        /* filter all table short-name when mysql version below 4.0.4 */
        if (version_compare($this->mysql_server_version(), "4.0.4", "<")) {
        	$pattern = array("AS ac", "AS a", "ac.", "a.");
        	$sql = str_replace($pattern, array(), $sql);
        }

        if (!$result = $this->db->queryF($sql)) {
            xoops_error("update article-category error:" . $sql);
            return false;
        }
        
		$category_handler =& xoops_getmodulehandler("category", $GLOBALS["artdirname"]);
		$category_handler->setLastArticleIds($cat_id);

	    return true;
    }

    /**
     * get article-category status of a list articles
     * 
     * @param	int			$cat_id 	category ID
     * @param	mixed		$art_id 	article ID
     * @param	int			$status 	status value
     * @return 	array 		associative array of article IDs and status
     */
    function getCategoryStatus($cat_id, $art_id = null)
    {
	    if(empty($cat_id)) return null;
	    if(!is_array($art_id)){
		    $art_id = array($art_id);
		    $isSingle = true;
	    }
	    if(count($art_id)==0) return null;
	    $art_id = array_map("intval",$art_id);

        $sql = "SELECT DISTINCT art_id, ac_register AS register, ac_publish AS publish, ac_feature AS feature FROM ".art_DB_prefix("artcat")." WHERE art_id IN (".implode(",",$art_id).")";
        if (!$result = $this->db->query($sql)) {
            xoops_error("query article-category error: " . $sql);
            return null;
        }
        $ret = array();
        while ($myrow = $this->db->fetchArray($result)) {
	        $status = ($myrow["feature"])?2:( ($myrow["publish"])?1:(($myrow["register"])?0:null) );
        	if(!empty($isSingle)) return $status;
            $ret[$myrow["art_id"]] = $status;
        }
        return $ret;
    }

    /**
     * Set article-category status as published (value = 1) 
     * 
     * @param	mixed		$art_id 	article ID
     * @param	mixed		$cat_id 	category ID
     * @return 	bool 	true on success
     */
    function publishCategory(&$article, $cats)
    {
	    if(!$ret = $this->setCategoryStatus($article, $cats, 1)) return false;
		
		if (!empty($GLOBALS["xoopsModuleConfig"]["notification_enabled"])) {
			$category_handler =& xoops_getmodulehandler("category", $GLOBALS["artdirname"]);
			$notification_handler =& xoops_gethandler("notification");
			if(!is_object($article)) $article_obj =& $this->get($article);
			else $article_obj =& $article; 
			$cats = is_array($cats)?$cats:array($cats);
			$tags = array();
			$tags["ARTICLE_ACTION"] = art_constant("MD_NOT_ACTION_PUBLISHED");
			$tags["ARTICLE_TITLE"] = $article_obj->getVar("art_title");
			foreach($cats as $id){
				$tags["ARTICLE_URL"] = XOOPS_URL . "/modules/" . $GLOBALS["artdirname"] . "/view.article.php".URL_DELIMITER."" .$article_obj->getVar("art_id")."/c".$id;
				$category_obj =& $category_handler->get($id); 
				$tags["CATEGORY_TITLE"] = $category_obj->getVar("cat_title");
				$notification_handler->triggerEvent("global", 0, "article_new", $tags);
				$notification_handler->triggerEvent("global", 0, "article_monitor", $tags);
				$notification_handler->triggerEvent("category", $id, "article_new", $tags);
				$notification_handler->triggerEvent("article", $article_obj->getVar("art_id"), "article_approve", $tags);
				unset($category_obj);
			}
		}
		
		return true;
	    
    }

    /**
     * Set article-category status as dismissed(pending) (value = 0) 
     * 
     * @param	mixed		$art_id 	article ID
     * @param	mixed		$cat_id 	category ID
     * @return 	bool 	true on success
     */
    function unPublishCategory(&$article, $cats)
    {
	    return $this->setCategoryStatus($article, $cats, 0);
    }

    /**
     * Set article-category status as featured (value = 2) 
     * 
     * @param	mixed		$art_id 	article ID
     * @param	mixed		$cat_id 	category ID
     * @return 	bool 	true on success
     */
    function featureCategory(&$article, $cats)
    {
	    return $this->setCategoryStatus($article, $cats, 2);
    }

    /**
     * Set article-category status as normal (value = 1) 
     * 
     * @param	mixed		$art_id 	article ID
     * @param	mixed		$cat_id 	category ID
     * @return 	bool 	true on success
     */
    function unFeatureCategory(&$article, $cats)
    {
	    return $this->setCategoryStatus($article, $cats, 1);
    }

    /**
     * register an article to categories
     *
     * TODO: refactoring with publishCategory
     * 
     * {@link Xcategory}
     *
     * @param	object	$article 	{@link Article} reference to Article
     * @param 	array 	$cats 		array of category IDs
     * @return 	bool 	true on success
     */
    function registerCategory(&$article, $cats)
    {
		$art_id = is_object($article) ? $article->getVar("art_id") : intval($art_id);
	    if( empty($art_id) || empty($cats) ) return false;
	    $cats_pub = array();
	    $cat_str=array();
	    foreach($cats as $id => $cat) {
		    $status = @intval($cat["status"]);
		    if($status > 2) $status = 2;
		    if($status < 0) $status = 0;
		    if($status > 0) $cats_pub[] = $id;
		    switch($status){
			    // Publish and feature
			    case 2:
			    	$value = time().",".time().",".time();
			    	break;

⌨️ 快捷键说明

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