Увидел сегодня пост про будущую версию 0.4 в которой говорится про возможное добавление ленты друзей к движку и решил поделится своим вариантом.
Буквально вчера начал изучать ЛС и удивился почему в друзья добавлять можно, а возможности просмотра ленты нет. Итак поехали. config/config.route.php думаю в какое место добавлять разберетесь без труда:
define("ROUTE_PAGE_FRIENDS",'friends');
и
ROUTE_PAGE_FRIENDS => 'ActionFriends',
Далее редактируем шаблоны. Пример для девелоперской темы оформления:
в menu.blog.tpl после
Теперь там же правим файлы ActionNew.class.php и ActionIndex.class.php:
в
public function Init() {
каждого файла, после комментария
Подсчитываем новые топики
добавляем
if ($this->User_GetUserCurrent()) {
$this->iCountTopicsFriendsNew=$this->Topic_GetCountTopicsFriendsNew($this->User_GetUserCurrent()->getId());
}
также в каждом из этих файлов после
public function EventShutdown() {
добавляем
if ($this->User_GetUserCurrent()) {
$this->Viewer_Assign('iCountTopicsFriendsNew',$this->iCountTopicsFriendsNew);
}
далее в classes/modules/topic/Topic.class.php куданибудь в серединку между функциями добавляем:
/**
* Получает число новых топиков в ленте друзей
*
* @return unknown
*/
public function GetCountTopicsFriendsNew($sUserId) {
$sDate=date("Y-m-d H:00:00",time()-BLOG_TOPIC_NEW_TIME);
$aFilter=array(
'this_user_id' => $sUserId,
'topic_publish' => 1,
'topic_new' => $sDate,
);
$s=serialize($aFilter);
if (false === ($data = $this->Cache_Get("topic_friend_count_{$s}"))) {
$data = $this->oMapperTopic->GetCountFriendsTopics($aFilter);
$this->Cache_Set($data, "topic_friend_count_{$s}", array('topic_update','topic_new'), 60*5);
}
return $data;
}
/**
* Получает все топики в ленте друзей
*
* @return unknown
*/
public function GetTopicsFriends($iPage,$iPerPage,$sUserId) {
$aFilter=array(
'this_user_id' => $sUserId,
'topic_publish' => 1,
);
$s=serialize($aFilter);
$s2=-1;
if ($this->oUserCurrent) {
$s2=$sUserId;
}
if (false === ($data = $this->Cache_Get("topic_friend_filter_{$s}_{$s2}_{$iPage}_{$iPerPage}"))) {
$data = array('collection'=>$this->oMapperTopic->GetFriendsTopics($aFilter,$iCount,$iPage,$iPerPage),'count'=>$iCount);
$this->Cache_Set($data, "topic_friend_filter_{$s}_{$s2}_{$iPage}_{$iPerPage}", array('comment_new','topic_update','topic_new'), 60*5);
}
return $data;
}
ну и в classes/modules/topic/mapper/Topic.mapper.class.php так же куда-нибудь в серединку:
public function GetCountFriendsTopics($aFilter) {
$sWhere=$this->buildFilter($aFilter);
$sql = "SELECT
count(t.topic_id) as count
FROM
".DB_TABLE_TOPIC." as t
LEFT JOIN
".DB_TABLE_FRIEND." as f ON f.user_frend_id=t.user_id
WHERE
1=1
".$sWhere."
AND
f.user_id='".$aFilter['this_user_id']."'
;
";
if ($aRow=$this->oDb->selectRow($sql)) {
return $aRow['count'];
}
return false;
}
public function GetFriendsTopics($aFilter,&$iCount,$iCurrPage,$iPerPage) {
$iCurrentUserId=-1;
if (is_object($this->oUserCurrent)) {
$iCurrentUserId=$this->oUserCurrent->getId();
}
$sWhere=$this->buildFilter($aFilter);
$sql = "
SELECT
t_fast.*,
tc.*,
u.user_login as user_login,
IF(tv.topic_id IS NULL,0,1) as user_is_vote,
tv.vote_delta as user_vote_delta,
IF(tqv.topic_id IS NULL,0,1) as user_question_is_vote,
bu.is_moderator as user_is_blog_moderator,
bu.is_administrator as user_is_blog_administrator,
IF(tr.comment_count_last IS NULL,t_fast.topic_count_comment,t_fast.topic_count_comment-tr.comment_count_last) as count_comment_new,
IF(ft.topic_id IS NULL,0,1) as topic_is_favourite
FROM (
SELECT
t.*,
b.blog_title as blog_title,
b.blog_type as blog_type,
b.blog_url as blog_url,
b.user_owner_id as blog_owner_id
FROM
".DB_TABLE_TOPIC." as t,
".DB_TABLE_BLOG." as b
WHERE
1=1
".$sWhere."
AND b.blog_type in ('personal','open')
AND
t.blog_id=b.blog_id
ORDER by t.topic_date_add desc
LIMIT ?d, ?d
) as t_fast
JOIN ".DB_TABLE_USER." AS u ON t_fast.user_id=u.user_id
LEFT JOIN (
SELECT
topic_id,
vote_delta
FROM ".DB_TABLE_TOPIC_VOTE."
WHERE user_voter_id = ?d
) AS tv ON t_fast.topic_id=tv.topic_id
LEFT JOIN (
SELECT
topic_id
FROM ".DB_TABLE_FAVOURITE_TOPIC."
WHERE user_id = ?d
) AS ft ON t_fast.topic_id=ft.topic_id
LEFT JOIN (
SELECT
topic_id,
comment_count_last
FROM ".DB_TABLE_TOPIC_READ."
WHERE user_id = ?d
) AS tr ON t_fast.topic_id=tr.topic_id
LEFT JOIN (
SELECT
topic_id
FROM ".DB_TABLE_TOPIC_QUESTION_VOTE."
WHERE user_voter_id = ?d
) AS tqv ON t_fast.topic_id=tqv.topic_id
LEFT JOIN (
SELECT
is_moderator,
is_administrator,
blog_id
FROM ".DB_TABLE_BLOG_USER."
WHERE user_id = ?d
) AS bu ON t_fast.blog_id=bu.blog_id
JOIN ".DB_TABLE_TOPIC_CONTENT." AS tc ON t_fast.topic_id=tc.topic_id
LEFT JOIN
".DB_TABLE_FRIEND." as f ON t_fast.user_id=f.user_frend_id
where
f.user_id='".$aFilter['this_user_id']."'
order by t_fast.topic_date_add desc
;
";
$aTopics=array();
if ($aRows=$this->oDb->select($sql,($iCurrPage-1)*$iPerPage, $iPerPage, $iCurrentUserId,$iCurrentUserId,$iCurrentUserId,$iCurrentUserId,$iCurrentUserId)) {
foreach ($aRows as $aTopic) {
$aTopics[]=new TopicEntity_Topic($aTopic);
}
}
$iCount=$this->GetCountFriendsTopics($aFilter);
return $aTopics;
}
Ну вроде бы ничего не забыл… Старался не трогать стандартные функции, просто копировал их с новым именем и изменял под нужды.
И еще в процессе создания..., в таблице префикс_friend есть поле user_frend_id..., потрепало нервы я вам скажу :) UPDATEархив с измененными файлами (народ.Диск). UPDATE перенес в Tips & Tricks.
51 комментарий
офигенно.
и сразу тупой вопрос, так как не понимаю как это работает.
это похоже по старинке сделано, а через хуки второй раз пишу это слово второй раз стираю букву «й» тоже самое сделать реально? что было минимум правки оригинального кода
Fatal error: Uncaught exception 'Exception' with message 'Не найден шаблон: actions/ActionFriends/index.tpl' in C:\xampp\htdocs\classes\modules\sys_viewer\Viewer.class.php:174 Stack trace: #0 C:\xampp\htdocs\classes\engine\Engine.class.php(187) : eval()'d code(1): LsViewer->Display('actions/ActionF...') #1 C:\xampp\htdocs\classes\engine\Engine.class.php(187): eval() #2 C:\xampp\htdocs\classes\engine\Router.class.php(319): Engine->_CallModule('Viewer_Display', Array) #3 [internal function]: Router->__call('Viewer_Display', Array) #4 C:\xampp\htdocs\classes\engine\Router.class.php(108): Router->Viewer_Display('actions/ActionF...') #5 C:\xampp\htdocs\index.php(31): Router->Exec() #6 {main} thrown in C:\xampp\htdocs\classes\modules\sys_viewer\Viewer.class.php on line 174
Начал разбираться — не хватает шаблона для отображения друзей ***/developer/actions/ActionFriends/index.tpl — Скопировал index.tpl из ***/developer/actions/ActionBlog
2 [САМОЕ ВАЖНОЕ!]. Гости не могут зайти на сайт, ибо вылетает по ошибке «что-то там getid» в ActionIndex.class.php — посмотрел, действительно у гостей-же нет id — решил проблему «чётко» («по пацански») —
if ($this->User_GetUserCurrent() <>'' ) {
$this->iCountTopicsFriendsNew=$this->Topic_GetCountTopicsFriendsNew($this->User_GetUserCurrent()->getId());
}
в двух местах в подсчитывании новых топиков и в завершении
if ($this->User_GetUserCurrent() <>'' ) {
$this->Viewer_Assign('iCountTopicsFriendsNew',$this->iCountTopicsFriendsNew);
}
и все запахало
?.. На странице лента друзей, если записей нет — пишит «Сюда еще никто не успел написать» -> где можно сменить надпись на «Друзья еще ничего не написали» )))
насчет второго пункта, если бы делали по мануалу то все бы работало, если воспользовались прилагаемыми файлами то да гости увидят ошибку, в моей ЛС просто по другому сделано)
плиз хелп! прописывал все вручную и в итоге получит ошибку
Fatal error: Cannot redeclare LsTopic::GetCountTopicsFriendsNew() in /home/webmaster/www/,,,,,,,,,,/classes/modules/topic/Topic.class.php on line 538
с чем это может быть связанно?
Заранее спасибо!
Как считаете, стоит обеспечить вывод информации о том, к каким блогам подключились ваши друзья? Т.е. в принципе можно и в профиле посмотреть подключенные блоги, но не будешь же каждый раз вспоминать, в каких сам уже побывал, а какие новые.
И еще вопрос: выводяться только топики, или имеется также вывод комментариев друзей?
но с реализацией как-то не получается
установил новый релиз 0.3
переписал поверх скачанные файлы, создал трех юзеров, зафрендил, написал несколько сообщений в блоги.
эм, заработало, какой-то странный был глюк. На сколько я понял все необходимые изменения внесены. Я просто открыл menu.blog.tpl для редактирования и заново записал его — все заработало…
Поковырявшись в сайте я заметил вот что:
Как я понял в ленту друзей попадают все сообщения друзей, как из коллективных, так и из персональных блогов, но при этом не попадают сообщения «не друзей» из коллективных блогов, куда пользователь подключен как читатель
В ЖЖ же схема френд ленты несколько отличается — там в ленту друзей попадают сообщения друзей и сообщения всех (не важно, друзей или нет) из коллективных блогов, куда подключен пользователь…
Можно ли реализовать именно такую схему работы френд ленты?
то что вы описали это уже своя общая лента, лента друзей несет немножко другой смысл в принципе нет ничего невозможного), нужно только подправить запрос в базу данных, к сожалению пока помочь не могу, со смартфона комментирую…
Что значит «ничего»? Что конкретно не получается?
у самого стоит на переделанном new шаблоне — все отлично(единственное несколько ошибок в программном плане я нашел, когда ставил — но это впрочем почти не влияет на работоспособность модуля)
Че насчет ридми? читали? Там не только залить файлы надо, но еще и в конфигах кое что ручками подправить…
Если вам настолько лень в ридми слазить — слазаю я :)
Подробное описание установки модуля смотрите тут www.livestreet.ru/blog/tips_and_tricks/1527.html
По той же ссылке в комментариях можете получить техническую поддержку) Внимание Если вы используйте не девелоперскую тему или изменяли ее то рекомендую проделать все манипуляции с темой в ручную!!
Наблюдаю интересное поведение:
— есть один пост во френдленте и под ним — страницы с постами, которые уже нельзя считать новыми (архив ленты)
— нет постов в ленте — и нет страниц с архивом
Предлагаю во втором случае вернкть архив а вместо сообщения «сюда никто не успел написать» указать что-то вроде «ваши друзья не написали новых постов»
Notice: Use of undefined constant ROUTE_PAGE_FRIENDS - assumed 'ROUTE_PAGE_FRIENDS' in /home/beleberd/domains/beleberda.net/public_html/classes/modules/sys_viewer/Viewer.class.php on line 132
Лента друзей — это круто!
Как бы еще блоги в друзья добавлять, чтобы было совсем как жж? Тут можно присоединяться к блогам, но хочется дополнительную опцию именно «добавить в друзья» или «стать читателем». Предположим, что есть закрытые блоги, которые можно только читать — так вот их тоже добавить в ленту и читать как в жж все подряд…
Тоже с livestreet первый день разбираюсь, хорошо, что догадался сначала посмотреть что уже есть, прежде чем свое городить.
Установил, всё работает! Спасибо за такую удобную вещь!!!
Хотелось бы вернуться к коментарию onthefly
Наблюдаю интересное поведение:
— есть один пост во френдленте и под ним — страницы с постами, которые уже нельзя считать новыми (архив ленты)
— нет постов в ленте — и нет страниц с архивом
Предлагаю во втором случае вернкть архив а вместо сообщения «сюда никто не успел написать» указать что-то вроде «ваши друзья не написали новых постов»
У меня отображается по 2 топика на страницу, а если их было к примеру 3 то получается, что на второй страницы показывается ещё и 4-й который не является «новым» если нажать на следующую страницу пишет «Сюда еще никто не успел написать» как сделать, чтоб отображалась вся лента друзей, и не по 2 топика, а по такому-же количеству сколько и на страницах «все», «коллективные» и «персональные» блоги?
51 комментарий
и сразу тупой вопрос, так как не понимаю как это работает.
это похоже по старинке сделано, а через хуки
второй раз пишу это слово второй раз стираю букву «й»тоже самое сделать реально? что было минимум правки оригинального кода1. Не пашет!))
Начал разбираться — не хватает шаблона для отображения друзей
***/developer/actions/ActionFriends/index.tpl — Скопировал index.tpl из ***/developer/actions/ActionBlog
2 [САМОЕ ВАЖНОЕ!]. Гости не могут зайти на сайт, ибо вылетает по ошибке «что-то там getid» в ActionIndex.class.php — посмотрел, действительно у гостей-же нет id — решил проблему «чётко» («по пацански») —
в двух местах в подсчитывании новых топиков и в завершении
и все запахало
?.. На странице лента друзей, если записей нет — пишит «Сюда еще никто не успел написать» -> где можно сменить надпись на «Друзья еще ничего не написали» )))
Счастья,
Fatal error: Cannot redeclare LsTopic::GetCountTopicsFriendsNew() in /home/webmaster/www/,,,,,,,,,,/classes/modules/topic/Topic.class.php on line 538
с чем это может быть связанно?
Заранее спасибо!
после
добавить пришлось
без этого работать нормально не хотело :(
что делать? :(
Как считаете, стоит обеспечить вывод информации о том, к каким блогам подключились ваши друзья? Т.е. в принципе можно и в профиле посмотреть подключенные блоги, но не будешь же каждый раз вспоминать, в каких сам уже побывал, а какие новые.
И еще вопрос: выводяться только топики, или имеется также вывод комментариев друзей?
почему бы не сделать вывод обновлений (топики, комменты) только из тех блогов, к которых пользователь подключен?
мне очень этого не хватало
но с реализацией как-то не получается
установил новый релиз 0.3
переписал поверх скачанные файлы, создал трех юзеров, зафрендил, написал несколько сообщений в блоги.
Кнопка «лента друзей» так и не появилась =(
Поковырявшись в сайте я заметил вот что:
Как я понял в ленту друзей попадают все сообщения друзей, как из коллективных, так и из персональных блогов, но при этом не попадают сообщения «не друзей» из коллективных блогов, куда пользователь подключен как читатель
В ЖЖ же схема френд ленты несколько отличается — там в ленту друзей попадают сообщения друзей и сообщения всех (не важно, друзей или нет) из коллективных блогов, куда подключен пользователь…
Можно ли реализовать именно такую схему работы френд ленты?
у самого стоит на переделанном new шаблоне — все отлично(единственное несколько ошибок в программном плане я нашел, когда ставил — но это впрочем почти не влияет на работоспособность модуля)
Если вам настолько лень в ридми слазить — слазаю я :)
Короче если не справитесь, то пишите в аську.
— есть один пост во френдленте и под ним — страницы с постами, которые уже нельзя считать новыми (архив ленты)
— нет постов в ленте — и нет страниц с архивом
Предлагаю во втором случае вернкть архив а вместо сообщения «сюда никто не успел написать» указать что-то вроде «ваши друзья не написали новых постов»
Почти как дле =)
Главное мануал правильно и ясно написан…
Тема стоит NEW, есть соображения?
Как бы еще блоги в друзья добавлять, чтобы было совсем как жж? Тут можно присоединяться к блогам, но хочется дополнительную опцию именно «добавить в друзья» или «стать читателем». Предположим, что есть закрытые блоги, которые можно только читать — так вот их тоже добавить в ленту и читать как в жж все подряд…
Тоже с livestreet первый день разбираюсь, хорошо, что догадался сначала посмотреть что уже есть, прежде чем свое городить.
Хотелось бы вернуться к коментарию
onthefly
У меня отображается по 2 топика на страницу, а если их было к примеру 3 то получается, что на второй страницы показывается ещё и 4-й который не является «новым» если нажать на следующую страницу пишет «Сюда еще никто не успел написать» как сделать, чтоб отображалась вся лента друзей, и не по 2 топика, а по такому-же количеству сколько и на страницах «все», «коллективные» и «персональные» блоги?