458 Zeilen
No EOL
17 KiB
PHP
458 Zeilen
No EOL
17 KiB
PHP
<?php
|
|
/**
|
|
* Project:
|
|
* Contenido Content Management System
|
|
*
|
|
* Description:
|
|
* Utility to get articles of category/categories as Article objects.
|
|
* For now, this object will use objects "Article" and "ArticleCollection".
|
|
* TODO: Method getNonStartArticlesInCategoryRange() must be fixed so order by condition is working correctly (works now just by category, not overall)
|
|
* TODO: Somehow avoid ArticleCollection because it is too expensive.
|
|
* TODO: Also take article specifications into account
|
|
* TODO: Extend _buildQuery() to accept more order conditions
|
|
*
|
|
* Requirements:
|
|
* @con_php_req 5.0
|
|
*
|
|
*
|
|
* @package Contenido
|
|
* @version 0.2.0
|
|
* @author Rudi Bieller
|
|
* @copyright four for business AG <www.4fb.de>
|
|
* @license http://www.contenido.org/license/LIZENZ.txt
|
|
* @link http://www.4fb.de
|
|
* @link http://www.contenido.org
|
|
* @since file available since contenido release 4.8.9
|
|
*
|
|
* {@internal
|
|
* created 2008-08-21
|
|
* modified 2009-04-09: Timo Trautmann fixed inconsistence bug in getNonStartArticlesInCategory()
|
|
* modified 2010-10-28 Ortwin Pinke, changed behaviour for $sOrderBy in getNonStartArticlesInCategory()
|
|
*
|
|
*
|
|
* $Id$:
|
|
* }}
|
|
*
|
|
*/
|
|
|
|
if(!defined('CON_FRAMEWORK')) {
|
|
die('Illegal call');
|
|
}
|
|
|
|
|
|
class Contenido_Category_Articles extends Contenido_Category_Base {
|
|
/**#@+
|
|
* @var int
|
|
* @access protected
|
|
*/
|
|
protected $iClient;
|
|
protected $iLang;
|
|
/**#@+
|
|
* @var obj
|
|
* @access protected
|
|
*/
|
|
protected $oArticle;
|
|
protected $oArticleCollection;
|
|
|
|
/**
|
|
* Constructor
|
|
* @access public
|
|
* @param DB_ConLite $oDb
|
|
* @param array $aCfg
|
|
* @param int $iClient
|
|
* @param int $iLang
|
|
* @return void
|
|
*/
|
|
public function __construct(DB_ConLite $oDb, array $aCfg, $iClient, $iLang) {
|
|
parent::__construct($oDb, $aCfg);
|
|
$this->setClient($iClient);
|
|
$this->setLang($iLang);
|
|
}
|
|
|
|
/**
|
|
* Return array with article-objects of a category.
|
|
* @access public
|
|
* @param int $iCategoryId
|
|
* @param string $sOrderBy
|
|
* @param string $sOrder
|
|
* @param boolean $bArticleIdAsKey
|
|
* @param int $iOnlineStatus 0-offline, 1-online, 2-both
|
|
* @return array An array with Article objects
|
|
* @throws Exception In case of a sql query that crashes
|
|
*/
|
|
public function getArticlesInCategory($iCategoryId, $sOrderBy = "creationdate", $sOrder = "ASC", $bArticleIdAsKey = false, $iOnlineStatus = 2) {
|
|
$aReturn = array();
|
|
$sSql = $this->_buildQuery('idcat = '.Contenido_Security::toInteger($iCategoryId), $sOrderBy, $sOrder, $iOnlineStatus);
|
|
if ($this->bDbg === true) {
|
|
$this->oDbg->show($sSql, 'Contenido_Category_Articles::getArticlesInCategory() $sSql');
|
|
}
|
|
|
|
$this->oDb->query($sSql);
|
|
|
|
$bHasErrors = $this->oDb->Errno == 0 ? $bHasErrors = false : $bHasErrors = true;
|
|
if ($bHasErrors === false && $this->oDb->num_rows() > 0) {
|
|
while($this->oDb->next_record()) {
|
|
if ($bArticleIdAsKey === false) {
|
|
$aReturn[] = new Article($this->oDb->f('idart'), $this->getClient(), $this->getLang());
|
|
} else {
|
|
$aReturn[intval($this->oDb->f('idart'))] = new Article($this->oDb->f('idart'), $this->getClient(), $this->getLang());
|
|
}
|
|
}
|
|
}
|
|
if ($bHasErrors === true) {
|
|
throw new Exception('Error in SQL-Query! Errno: '.$this->oDb->Errno.', Error: '.$this->oDb->Error.', SQL: '.$sSql);
|
|
}
|
|
return $aReturn;
|
|
}
|
|
|
|
/**
|
|
* Return array with article-objects of a category that are online.
|
|
* @access public
|
|
* @param int $iCategoryId
|
|
* @param string $sOrderBy
|
|
* @param string $sOrder
|
|
* @param boolean $bArticleIdAsKey
|
|
* @param int $iOnlineStatus 0-offline, 1-online, 2-both
|
|
* @return array An array with Article objects
|
|
* @throws Exception In case of a sql query that crashes
|
|
*/
|
|
public function getOnlineArticlesInCategory($iCategoryId, $sOrderBy = "creationdate", $sOrder = "ASC", $bArticleIdAsKey = false) {
|
|
try {
|
|
return $this->getArticlesInCategory($iCategoryId, $sOrderBy, $sOrder, $bArticleIdAsKey, 1);
|
|
} catch (Exception $e) {
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return array with article-objects of a category that are offline.
|
|
* @access public
|
|
* @param int $iCategoryId
|
|
* @param string $sOrderBy
|
|
* @param string $sOrder
|
|
* @param boolean $bArticleIdAsKey
|
|
* @param int $iOnlineStatus 0-offline, 1-online, 2-both
|
|
* @return array An array with Article objects
|
|
* @throws Exception In case of a sql query that crashes
|
|
*/
|
|
public function getOfflineArticlesInCategory($iCategoryId, $sOrderBy = "creationdate", $sOrder = "ASC", $bArticleIdAsKey = false) {
|
|
try {
|
|
return $this->getArticlesInCategory($iCategoryId, $sOrderBy, $sOrder, $bArticleIdAsKey, 0);
|
|
} catch (Exception $e) {
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return array with article-objects of a category range.
|
|
* @access public
|
|
* @param array $aCategoryIds
|
|
* @param string $sOrderBy
|
|
* @param string $sOrder
|
|
* @param boolean $bArticleIdAsKey
|
|
* @param int $iOnlineStatus 0-offline, 1-online, 2-both
|
|
* @return array An array with Article objects
|
|
* @throws Exception In case of a sql query that crashes or wrong parameters
|
|
*/
|
|
public function getArticlesInCategoryRange(array $aCategoryIds, $sOrderBy = "creationdate", $sOrder = "ASC", $bArticleIdAsKey = false, $iOnlineStatus = 2) {
|
|
$aReturn = array();
|
|
$aSqlIn = array();
|
|
if (sizeof($aCategoryIds) > 0) {
|
|
foreach ($aCategoryIds as $iId) {
|
|
$aSqlIn[] = Contenido_Security::toInteger($iId);
|
|
}
|
|
} else {
|
|
throw new Exception('$aCategoryIds must contain at least one item!');
|
|
}
|
|
$sSql = $this->_buildQuery('idcat IN('.implode(', ', $aSqlIn).')', $sOrderBy, $sOrder, $iOnlineStatus);
|
|
if ($this->bDbg === true) {
|
|
$this->oDbg->show($sSql, 'Contenido_Category_Articles::getArticlesInCategory() $sSql');
|
|
}
|
|
$this->oDb->query($sSql);
|
|
$bHasErrors = $this->oDb->Errno == 0 ? false : true;
|
|
if ($bHasErrors === false && $this->oDb->num_rows() > 0) {
|
|
while($this->oDb->next_record()) {
|
|
if ($bArticleIdAsKey === false) {
|
|
$aReturn[] = new Article($this->oDb->f('idart'), $this->getClient(), $this->getLang());
|
|
} else {
|
|
$aReturn[intval($this->oDb->f('idart'))] = new Article($this->oDb->f('idart'), $this->getClient(), $this->getLang());
|
|
}
|
|
}
|
|
}
|
|
if ($bHasErrors === true) {
|
|
throw new Exception('Error in SQL-Query! Errno: '.$this->oDb->Errno.', Error: '.$this->oDb->Error.', SQL: '.$sSql);
|
|
}
|
|
return $aReturn;
|
|
}
|
|
|
|
/**
|
|
* Return array with online article-objects of a category range.
|
|
* @access public
|
|
* @param array $aCategoryIds
|
|
* @param string $sOrderBy
|
|
* @param string $sOrder
|
|
* @param boolean $bArticleIdAsKey
|
|
* @param int $iOnlineStatus 0-offline, 1-online, 2-both
|
|
* @return array An array with Article objects
|
|
* @throws Exception In case of a sql query that crashes
|
|
*/
|
|
public function getOnlineArticlesInCategoryRange(array $aCategoryIds, $sOrderBy = "creationdate", $sOrder = "ASC", $bArticleIdAsKey = false) {
|
|
try {
|
|
return $this->getArticlesInCategoryRange($aCategoryIds, $sOrderBy, $sOrder, $bArticleIdAsKey, 1);
|
|
} catch (Exception $e) {
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return array with offline article-objects of a category range.
|
|
* @access public
|
|
* @param array $aCategoryIds
|
|
* @param string $sOrderBy
|
|
* @param string $sOrder
|
|
* @param boolean $bArticleIdAsKey
|
|
* @param int $iOnlineStatus 0-offline, 1-online, 2-both
|
|
* @return array An array with Article objects
|
|
* @throws Exception In case of a sql query that crashes
|
|
*/
|
|
public function getOfflineArticlesInCategoryRange(array $aCategoryIds, $sOrderBy = "creationdate", $sOrder = "ASC", $bArticleIdAsKey = false) {
|
|
try {
|
|
return $this->getArticlesInCategoryRange($aCategoryIds, $sOrderBy, $sOrder, $bArticleIdAsKey, 0);
|
|
} catch (Exception $e) {
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return start article of a given category.
|
|
* Remember to check for idart: if intval(idart) == 0, given idcat has no start article!
|
|
* @access public
|
|
* @param int $iCategoryId
|
|
* @return obj Article
|
|
*/
|
|
public function getStartArticleInCategory($iCategoryId) {
|
|
$aOptions = array(
|
|
'idcat' => Contenido_Security::toInteger($iCategoryId),
|
|
'lang' => $this->getLang(),
|
|
'client' => $this->getClient(),
|
|
'start' => true
|
|
);
|
|
$this->oArticleCollection = new ArticleCollection($aOptions);
|
|
return $this->oArticleCollection->startArticle();
|
|
}
|
|
|
|
/**
|
|
* Return non start articles of a given category.
|
|
* Remember to check for idart: if intval(idart) == 0, given idcat has no start article!
|
|
* @access public
|
|
* @param int $iCategoryId
|
|
* @param string $sOrderBy Valid are fields of tbl. con_art_lang
|
|
* @param string $sOrderDirection
|
|
* @param boolean $bArticleIdAsKey
|
|
* @return array An array with Article objects if any were found
|
|
*/
|
|
public function getNonStartArticlesInCategory($iCategoryId, $sOrderBy = 'created', $sOrderDirection = 'DESC', $bArticleIdAsKey = false) {
|
|
if (!in_array(strtolower($sOrderDirection), array('asc', 'desc'))) {
|
|
$sOrderDirection = 'DESC';
|
|
}
|
|
|
|
if($sOrderBy != 'created') {
|
|
|
|
switch ($sOrderBy) {
|
|
case 'sortsequence':
|
|
$sOrderBy = 'artsort';
|
|
break;
|
|
case 'modificationdate':
|
|
$sOrderBy = 'lastmodified';
|
|
break;
|
|
case 'creationdate':
|
|
$sOrderBy = 'created';
|
|
break;
|
|
case 'publisheddate':
|
|
$sOrderBy = 'published';
|
|
break;
|
|
|
|
default:
|
|
$sOrderBy = 'created';
|
|
}
|
|
}
|
|
|
|
$aReturn = array();
|
|
$aOptions = array(
|
|
'idcat' => Contenido_Security::toInteger($iCategoryId),
|
|
'lang' => $this->getLang(),
|
|
'client' => $this->getClient(),
|
|
'start' => false,
|
|
'order' => Contenido_Security::escapeDB($sOrderBy, $this->oDb),
|
|
'direction' => $sOrderDirection
|
|
);
|
|
|
|
$this->oArticleCollection = new ArticleCollection($aOptions);
|
|
while ($oArticle = $this->oArticleCollection->nextArticle()) {
|
|
if ($bArticleIdAsKey === false) {
|
|
$aReturn[] = $oArticle;
|
|
} else {
|
|
$aReturn[$oArticle->values['idart']] = $oArticle;
|
|
}
|
|
}
|
|
return $aReturn;
|
|
}
|
|
|
|
/**
|
|
* Return start articles of a given category range.
|
|
* Remember to check for idart: if intval(idart) == 0, given idcat has no start article!
|
|
* @access public
|
|
* @param array $aCategoryIds
|
|
* @param boolean $bArticleIdAsKey
|
|
* @return array An array with Article objects if any were found
|
|
*/
|
|
public function getStartArticlesInCategoryRange(array $aCategoryIds, $bArticleIdAsKey = false) {
|
|
$aReturn = array();
|
|
if (sizeof($aCategoryIds) > 0) {
|
|
foreach ($aCategoryIds as $iIdcat) {
|
|
$aOptions = array(
|
|
'idcat' => Contenido_Security::toInteger($iIdcat),
|
|
'lang' => $this->getLang(),
|
|
'client' => $this->getClient(),
|
|
'start' => true
|
|
);
|
|
$this->oArticleCollection = new ArticleCollection($aOptions);
|
|
if ($bArticleIdAsKey === false) {
|
|
$aReturn[] = $this->oArticleCollection->startArticle();
|
|
} else {
|
|
$oStartArticle = $this->oArticleCollection->startArticle();
|
|
$aReturn[$oStartArticle->values['idart']] = $oStartArticle;
|
|
}
|
|
}
|
|
}
|
|
return $aReturn;
|
|
}
|
|
|
|
/**
|
|
* Return non start articles of a given category range.
|
|
* Remember to check for idart: if intval(idart) == 0, given idcat has no start article!
|
|
* Sortorder is applied to each category and not overall!
|
|
* @access public
|
|
* @param array $aCategoryIds
|
|
* @param string $sOrderBy Valid are fields of tbl. con_art_lang
|
|
* @param string $sOrderDirection
|
|
* @param boolean $bArticleIdAsKey
|
|
* @return array An array with Article objects if any were found
|
|
* TODO: must be fixed so order by condition is working correctly (works now just by category, not overall)
|
|
*/
|
|
public function getNonStartArticlesInCategoryRange(array $aCategoryIds, $sOrderBy = 'created', $sOrderDirection = 'DESC', $bArticleIdAsKey = false) {
|
|
throw new Exception('Method not implemented yet!');
|
|
if (!in_array(strtolower($sOrderDirection), array('asc', 'desc'))) {
|
|
$sOrderDirection = 'DESC';
|
|
}
|
|
$aReturn = array();
|
|
if (sizeof($aCategoryIds) > 0) {
|
|
foreach ($aCategoryIds as $iIdcat) {
|
|
$aOptions = array(
|
|
'idcat' => Contenido_Security::toInteger($iIdcat),
|
|
'lang' => $this->getLang(),
|
|
'client' => $this->getClient(),
|
|
'start' => false,
|
|
'order' => Contenido_Security::escapeDB($sOrderBy, $this->oDb),
|
|
'direction' => $sOrderDirection
|
|
);
|
|
$this->oArticleCollection = new ArticleCollection($aOptions);
|
|
if ($bArticleIdAsKey === false) {
|
|
$aReturn[] = $this->oArticleCollection->startArticle();
|
|
} else {
|
|
$oStartArticle = $this->oArticleCollection->startArticle();
|
|
$aReturn[$oStartArticle->values['idart']] = $oStartArticle;
|
|
}
|
|
}
|
|
}
|
|
return $aReturn;
|
|
}
|
|
|
|
public function getCategoryByArticleId($iArticleId) {
|
|
throw new Exception('Method not implemented yet!');
|
|
}
|
|
|
|
// Getter/Setter
|
|
|
|
public function setLang($iLang) {
|
|
$this->iLang = (int) $iLang;
|
|
}
|
|
|
|
public function setClient($iClient) {
|
|
$this->iClient = (int) $iClient;
|
|
}
|
|
|
|
|
|
public function getLang() {
|
|
return (int) $this->iLang;
|
|
}
|
|
|
|
public function getClient() {
|
|
return (int) $this->iClient;
|
|
}
|
|
|
|
/**
|
|
* Builds SQL query to be used to fetch articles of one/more category/categories
|
|
*
|
|
* @param string $sCategorySelect Must bei either "idcat = 1" or "idcat IN(1,2,3)". Not very beautiful...
|
|
* @param string $sOrderBy
|
|
* @param string $sOrder
|
|
* @param int $iOnlineStatus
|
|
* @return unknown
|
|
*/
|
|
private function _buildQuery($sCategorySelect, $sOrderBy = "creationdate", $sOrder = "ASC", $iOnlineStatus = 2) {
|
|
$sReturn = '';
|
|
$sCategorySelect = str_replace(';', '', $sCategorySelect);
|
|
// determine online state
|
|
switch ($iOnlineStatus) {
|
|
case 0:
|
|
$sOnline = 'artlang.online = 0';
|
|
break;
|
|
case 1:
|
|
$sOnline = 'artlang.online = 1';
|
|
break;
|
|
case 2:
|
|
default:
|
|
$sOnline = ' (artlang.online = 1 OR artlang.online = 0) ';
|
|
break;
|
|
}
|
|
// determine order condition
|
|
if (!in_array(strtolower($sOrder), array('asc', 'desc'))) {
|
|
$sOrder = 'ASC';
|
|
}
|
|
switch ($sOrderBy) { // TODO: extend to more valid items
|
|
case "sortsequence":
|
|
$sOrderCondition = 'ORDER BY artlang.artsort '.$sOrder;
|
|
break;
|
|
case "creationdate":
|
|
$sOrderCondition = 'ORDER BY artlang.created '.$sOrder;
|
|
break;
|
|
case "modificationdate":
|
|
$sOrderCondition = 'ORDER BY artlang.lastmodified '.$sOrder;
|
|
break;
|
|
case "publisheddate":
|
|
$sOrderCondition = 'ORDER BY artlang.published '.$sOrder;
|
|
break;
|
|
default:
|
|
$sOrderCondition = 'ORDER BY artlang.artsort '.$sOrder;
|
|
break;
|
|
}
|
|
$sSql = 'SELECT
|
|
artlang.idart, artlang.online
|
|
FROM
|
|
'.$this->aCfg['tab']['art_lang'].' AS artlang,
|
|
'.$this->aCfg['tab']['art'].' AS art,
|
|
'.$this->aCfg['tab']['cat_art'].' AS catart
|
|
WHERE
|
|
catart.'.$sCategorySelect.' AND
|
|
art.idclient = '.$this->getClient().' AND
|
|
artlang.idlang = '.$this->getLang().' AND
|
|
'.$sOnline.' AND
|
|
art.idart = catart.idart AND
|
|
artlang.idart = art.idart
|
|
'.$sOrderCondition.' ';
|
|
|
|
return $sSql;
|
|
}
|
|
}
|
|
?>
|