Лента - отделяем блоги от пользователей

Доброго времени суток!

Копался с livestreet (AltoCMS) и заметил такой глюк, в ленте не показываются посты из закрытых блогов (напрочь), даже если пользователь на них подписан… Не стал разбираться, что там и как должно работать, глянул запрос:

SELECT         
                            t.topic_id                                        
                        FROM 
                            ".Config::Get('db.table.topic')." as t,
                            ".Config::Get('db.table.blog')." as b
                        WHERE 
                            t.topic_publish = 1 
                            AND t.blog_id=b.blog_id 
                            AND b.blog_type!='close' 
                            { AND t.topic_id < ?d }
                            AND ( 1=0 { OR t.blog_id IN (?a) } { OR t.user_id IN (?a) } )                                 
                        ORDER BY t.topic_id DESC    
                        { LIMIT 0, ?d }


Я нашел более изящное решение). Вот мой запрос:

SELECT 		
			    t.topic_id										
		        FROM 
			    ".Config::Get('db.table.topic')." as t,
			    ".Config::Get('db.table.blog')." as b
			WHERE 
			    t.topic_publish = 1 
			    AND t.blog_id=b.blog_id 
			    { AND t.topic_id < ?d }
			    AND ( false 
				{ OR t.blog_id IN (?a) } 
				{ OR (t.user_id IN (?a) AND b.blog_type='personal') }
			    )
 								
                        ORDER BY t.topic_id DESC	
                        { LIMIT 0, ?d }


Теперь стало получше:
— Показываем топики только из блогов на которые подписан пользователь;
— Показываем топики (из персональных блогов) пользователей, на которых подписан пользователь;

Вот код функции выборки целеком

/classes/modules/userfeed/mapper/Userfeed.mapper.class.php

/**
	 * Получить ленту топиков по подписке
	 *
	 * @param array $aUserSubscribes Список подписок пользователя
	 * @param int $iCount Число получаемых записей (если null, из конфига)
	 * @param int $iFromId Получить записи, начиная с указанной
	 * @return array
	 */
	public function readFeed($aUserSubscribes, $iCount, $iFromId) {
		$sql = "
							SELECT 		
								t.topic_id										
							FROM 
								".Config::Get('db.table.topic')." as t,
								".Config::Get('db.table.blog')." as b
							WHERE 
								t.topic_publish = 1 
								AND t.blog_id=b.blog_id 
								{ AND t.topic_id < ?d }

							AND ( false 
								{ OR t.blog_id IN (?a) } 
								{ OR (t.user_id IN (?a) AND b.blog_type='personal') }
							)
 								
                            ORDER BY t.topic_id DESC	
                            { LIMIT 0, ?d }";


		$aTopics=$aTopics=$this->oDb->selectCol($sql,
												$iFromId ? $iFromId : DBSIMPLE_SKIP,
												count($aUserSubscribes['blogs']) ? $aUserSubscribes['blogs'] : DBSIMPLE_SKIP,
												count($aUserSubscribes['users']) ? $aUserSubscribes['users'] : DBSIMPLE_SKIP,
												$iCount ? $iCount : DBSIMPLE_SKIP
		);

		return $aTopics;
	}


Очень гармонирует с темой Social, все как вконтактике),- отельно «Группы», отдельно «Пользователи».

Спасибо за внимание, надеюсь кому-нибудь пригодится. Если есть критика\предложения, с радостью, выслушаю…
Использование современных строительных материалов позволяет в процессе эксплуатации здания экономить средства. Современные приборы мониторинга утечки тепла, тепловизоры, показывают, что потери энергии в таком случае минимальны.

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

avatar
Класс! Не хотите закоммитить здесь?
avatar
Не уверен, моим способом нарушается «концепция» выборки, но на всякий случай, да: github.com/livestreet/livestreet/issues/333#issuecomment-24646167
avatar
… отдельно «Группы», отдельно «Пользователи»
Никак не могу понять, это о чём?
avatar
персональные и коллективные блоги
avatar
Подскажите, возможно ли починить подобным способом активность — /stream?
Т.к. в активность не выводится инфо о действиях в закрытых блогах
— публикация топика
— комментирование
Логично было бы показывать эту активность только тем, кто состоит в соответствующем закрытом блоге.
Самое странное, что отображается только оценивание топика и коммента, причем всем
avatar
Выяснилось, что предложенные изменения не выводят в Ленту топки указанных в её настройках пользователей
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.