Кнопка «Подписаться» [Решено]

Сейчас неудобно подписываться на активность пользователей. Для того чтобы начать следить за кем-либо нужно запомнить его логин, перейти на страницу «Активность» и начать его вводить в соответствующем поле и после этого выбрать нужного пользователя в появившемся списке.

Гораздо лучше реализовать все как в популярных социальных сетях (twitter, dribbbler, vkontakte): добавить кнопку подписаться прямо в профиль пользователя.

Как это сделать сказал пользователь Chiffa, за что ему большая благодарность =))


classes\actions\ActionProfile.class.php:

Функция EventShutdown, добавить можно в самый конец:

        $this->oUserCurrent=$this->User_GetUserCurrent();
        if ($this->oUserCurrent && $aUserSubscribes=$this->Userfeed_getUserSubscribes($this->oUserCurrent->getId())) {
        $this->Viewer_Assign('isSubscribe',isset($aUserSubscribes['users'][$this->oUserProfile->getId()]) ? 1 : 0);
        $this->Lang_AddLangJs(array('stream_subscribe','stream_unsubscribe'));
}


templates\language\russian.php

Добавить:
'stream_unsubscribe' => 'Отписаться',
'stream_subscribe' => 'Подписаться',


templates\skin\new-query\actions\ActionProfile\sidebar.tpl

Найти:
<li><a href="{router page='talk'}add/?talk_users={$oUserProfile->getLogin()}">{$aLang.user_write_prvmsg}</a></li>                                               


Добавить после:
{if $isSubscribe}
<li><a id="subscribe-button" href="#" onclick="return ls.user.unsubscribe(this)" rel="{$oUserProfile->getId()}">{$aLang.stream_unsubscribe}</a></li>
{else}
<li><a id="subscribe-button" href="#" onclick="return ls.user.subscribe(this)" rel="{$oUserProfile->getId()}">{$aLang.stream_subscribe}</a></li>
{/if}


templates\skin\new-query\js\friends.js

