Вывод всех публикаций, размещенных на проекте

Всем доброго дня.

Вопрос: как вывести все публикации, когда-либо размещенные на проекте? В хронологическом порядке.

Уточнение: по аналогии, например, со страницей «хорошие», но только что бы выводились абсолютно все публикации с самой первой в строго хронологическом порядке.

Технический вопрос: интересует в первую очередь совет по технической реализации данного вопроса. Т.е. где что дописать.

Не ругайтесь, если вопрос уже обсуждался в каких-то потаенных уголках ЛС (искал, но, увы, не нашел). Буду надеяться на обстоятельные советы и помощь.

Заранее благодарю.



Upd. 27.05.09
Благодарствую всем, помогающим мне в решении столь ламмерского (для многих просвещенных) вопроса. Решил я его вот как (быть может кому-то пригодится).

1. добавляем новую регистрацию в config\config.route.php
для этого в
return array(
добавляем строчку
'all' => 'ActionTopicsAll',

Но это еще не все. У меня с таким вот раскладом не работало. Посему я добавил строку в верхнем блоке
define("ROUTE_PAGE_ALL",'all');

и строку в блоке 'page' => array(
ROUTE_PAGE_ALL => 'ActionTopicsAll', 

Только после этого процесс пошел

2. создаём в classes\actions\ файл ActionTopicsAll.class.php. Вот что он содержит (потер для компактности комменты)
<?
class ActionTopicsAll extends Action {     
	protected $sMenuHeadItemSelect='blog';
	protected $sMenuItemSelect='index';
	protected $sMenuSubItemSelect='all';
	protected $iCountTopicsNew=0;
	protected $iCountTopicsCollectiveNew=0;
	protected $iCountTopicsPersonalNew=0;
	public function Init() {		
		$this->Viewer_AddBlocks('right',array('notice','stream','banner','blogs','tags'));
		$this->iCountTopicsCollectiveNew=$this->Topic_GetCountTopicsCollectiveNew();
		$this->iCountTopicsPersonalNew=$this->Topic_GetCountTopicsPersonalNew();
		$this->iCountTopicsNew=$this->iCountTopicsCollectiveNew+$this->iCountTopicsPersonalNew;
	}
	protected function RegisterEvent() {		
		$this->AddEventPreg('/^(page(\d+))?$/i','EventIndex');				
	}
	/**********************************************************************************
	 ************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
	 **********************************************************************************/
	protected function EventIndex() {	
		$this->sMenuSubItemSelect='all';
		$iPage=$this->GetEventMatch(2) ? $this->GetEventMatch(2) : 1;
		$aResult=$this->Topic_GetTopicsMegaAll($iPage,BLOG_TOPIC_PER_PAGE);			
		$aTopics=$aResult['collection'];	
		$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,BLOG_TOPIC_PER_PAGE,4,DIR_WEB_ROOT.'/all');
		$this->Viewer_Assign('aTopics',$aTopics);
		$this->Viewer_Assign('aPaging',$aPaging);		
		$this->SetTemplateAction('index');
	}	
	public function EventShutdown() {
		$this->Viewer_Assign('sMenuHeadItemSelect',$this->sMenuHeadItemSelect);
		$this->Viewer_Assign('sMenuItemSelect',$this->sMenuItemSelect);
		$this->Viewer_Assign('sMenuSubItemSelect',$this->sMenuSubItemSelect);
		$this->Viewer_Assign('iCountTopicsNew',$this->iCountTopicsNew);
		$this->Viewer_Assign('iCountTopicsCollectiveNew',$this->iCountTopicsCollectiveNew);
		$this->Viewer_Assign('iCountTopicsPersonalNew',$this->iCountTopicsPersonalNew);
	}
}
?>

В следующем пункте уделим особое внимание строке
$aResult=$this->Topic_GetTopicsMegaAll($iPage,BLOG_TOPIC_PER_PAGE);


3. в classes\modules\topic\Topic.class.php ищем функцию GetTopicsGood. На ее примере мы сделаем функцию GetTopicsMegaAll, которая и описана в п.2 (будет выводить нам все-все-все публикации в хронологическом порядке, самые последние — вверху). Для этого сразу после описания этой функции (GetTopicsGood) вставим вот этот код

/*
* Получает список всех топиков(из всех блогов, как коллективных так и персональных)
*/
	public function GetTopicsMegaAll($iPage,$iPerPage) {
		$aFilter=array(
			'blog_type' => array(
				'personal',
				'open',
			),
			'topic_publish' => 1,			
		);			
		return $this->GetTopicsByFilter($aFilter,$iPage,$iPerPage);
	}

Теперь, зайде на сайте по адресу www.имя_сайта.ru/all/ мы попадем на наш список всех публикаций.

4. Оживляем меню. Для этого в \templates\skin\ваш_скин\menu.blog.tpl в описании блока меню с условием {if $sMenuItemSelect=='index'} добавим необходимую ссылку (не забывая прописать нужное условие для активного состояния, т.е. когда мы находимся в этом разделе).

В принципе все. Багов и глюков я еще не нашел. Возможно это очень далекий от идеала вариант, возможно какие-то ошибки еще могут всплыть, возможно есть «дырки». Но он работает =) И для начала этого хватает.

