Как посты определенного коллективного блога убрать из общей ленты?

Приветствую Вас, Господа!

Есть один вопрос :)

Хочу чтобы посты из определенного коллективного блога не транслировались в общую ленту www.site.ru/new, а показывались только www.site.ru/blog/nazvanie_bloga/. Это даёт возможность создать ленту блога на отвлечённую от главной темы сайта например, со ссылкой из основного меню.

Представляется следующая схема: у блога есть поле blog_index_rating_good — это пороговое значение рейтинга ТОПИКА, при котором топик из этого блога начинает показываться на главной как «хороший». Таким образом поле blog_index_rating_good становится специфической настройкой конфига «module.blog.index_good» для каждого отдельно взятого блога.

У вас есть другие идеи?:)

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

avatar
это легко сделать в шаблоне, не меняя сист файлы

в файле 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/
avatar
очень костыльное решение, которое может привести к полному отсутствию топиков на странице
avatar
1. костыльное — да
но лучше чем такие же изменения вносить в двиг, как хотел автор

2. насчет полного отсутствия топиков на странице — исключено, если правильно указать нужный блог.

3. вы вольны предложить свое решение — по-лучше.
avatar
по-подробнее плиз, что в этом решении плохого?
avatar
худший вариант: допустим у нас в одном блоге много свежих топиков вдруг появилось и они заполнили всю (допусим главную) страницу. маппер вернул нам эту пачку свежих топиков а мы шаблоном их фильтуем. у нас получается пустая страница.

обычный вариант: у нас часть топиков из фильтруемого блога, а часть из других блогов. скажем 1/4 из фильтруемого. таким образом страница похудеет на 1/4 контента. мы получим страницы с неравным количеством топиков.
avatar
В этом решении плохо всё: и попытка вынести логику в шаблон (View), и привязка к урлу блога в шаблоне же.
А делать это нужно, как уже сказали, редактированием маппера (Model) и самого класса модуля topic.
avatar
Конкретно в 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 — искомый айдишник блога.
Если совсем грамотно (и универсально) делать, то можно было бы вынести такие блоги в отдельную таблицу БД, написав соотвествующие обработчики.
avatar
Подскажите пожалуйста как сделать аналогично в версии 1.0.3?
avatar
В версии 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;
	}
avatar
Задача ТСа решается небольшими поправками в маппере и классе модуля topics. А конкретнее с поправками фильтров :)
avatar
я например плюсанул бы за включение этой фичи в стандартный функционал, жаль минусов нахватал от «сильных» товарищей
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.