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