З.Ы. Знающих прошу поправить, если где-то был неточен или что-то не учел.

Еще раз всем спасибо, особенно noonv.

25 комментариев

avatar
В «Прямом эфире» есть возможность вывести весь эфир комментариев, а весь эфир публикаций не выводится — есть смысл добавить эту функцию туда.
avatar
Туда тоже есть смысл добавить. Но все таки если необходимость во вкладку «Все» мне сделать пункт «все публикации».
avatar
Неужели никто не подскажет? :)
avatar
добавить в маппер топиков запрос по выводу всех топиков
avatar
Наверняка это еще не все :)

Запроси примерно такого вида:
public function GetAllTopics() {
		$sql = "SELECT * FROM ".DB_TABLE_TOPIC." 
			ORDER BY 				
				topic_date_add";		
		return null;
	}

Ведь где-то еще нужно прописать новую страницу, ее вид, акшн.

Если не сложно не могли бы Вы немного помочь в этом деле (в свободное от остальных дел время), с программированием у меня тяжеловато.

Заранее благодарю.
avatar
Пиши в аську, или мыло дай — скину свои экшены — разберешься.
avatar
В общем спустя немалое кол-во времени я вынужден вернуться к данному вопросу, к публичному его обсуждению.

Ввиду моих крайне скромных познаний (как я уже ранее писал) в программировании в целом и в ЛС (его структуре, архитектуре и прочее) в частности, я все же вынужден еще раз обратить за помощью.

Крайне необходимо мне реализовать отображение Всех публикаций с постраничным выводом в хронологическом порядке, а разобраться самому не получается.

Поэтому если у кого-то вдруг будет возможность (временная или какая-либо еще) помочь в реализации — буду сверх меры благодарен. Возможно кто-то уже реализовал подобное и сможет поделиться наработками. В любом случае без вас мне не справиться :)

Спасибо.
avatar
можешь взять мой модуль поиска и всего-лишь убрать из функции GetTopicsBySearch, что будет располагаться в classes\modules\topic\mapper\Topic.mapper.class.php
строчки
WHERE LOWER(topic_text) LIKE LOWER('%{$sTag}%')

тогда будут возвращаться все топики :) если ещё убрать операции с постраничностью — все топики будут выводиться на одной :)
avatar
Спасибо, седня опробую.
avatar
Собственно, уперся…

GetTopicsBySearch скопировал и переименовал, к примеру, в GetAllTopics. Удалил в ней указанные строки. Кстати, там еще строки вида:
WHERE LOWER(topic_text_source) LIKE LOWER('%{$sTag}%')

Что делать с ними? оставлять или тоже убивать?

Далее… как-то ведь все это дело нужно «запустить»? Ну там прописать путь в config.route.php и наверняка что-то еще (экшн сделать)? Попробовал сделать по аналогии с ActionSearch.class.php (там поменял название функции), но ничего не получилось.

Если не сложно подскажите куда мне грести далее.

Еще раз благодарствую :)
avatar
смотри — всё просто — http://livestreet.ru/blog/dev_documentation/254.html
или мой пост про добавление поиска — тебе нужно делать с 4 шага
1. добавляем новую регистрацию в config\config.route.php
для этого в
return array(
добавляем строчку
'all' => 'ActionAllTopics',

2. создаём в classes\actions\ файл ActionAllTopics.class.php
c классом
class ActionAllTopics extends Action { 

внутри вызов функии Topic_GetAllTopics
3. в templates\skin\new\actions\ создаём директорию ActionAllTopics а уже внутри неё файл index.tpl
— именно он будет отображаться при открытии www.твой_сайт/all/
4. добавляем функцию GetAllTopics в classes\modules\topic\Topic.class.php и в classes\modules\topic\mapper\Topic.mapper.class.php
— она будет выглядеть, как ф-ция поиска, только строчки
LOWER(topic_text) LIKE LOWER('%{$sTag}%')
и
LOWER(topic_title) LIKE LOWER('%{$sTag}%')

замени на
1=1

Вроде так :)
avatar
Во-первых, большое спасибо за помощь :)

