diff --git a/e107_handlers/news_class.php b/e107_handlers/news_class.php index b0bed23a3..52656acbc 100644 --- a/e107_handlers/news_class.php +++ b/e107_handlers/news_class.php @@ -9,13 +9,239 @@ * News handler * * $Source: /cvs_backup/e107_0.8/e107_handlers/news_class.php,v $ - * $Revision: 1.16 $ - * $Date: 2009-07-19 11:44:28 $ - * $Author: marj_nl_fr $ + * $Revision: 1.17 $ + * $Date: 2009-08-17 18:47:29 $ + * $Author: secretr $ */ if (!defined('e107_INIT')) { exit; } +class e_news_item extends e_model +{ + protected $_loaded_once = false; + + /** + * Shorthand getter for news fields + * + * @param string $news_field name without the leading 'news_' prefix + * @param mixed $default + * @return mixed data + */ + public function get($news_field, $default = null) + { + return parent::get('news_'.$news_field, $default); + } + + /** + * Load news item by id + * + * @param integer $id + * @param boolean $force + * @return e_news_item + */ + public function load($id, $force = false) + { + if($force || !$this->_loaded_once) + { + $id = intval($id); + $nobody_regexp = "'(^|,)(".str_replace(",", "|", e_UC_NOBODY).")(,|$)'"; + + $query = "SELECT n.*, u.user_id, u.user_name, u.user_customtitle, nc.category_name, nc.category_icon FROM #news AS n + LEFT JOIN #user AS u ON n.news_author = u.user_id + LEFT JOIN #news_category AS nc ON n.news_category = nc.category_id + WHERE n.news_id={$id} AND n.news_class REGEXP '".e_CLASS_REGEXP."' AND NOT (n.news_class REGEXP ".$nobody_regexp.") + AND n.news_start < ".time()." AND (n.news_end=0 || n.news_end>".time().")"; + + if(e107::getDb()->db_Select_gen($query)) + { + $this->setData(e107::getDb()->db_Fetch()); + } + $this->_loaded_once = true; + } + return $this; + } +} + +class e_news_tree extends e_model +{ + /** + * Current tree news category id + * + * @var integer + */ + protected $_current_category_id; + + /** + * Constructor + * + * @param unknown_type $category_id + */ + public function __construct($category_id = null) + { + if(null !== $category_id) + { + $this->load($category_id); + } + } + + /** + * Set current category Id + * + * @param integer $category_id + * @return e_news_tree + */ + function setCurrentCategoryId($category_id) + { + $this->_current_category_id = intval($category_id); + return $this; + } + + /** + * Get news item object from the tree + * Preparing for future news SEF string (string $name) + * + * @param string|integer $name + * @param integer $category_id optional category Id + * @return e_news_item + */ + function getNode($name, $category_id = null) + { + if(null === $category_id) + { + $category_id = $this->_current_category_id; + } + return $this->getData('__tree/'.$category_id.'/'.$name); + } + + /** + * Set news item object + * + * @param string|integer $name + * @param array $data + * @param integer $category_id optional category Id + * @return e_news_tree + */ + function setNode($name, $data, $category_id = null) + { + if(null === $category_id) + { + $category_id = $this->_current_category_id; + } + $this->setData('__tree/'.$category_id.'/'.$name, new e_news_item($data)); + return $this; + } + + /** + * Set new category tree + * + * @param array $tree + * @param integer $category_id + * @return e_news_tree + */ + public function setTree(array $tree, $category_id = null) + { + if(null === $category_id) + { + $category_id = $this->_current_category_id; + } + $this->setData('__tree/'.$category_id, $tree); + return $this; + } + + /** + * Get tree by category id + * + * @param integer $category_id + * @return array + */ + public function getTree($category_id = null) + { + if(null === $category_id) + { + $category_id = $this->_current_category_id; + } + return $this->getData('__tree/'.$category_id); + } + + /** + * Load tree by category id + * + * @param integer $category_id + * @param boolean $force + * @param integer $limit_from + * @param string $order + * @return e_news_tree + */ + public function load($category_id = 0, $force = false, $limit_from = 0, $order = 'n.news_sticky DESC, n.news_datestamp DESC') + { + $category_id = intval($category_id); + $this->setCurrentCategoryId($category_id); + + //TODO - file cache $cacheString = md5($category_id.$limit_from.$order.e_CLASS_REGEXP); + + if($force || !$this->isTree()) + { + $nobody_regexp = "'(^|,)(".str_replace(",", "|", e_UC_NOBODY).")(,|$)'"; + if($category_id) + { + $where = ' news_category='.$category_id.' AND'; + } + $query = "SELECT SQL_CALC_FOUND_ROWS n.*, u.user_id, u.user_name, u.user_customtitle, nc.category_name, nc.category_icon FROM #news AS n + LEFT JOIN #user AS u ON n.news_author = u.user_id + LEFT JOIN #news_category AS nc ON n.news_category = nc.category_id + WHERE{$where} n.news_class REGEXP '".e_CLASS_REGEXP."' AND NOT (n.news_class REGEXP ".$nobody_regexp.") + AND n.news_start < ".time()." AND (n.news_end=0 || n.news_end>".time().") + ORDER BY ".e107::getParser()->toDB($order)." LIMIT ".intval($limit_from).",".intval(e107::getPref('newspost', 15)); + + $tree = array(); + if(e107::getDb()->db_Select_gen($query)) + { + while (true) + { + $row = e107::getDb()->db_Fetch(); + if(!$row) + { + break; + } + $tree[$row['news_id']] = new e_news_item($row); + } + } + $this->setTree($tree); + + } + + return $this; + } + + function isTree($category_id = null) + { + if(null === $category_id) + { + $category_id = $this->_current_category_id; + } + + return $this->isData('__tree/'.$category_id); + } + + function isNode($name, $category_id = null) + { + if(null === $category_id) + { + $category_id = $this->_current_category_id; + } + return $this->isData('__tree/'.$category_id.'/'.$name); + } + + function hasNode($name, $category_id = null) + { + if(null === $category_id) + { + $category_id = $this->_current_category_id; + } + return $this->hasData('__tree/'.$category_id.'/'.$name); + } +} + class news { function submit_item($news, $smessages = false) diff --git a/e107_handlers/pref_class.php b/e107_handlers/pref_class.php index 50636ea25..e7dd14390 100644 --- a/e107_handlers/pref_class.php +++ b/e107_handlers/pref_class.php @@ -9,8 +9,8 @@ * e107 Preference Handler * * $Source: /cvs_backup/e107_0.8/e107_handlers/pref_class.php,v $ - * $Revision: 1.10 $ - * $Date: 2009-08-17 14:40:23 $ + * $Revision: 1.11 $ + * $Date: 2009-08-17 18:47:28 $ * $Author: secretr $ */ @@ -1149,11 +1149,12 @@ class e_model } /** + * @param string $key * @return boolean */ - public function hasData() + public function hasData($key = '') { - return $this->_hasData(); + return $this->_hasData($key); } /** diff --git a/e107_plugins/siteinfo_menu/latestnews_menu.php b/e107_plugins/siteinfo_menu/latestnews_menu.php new file mode 100644 index 000000000..dc48207f8 --- /dev/null +++ b/e107_plugins/siteinfo_menu/latestnews_menu.php @@ -0,0 +1,26 @@ +'; +$ret .= '
'.var_export($parm, true).'


'; + +$ret .= 'Render Item
'; +//$tmpl = e107::getCoreTemplate($parm['tmpl']); +$nitem = new e_news_item(); +$ret .= $nitem->load(1)->get('title'); +//print_a $nitem->getData(); + +$ret .= '

Render Tree
'; +$ntree = new e_news_tree(); +foreach ($ntree->load(1)->getTree() as $nitem) +{ + $ret .= ' - '.$nitem->get('title').'
'; + //print_a $nitem->getData(); +} +e107::getRender()->tablerender('Latest News', $ret, 'latest_news'); +