Хочу чтобы посты из определенного коллективного блога не транслировались в общую ленту www.site.ru/new, а показывались только www.site.ru/blog/nazvanie_bloga/. Это даёт возможность создать ленту блога на отвлечённую от главной темы сайта например, со ссылкой из основного меню.
Представляется следующая схема: у блога есть поле blog_index_rating_good — это пороговое значение рейтинга ТОПИКА, при котором топик из этого блога начинает показываться на главной как «хороший». Таким образом поле blog_index_rating_good становится специфической настройкой конфига «module.blog.index_good» для каждого отдельно взятого блога.
У вас есть другие идеи?:)
11 комментариев
это легко сделать в шаблоне, не меняя сист файлы
в файле topic_list.tpl
после
{foreach from=$aTopics item=oTopic}
добавим
{if $oTopic->getBlogId()!='13' or ($oTopic->getBlogId()=='13' and $sEvent=='projects')}
не забыв закрыть if перед концом foreach
13 — ид блога
projects — его url в строке site.com/blog/projects/
худший вариант: допустим у нас в одном блоге много свежих топиков вдруг появилось и они заполнили всю (допусим главную) страницу. маппер вернул нам эту пачку свежих топиков а мы шаблоном их фильтуем. у нас получается пустая страница.
обычный вариант: у нас часть топиков из фильтруемого блога, а часть из других блогов. скажем 1/4 из фильтруемого. таким образом страница похудеет на 1/4 контента. мы получим страницы с неравным количеством топиков.
В этом решении плохо всё: и попытка вынести логику в шаблон (View), и привязка к урлу блога в шаблоне же.
А делать это нужно, как уже сказали, редактированием маппера (Model) и самого класса модуля topic.
Конкретно в 0.3.1 это решается так:
В /classes/modules/topic/mapper/Topic.mapper.class.php правим метод buildFilter(), добавляя туда следующее:
if (isset($aFilter['exclude_blog_id']) and is_array($aFilter['exclude_blog_id'])) {
$sWhere .= " AND t.blog_id not in (" . join(", ", $aFilter['exclude_blog_id']) . ")";
}
В /classes/modules/topic/Topic.class.php правим метод GetTopicsGood(), добавив в массив фильтра:
'exclude_blog_id' => array(13),
, где 13 — искомый айдишник блога.
Если совсем грамотно (и универсально) делать, то можно было бы вынести такие блоги в отдельную таблицу БД, написав соотвествующие обработчики.
В версии 1.0.3 buildFilter судя по всему вот здесь:
/**
* Возвращает все топики по фильтру
*
* @param array $aFilter Фильтр
* @return array
*/
public function GetAllTopics($aFilter) {
$sWhere=$this->buildFilter($aFilter);
if(!isset($aFilter['order'])) {
$aFilter['order'] = 't.topic_id desc';
}
if (!is_array($aFilter['order'])) {
$aFilter['order'] = array($aFilter['order']);
}
$sql = "SELECT
t.topic_id
FROM
".Config::Get('db.table.topic')." as t,
".Config::Get('db.table.blog')." as b
WHERE
1=1
".$sWhere."
AND
t.blog_id=b.blog_id
ORDER by ".implode(', ', $aFilter['order'])." ";
$aTopics=array();
if ($aRows=$this->oDb->select($sql)) {
foreach ($aRows as $aTopic) {
$aTopics[]=$aTopic['topic_id'];
}
}
return $aTopics;
}
11 комментариев
в файле topic_list.tpl
после
добавим
не забыв закрыть if перед концом foreach
13 — ид блога
projects — его url в строке site.com/blog/projects/
но лучше чем такие же изменения вносить в двиг, как хотел автор
2. насчет полного отсутствия топиков на странице — исключено, если правильно указать нужный блог.
3. вы вольны предложить свое решение — по-лучше.
обычный вариант: у нас часть топиков из фильтруемого блога, а часть из других блогов. скажем 1/4 из фильтруемого. таким образом страница похудеет на 1/4 контента. мы получим страницы с неравным количеством топиков.
А делать это нужно, как уже сказали, редактированием маппера (Model) и самого класса модуля topic.
В /classes/modules/topic/mapper/Topic.mapper.class.php правим метод buildFilter(), добавляя туда следующее:
В /classes/modules/topic/Topic.class.php правим метод GetTopicsGood(), добавив в массив фильтра:
, где 13 — искомый айдишник блога.
Если совсем грамотно (и универсально) делать, то можно было бы вынести такие блоги в отдельную таблицу БД, написав соотвествующие обработчики.