<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/

class news_module
{
	protected $mapper=null;
	
	public $validation=HTML_QuickForm2_Rule::ONBLUR_CLIENT_SERVER;
	
	public function __construct()
	{
		$this->mapper=Factory::create('news.mapper');
	}
	
	public function getNewsByFilter($filter, $order, $perPage=10, $page=1)
	{
		$data=array();
		
		$cache_key='news_filter_'.serialize($filter). serialize($order).'_'.$perPage.'_'.$page;
		
		if (!$data=TCache::get($cache_key)) {
			$data = array(
				'collection'=>$this->mapper->getNewsByFilter($filter, $order, $count, $perPage, $page),
				'count'=>$count
			);
			//кэшируем на 8 часов, так как  постепенно должны появляться записи, помеченные будущими числами
			TCache::set($data, $cache_key, array('news_new'), 60*60*8);
		}
		$data['collection'] = $this->getNewsByArrayId($data['collection']);
		return $data;
	}
	
	public function getNewById($id)
	{
		if (!is_numeric($id)) return null;

		$news = $this->getNewsByArrayId(array($id));

		if (isset($news[$id])) {
			return $news[$id];
		}
		return null;
	}
	
	public function getNewsByArrayId($id)
	{
		if ($data=$this->_getNewsByArrayId($id)) {
			foreach ($data as $new) {
				$this->_setAnonce($new);
			}
		}
		return $data;
	}
	
	protected function _getNewsByArrayId($id)
	{
		if (!$id) return array();
		/*if (config::get('sys.cache.solid')) {
			return $this->GetBlogsByArrayIdSolid($id, $aOrder);
		}*/
		if (!is_array($id)) $id = array($id);
		$idNeedToGet = array_unique($id);
		$result = array();

		Factory::load('news.entity');

		$cacheKeys = build_cache_keys($idNeedToGet, 'new_');
		if (false !== ($data = TCache::get($cacheKeys))) {
			foreach ($cacheKeys as $id => $key) {
				if (array_key_exists($id, $data)) {
					if ($data[$id]) {
						$result[$data[$id]->id] = $data[$id];
					}
					unset($cacheKeys[$id]);
				}
			}
		}

		//если остались ключи без значений, то запрашиваем данные из хранилища
		if (count($cacheKeys) && $data = $this->mapper->getNewsByArrayId(array_keys($cacheKeys))) {
			foreach ($data as $new) {
				$result[$new->id] = $new;
				TCache::Set($new, "new_{$new->id}", array(), 60 * 60 * 24 * 7);
				unset($cacheKeys[$new->id]);
			}
		}

		//если и теперь остались ключи без результата, то сохраняем их в кэш пустыми
		if (count($cacheKeys)) {
			foreach ($cacheKeys as $id=>$key) {
				TCache::Set(null, $key, array(), 60 * 60 * 24 * 7);
			}
		}
		$result = array_sort_by_keys($result, $idNeedToGet);
		return $result;
	}
	
	public function addNew($new)
	{
		if ($id=$this->mapper->addNew($new)) {
			$new->id=$id;
			TCache::clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('news_new'));
			return $new;
		}
		return null;
	}	
	public function updateNew($new)
	{
		if ($this->mapper->updateNew($new)) {
			TCache::clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('news_update'));
			TCache::remove("new_{$new->id}");
		}
		return $new;
	}
	
	public function deleteNew($new)
	{
		$this->mapper->deleteNew($new);
		TCache::clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('news_new'));
		TCache::remove("new_{$new->id}");
	}
	
	protected function _setAnonce($new)
	{
		//если присутствует тег [more]
		if ($new->anonce=mb_stristr($new->text, '[more]', true)) return $new;
		
		if (config::get('news_anonce_length')) {
			$text_wo_tags=strip_tags($new->text);
			if (mb_strlen($text_wo_tags)>config::get('news_anonce_length')) {
				preg_match('/^(.{1,'.config::get('news_anonce_length').'})\s/su', $text_wo_tags, $anonce);
				$new->anonce=$anonce[1].'...';
			}
		}
		return $new;
	}
	
	public function buildEditForm($new=null)
	{
		$form = Factory::create('HTML_QuickForm2', null, 'post', array('action'=>'#'));
		$token=$form->addElement('hidden', 'token', array('value' => User::i()->token));
		
		$date=$form->addElement('text', 'date', null, array('label' => _m('Дата:')));
		$title=$form->addElement('text', 'title', null, array('label' => _m('Заголовок:')));
		
		//передаем название поля к которому надо прикрепить визуальный редактор
		Tpl::i()->assign('field', 'text');
		$form->addElement('static', '', null, array('label' => '&nbsp;', 'content'=>Tpl::i()->fetch('WYSIWYG/editor.tpl')));
		
		$text=$form->addElement('textarea', 'text', array('id'=>'text'), array('label' => _m('Текст новости:')));
		
		$date->addRule('required', _m('Надо указать дату'), null, $this->validation)
		->and_($date->addRule('regex', _m('Неправильный формат даты'), '/(\d{2})\.(\d{2})\.(\d{4})/', $this->validation));

		$text->addRule('required', _m('Не введен текст новости'), null, $this->validation);
		
		$form->addElement('submit', null, array('value'=>_m('Сохранить')));
		
		if ($new) {
			$data=$new->getArray();
			$data['date']=date('d.m.Y', $data['date']);
			$form->addDataSource(Factory::create('HTML_QuickForm2_DataSource_Array', $data));
		} else $form->addDataSource(Factory::create('HTML_QuickForm2_DataSource_Array', array('date'=>date('d.m.Y'))));
		
		return $form;
	}
}