Во-вторых, что получается:

1) На денвере вроде запустилось, но ругается на высокий уровень контроля ошибок… Хотя список показывает

2) На серваке не поперло. Когда я в Topic.mapper.class.php дублирую функцию GetTopicsBySearch дабы сделать из нее функцию GetAllTopics (с заменой на 1=1), мне вываливается ошибка:
Fatal error: Cannot redeclare Mapper_Topic::GetAllTopics() in /home/esoterix/esoterix.ru/http/classes/modules/topic/mapper/Topic.mapper.class.php on line 1262

О причинах я могу только догадываться :)
avatar
убираем предупреждения — в ActionAllTopics.class.php
добавлением в ф-цию строчки:
error_reporting(0);


— попробуйте использовать другое наименование ф-ции :)
причём — это название нужно использовать и в classes\modules\topic\Topic.class.php и в classes\modules\topic\mapper\Topic.mapper.class.php
avatar
Отлично, справился. Спасибо за помощь. Методику выбрал немного иную, но результат положительный :)
avatar
Отлично :)
avatar
Описал в upd процесс, как я сделал. Если будет как-нибудь минутка — оцените. Быть может я чего то не учел. В таком случае поправлю мануал, что бы он все же был сообществу как-то полезен :)
avatar
:)
avatar
Очень полезная информация, подскажите как быть тем у кого установка не в корне сайта? Какие правки надо внести?
avatar
Подскажите, пожалуйста, как убрать операции с постраничность, чтобы на одной странице вывалились все топики?
Пробовал удалить все iPage упоминания, но видимо не то :)
avatar
тут два варианта — простой и очень простой :)
очень простой загнать в iPage единицу, а в iPerPage какое-нибудь очень большое число — да хоть миллион :) или даже два миллиона :)

а простой — изменить функцию выборки — изменить SQL-запрос

там придётся менять функцию на select и убирать LIMIT
avatar
Я, конечно же выбрал «очень простой способ». Но не понял в каком месте это сделать :)
Ведь если сделаю это в файлике paging.tpl то выходит везде везде так сработает?
Простите за затупанство.
avatar
это нужно делать не в шаблоне, а в экшене — в данном случае ActionTopicsAll.class.php изменить параметры вызова функции
т.е. строчку
$aResult=$this->Topic_GetTopicsMegaAll($iPage,BLOG_TOPIC_PER_PAGE);

изменить на
$aResult=$this->Topic_GetTopicsMegaAll(1,1999999);
avatar
Благодарю вас! Поклон :)
avatar
У меня появилась ошибка:
Fatal error: Uncaught exception 'Exception' with message 'Не найден шаблон подключаемого блока: notice' in Z:\home\www.rus\www\clubs\classes\modules\sys_viewer\Viewer.class.php:284 
Stack trace: 
#0 Z:\home\www.rus\www\clubs\classes\modules\sys_viewer\Viewer.class.php(218): LsViewer->DefineTypeBlock('notice') 
#1 Z:\home\www.rus\www\clubs\classes\modules\sys_viewer\Viewer.class.php(241): LsViewer->AddBlock('right', 'notice') 
#2 Z:\home\www.rus\www\clubs\classes\engine\Engine.class.php(187) : eval()'d code(1): LsViewer->AddBlocks('right', Array) 
#3 Z:\home\www.rus\www\clubs\classes\engine\Engine.class.php(187): eval() 
#4 Z:\home\www.rus\www\clubs\classes\engine\Action.class.php(268): Engine->_CallModule('Viewer_AddBlock...', Array) 
#5 [internal function]: Action->__call('Viewer_AddBlock...', Array) 
#6 Z:\home\www.rus\www\clubs\classes\actions\ActionTopicsAll.class.php(10): ActionTopicsAll->Viewer_AddBlocks('right', Array) 
#7 Z:\home\www.rus\www\clubs\classes\engine\Router.class. in Z:\home\www.rus\www\clubs\classes\modules\sys_viewer\Viewer.class.php on line 284

Помогите добрым словом :)
  • Temy
  • 0
avatar
И у меня оно же(

g3n0m, HELP!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.