Вопрос: как вывести все публикации, когда-либо размещенные на проекте? В хронологическом порядке.
Уточнение: по аналогии, например, со страницей «хорошие», но только что бы выводились абсолютно все публикации с самой первой в строго хронологическом порядке.
Технический вопрос: интересует в первую очередь совет по технической реализации данного вопроса. Т.е. где что дописать.
Не ругайтесь, если вопрос уже обсуждался в каких-то потаенных уголках ЛС (искал, но, увы, не нашел). Буду надеяться на обстоятельные советы и помощь.
Заранее благодарю.
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);
}
}
?>
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 комментариев
В «Прямом эфире» есть возможность вывести весь эфир комментариев, а весь эфир публикаций не выводится — есть смысл добавить эту функцию туда.
В общем спустя немалое кол-во времени я вынужден вернуться к данному вопросу, к публичному его обсуждению.
Ввиду моих крайне скромных познаний (как я уже ранее писал) в программировании в целом и в ЛС (его структуре, архитектуре и прочее) в частности, я все же вынужден еще раз обратить за помощью.
Крайне необходимо мне реализовать отображение Всех публикаций с постраничным выводом в хронологическом порядке, а разобраться самому не получается.
Поэтому если у кого-то вдруг будет возможность (временная или какая-либо еще) помочь в реализации — буду сверх меры благодарен. Возможно кто-то уже реализовал подобное и сможет поделиться наработками. В любом случае без вас мне не справиться :)
можешь взять мой модуль поиска и всего-лишь убрать из функции GetTopicsBySearch, что будет располагаться в classes\modules\topic\mapper\Topic.mapper.class.php
строчки
WHERE LOWER(topic_text) LIKE LOWER('%{$sTag}%')
тогда будут возвращаться все топики :) если ещё убрать операции с постраничностью — все топики будут выводиться на одной :)
GetTopicsBySearch скопировал и переименовал, к примеру, в GetAllTopics. Удалил в ней указанные строки. Кстати, там еще строки вида:
WHERE LOWER(topic_text_source) LIKE LOWER('%{$sTag}%')
Что делать с ними? оставлять или тоже убивать?
Далее… как-то ведь все это дело нужно «запустить»? Ну там прописать путь в config.route.php и наверняка что-то еще (экшн сделать)? Попробовал сделать по аналогии с ActionSearch.class.php (там поменял название функции), но ничего не получилось.
смотри — всё просто — 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
— она будет выглядеть, как ф-ция поиска, только строчки
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
убираем предупреждения — в ActionAllTopics.class.php
добавлением в ф-цию строчки:
error_reporting(0);
— попробуйте использовать другое наименование ф-ции :)
причём — это название нужно использовать и в classes\modules\topic\Topic.class.php и в classes\modules\topic\mapper\Topic.mapper.class.php
Описал в upd процесс, как я сделал. Если будет как-нибудь минутка — оцените. Быть может я чего то не учел. В таком случае поправлю мануал, что бы он все же был сообществу как-то полезен :)
Подскажите, пожалуйста, как убрать операции с постраничность, чтобы на одной странице вывалились все топики?
Пробовал удалить все iPage упоминания, но видимо не то :)
тут два варианта — простой и очень простой :)
очень простой загнать в iPage единицу, а в iPerPage какое-нибудь очень большое число — да хоть миллион :) или даже два миллиона :)
а простой — изменить функцию выборки — изменить SQL-запрос
там придётся менять функцию на select и убирать LIMIT
Я, конечно же выбрал «очень простой способ». Но не понял в каком месте это сделать :)
Ведь если сделаю это в файлике paging.tpl то выходит везде везде так сработает?
Простите за затупанство.
25 комментариев
Запроси примерно такого вида:
Ведь где-то еще нужно прописать новую страницу, ее вид, акшн.
Если не сложно не могли бы Вы немного помочь в этом деле (в свободное от остальных дел время), с программированием у меня тяжеловато.
Заранее благодарю.
Ввиду моих крайне скромных познаний (как я уже ранее писал) в программировании в целом и в ЛС (его структуре, архитектуре и прочее) в частности, я все же вынужден еще раз обратить за помощью.
Крайне необходимо мне реализовать отображение Всех публикаций с постраничным выводом в хронологическом порядке, а разобраться самому не получается.
Поэтому если у кого-то вдруг будет возможность (временная или какая-либо еще) помочь в реализации — буду сверх меры благодарен. Возможно кто-то уже реализовал подобное и сможет поделиться наработками. В любом случае без вас мне не справиться :)
Спасибо.
строчки
тогда будут возвращаться все топики :) если ещё убрать операции с постраничностью — все топики будут выводиться на одной :)
GetTopicsBySearch скопировал и переименовал, к примеру, в GetAllTopics. Удалил в ней указанные строки. Кстати, там еще строки вида:
Что делать с ними? оставлять или тоже убивать?
Далее… как-то ведь все это дело нужно «запустить»? Ну там прописать путь в config.route.php и наверняка что-то еще (экшн сделать)? Попробовал сделать по аналогии с ActionSearch.class.php (там поменял название функции), но ничего не получилось.
Если не сложно подскажите куда мне грести далее.
Еще раз благодарствую :)
или мой пост про добавление
1. добавляем новую регистрацию в config\config.route.php
для этого в
return array(
добавляем строчку
2. создаём в classes\actions\ файл ActionAllTopics.class.php
c классом
внутри вызов функии Topic_GetAllTopics
3. в templates\skin\new\actions\ создаём директорию ActionAllTopics а уже внутри неё файл index.tpl
— именно он будет отображаться при открытии
4. добавляем функцию GetAllTopics в classes\modules\topic\Topic.class.php и в classes\modules\topic\mapper\Topic.mapper.class.php
— она будет выглядеть, как ф-ция поиска, только строчки и
замени на
Вроде так :)
Во-вторых, что получается:
1) На денвере вроде запустилось, но ругается на высокий уровень контроля ошибок… Хотя список показывает
2) На серваке не поперло. Когда я в Topic.mapper.class.php дублирую функцию GetTopicsBySearch дабы сделать из нее функцию GetAllTopics (с заменой на 1=1), мне вываливается ошибка:
О причинах я могу только догадываться :)
добавлением в ф-цию строчки:
— попробуйте использовать другое наименование ф-ции :)
причём — это название нужно использовать и в classes\modules\topic\Topic.class.php и в classes\modules\topic\mapper\Topic.mapper.class.php
Пробовал удалить все iPage упоминания, но видимо не то :)
очень простой загнать в iPage единицу, а в iPerPage какое-нибудь очень большое число — да хоть миллион :) или даже два миллиона :)
а простой — изменить функцию выборки — изменить SQL-запрос
там придётся менять функцию на select и убирать LIMIT
Ведь если сделаю это в файлике paging.tpl то выходит везде везде так сработает?
Простите за затупанство.
т.е. строчку
изменить на
Помогите добрым словом :)
g3n0m, HELP!