Найти:
ls.user = (function ($) {


Добавить после:
this.subscribe = function(obj) {
        obj=$(obj);
        var idUser=obj.attr('rel');
        ls.ajax(aRouter['feed']+'subscribe/', {'type':'users', 'id':idUser}, function(data) {
                if (data.bStateError) {
                        ls.msg.error(data.sMsgTitle,data.sMsg);
                } else {
                        ls.msg.notice(data.sMsgTitle,data.sMsg);
                        obj.replaceWith('<a id="subscribe-button" href="#" onclick="return ls.user.unsubscribe(this)" rel="'+idUser+'">'+ls.lang.get('stream_unsubscribe')+'</a>');
                }
        });
        return false;
};
this.unsubscribe = function(obj) {
        obj=$(obj);
        var idUser=obj.attr('rel');
        ls.ajax(aRouter['feed']+'unsubscribe', {'type':'users', 'id':idUser}, function(data) { 
                if (data.bStateError) {
                        ls.msg.error(data.sMsgTitle,data.sMsg);
                } else {
                        ls.msg.notice(data.sMsgTitle,data.sMsg);
                        obj.replaceWith('<a id="subscribe-button" href="#" onclick="return ls.user.subscribe(this)" rel="'+idUser+'">'+ls.lang.get('stream_subscribe')+'</a>');
                }
        });
        return false;
};

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

avatar
Переименуйте ссылку «Добавить в друзья» и оно почти так и будет.
avatar
В таком случае придется ждать подтверждения заявки на добавление в друзья, а это тоже не удобно…
avatar
Тоже верно.
avatar
Хороший вопрос, меня тоже заинтересовало, попробую что-то придумать.
avatar
на microfunk.ru это реализовано.
avatar
Это ваш сайт?
Можете подсказать как это реализовать?
avatar
нет не мой.
поинтересуйтесь у автора.
avatar
Посмотрел внимательнее, не очень все-равно там удобно все сделано.
Да и топик я опубликовал в «Предложения и пожелания», т.к. думаю не мне одному интересна подобная доработка и лучше если все будет так по стандарту в LS.
avatar
Сюда livestreet.ru/stream/ или сюда livestreet.ru/feed/ подписка нужна?
avatar
Только после вашего вопроса заметил, что подписываться в «Ленте» и «Активности» нужно отдельно на одного и того же пользователя.

Подписка нужна сюда livestreet.ru/feed/.

Это будет логичнее. Если я нажал кнопку «Подписаться» (или ее можно назвать «Читать»), то это значит я хочу читать топики этого пользователя на сайте. А вот если я добавил его в друзья, то это означает что я хочу получать уведомления об активности этого пользователя на сайте (т.е. как это сейчас уже работает с добавлением в друзья).
avatar
Готовы немного поковыряться в коде? (не в виде плагина же это делать(=)
avatar
Готов, конечно!)
avatar

classes\actions\ActionProfile.class.php:

Функция EventShutdown, добавить можно в самый конец:
if ($this->oUserCurrent && $aUserSubscribes=$this->Userfeed_getUserSubscribes($this->oUserCurrent->getId())) {
	$this->Viewer_Assign('isSubscribe',(bool)isset($aUserSubscribes[$this->oUserProfile->getId()]));
	$this->Lang_AddLangJs(array('stream_subscribe','stream_unsubscribe'));
}


templates\language\russian.php

Добавить:
'stream_unsubscribe' => 'Отписаться',
'stream_subscribe' => 'Подписаться',


templates\skin\new-query\actions\ActionProfile\sidebar.tpl

Найти:
<li><a href="{router page='talk'}add/?talk_users={$oUserProfile->getLogin()}">{$aLang.user_write_prvmsg}</a></li>						

Добавить после:
{if $isSubscribe}
<li><a id="subscribe-button" href="#" onclick="return ls.user.unsubscribe(this)" rel="{$oUserProfile->getId()}">{$aLang.stream_unsubscribe}</a></li>
{else}
<li><a id="subscribe-button" href="#" onclick="return ls.user.subscribe(this)" rel="{$oUserProfile->getId()}">{$aLang.stream_subscribe}</a></li>
{/if}


templates\skin\new-query\js\friends.js

Найти:
ls.user = (function ($) {

Добавить после:
this.subscribe = function(obj) {
	obj=$(obj);
	var idUser=obj.attr('rel');
	ls.ajax(aRouter['feed']+'subscribe/', {'type':'users', 'id':idUser}, function(data) {
		if (data.bStateError) {
			ls.msg.error(data.sMsgTitle,data.sMsg);
		} else {
			ls.msg.notice(data.sMsgTitle,data.sMsg);
			obj.replaceWith('<a id="subscribe-button" href="#" onclick="return ls.user.unsubscribe(this)" rel="'+idUser+'">'+ls.lang.get('stream_unsubscribe')+'</a>');
		}
	});
	return false;
};
this.unsubscribe = function(obj) {
	obj=$(obj);
	var idUser=obj.attr('rel');
	ls.ajax(aRouter['feed']+'unsubscribe', {'type':'users', 'id':idUser}, function(data) { 
		if (data.bStateError) {
			ls.msg.error(data.sMsgTitle,data.sMsg);
		} else {
			ls.msg.notice(data.sMsgTitle,data.sMsg);
			obj.replaceWith('<a id="subscribe-button" href="#" onclick="return ls.user.subscribe(this)" rel="'+idUser+'">'+ls.lang.get('stream_subscribe')+'</a>');
		}
	});
	return false;
};
avatar
Не работает…
При заходе на страницу профиля выдает ошибку:
Notice: Undefined property: ActionProfile::$oUserCurrent in Z:\home\site.ru\www\classes\actions\ActionProfile.class.php on line 716


В чем может быть ошибка? Может я неправильно код в ActionProfile.class.php добавил?

У меня сейчас выглядит все так:
/**
	 * Выполняется при завершении работы экшена
	 */
	public function EventShutdown() {
		if (!$this->oUserProfile)	 {
			return ;
		}
		
		/**
		 * Загружаем в шаблон необходимые переменные
		 */
		$iCountTopicFavourite=$this->Topic_GetCountTopicsFavouriteByUserId($this->oUserProfile->getId());
		$iCountTopicUser=$this->Topic_GetCountTopicsPersonalByUser($this->oUserProfile->getId(),1);
		$iCountCommentUser=$this->Comment_GetCountCommentsByUserId($this->oUserProfile->getId(),'topic');
		$iCountCommentFavourite=$this->Comment_GetCountCommentsFavouriteByUserId($this->oUserProfile->getId());

		$this->Viewer_Assign('oUserProfile',$this->oUserProfile);
		$this->Viewer_Assign('iCountTopicUser',$iCountTopicUser);
		$this->Viewer_Assign('iCountCommentUser',$iCountCommentUser);
		$this->Viewer_Assign('iCountTopicFavourite',$iCountTopicFavourite);
		$this->Viewer_Assign('iCountCommentFavourite',$iCountCommentFavourite);
		$this->Viewer_Assign('USER_FRIEND_NULL',ModuleUser::USER_FRIEND_NULL);
		$this->Viewer_Assign('USER_FRIEND_OFFER',ModuleUser::USER_FRIEND_OFFER);
		$this->Viewer_Assign('USER_FRIEND_ACCEPT',ModuleUser::USER_FRIEND_ACCEPT);
		$this->Viewer_Assign('USER_FRIEND_REJECT',ModuleUser::USER_FRIEND_REJECT);
		$this->Viewer_Assign('USER_FRIEND_DELETE',ModuleUser::USER_FRIEND_DELETE);
		
		if ($this->oUserCurrent && $aUserSubscribes=$this->Userfeed_getUserSubscribes($this->oUserCurrent->getId())) {
        $this->Viewer_Assign('isSubscribe',(bool)isset($aUserSubscribes[$this->oUserProfile->getId()]));
        $this->Lang_AddLangJs(array('stream_subscribe','stream_unsubscribe'));
		}
		
	}
avatar
Хм. Добавь:
$this->oUserCurrent=$this->User_GetUserCurrent();

перед новыми строчками
avatar
Я немного запутался, так это подписка в раздел feed? или stream?
или если stream, то как происходит подписка? подписка на все пункты из списка (на комменатрии, топики и тп)?
avatar
Нет, это подписка на feed.
Подписку на stream аналогичным способом тоже можно.организовать, но как это сделать нужно у Chiffa спросить.
avatar
А нельзя сделать одну кнопку ПОДПИСАЬСЯ — чтобы пользователь сразу подписывался и на Активность и на Фид?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.