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