Задача: вывести на странице профиля пользователя следующее (user-profile.tpl.php)
Друзья/Мои друзья: друг_1х, друг_2х, друг_3х
х - это удалить из друзей.
Общие друзья: друг_1, друг_2, друг_3 /при просмотре чужого профиля
Друзья в он-лайн: друг_1, друг_2, друг_3 / Либо выделять друзей каким-нить цветом или *
Новые друзья: друг_8, друг_9 / Вывод N последних добавленных друзей
Еще не добавленные в друзья пользователи: друг_10+, друг_11+, друг_12+
+ - добавить в друзья
после добавления/удаление друзей необходимо оставаться на той же странице.
+ при запросе в друзья убрать сообщение что кто-то подал запрос на дружбу, а заменить письмом в ЛС (оповещение, из которого также можно было бы добавить в друзья*).
*было бы удобно так, но не необязательно.
Комментарии
Спроси у Дурова из вконтакте как он делал (точнее как ему Facebook подсказал).
Друзей можно вьюхой вывести. Но как вывести общих друзей? вопрос...
Причем тут Дуров.
Обсуждения по модулю посмотри.
на друпал орг? вы там что-то видели или знаете что там что то есть?
А можно как то страницу вьюхи переопределить, что бы вместо удалить-ссылки вывести какой-нить знак или картинку? (а то удалить длинно и некрасиво как то)
там только это но это не то... это выводит друзей твоих друзей...
global $user ;
$rtid = 1 ; //Relationship type ID.
$max = 5 ; //The amount of users to show on the block.
$user_rel = db_query ( "
SELECT u.uid
FROM {users} u
LEFT JOIN {user_relationships} ur ON (u.uid = ur.requester_id OR u.uid = ur.requestee_id)
WHERE (ur.requester_id = %d OR ur.requestee_id = %d)
AND ur.approved = 1
AND ur.rtid = %d
AND u.status <> 0
GROUP BY u.uid
ORDER BY COUNT(ur.requester_id OR ur.requestee_id) DESC
" , $user -> uid , $user -> uid , $rtid );
$user_rel_com = array();
while ( $value = db_fetch_array ( $user_rel )) {
$user_rel_com [] = $value ;
}
//Exit if no users found.
if (empty( $user_rel_com )) {
return;
}
foreach ( $user_rel_com as $row ) {
$req_req_id_list .= " OR ur.requester_id = " . $row [ 'uid' ] . " OR ur.requestee_id = " . $row [ 'uid' ];
$no_include_friends .= " AND u.uid <> " . $row [ 'uid' ];
}
//Trim the first " OR ".
$req_req_id_list = drupal_substr ( $req_req_id_list , 4 );
//Get all of the current user's friends' friends and order by how many times they show up in the list.
$user_rel_rel = db_query ( "
SELECT u.uid
FROM {users} u
LEFT JOIN {user_relationships} ur ON (u.uid = ur.requester_id OR u.uid = ur.requestee_id)
WHERE (%s)
AND ur.approved = 1
AND ur.rtid = %d
AND u.uid <> %d
%s
AND u.status <> 0
GROUP BY u.uid
ORDER BY COUNT(ur.requester_id OR ur.requestee_id) DESC
" , $req_req_id_list , $rtid , $user -> uid , $no_include_friends );
$user_rel_rel_com = array();
while ( $value = db_fetch_array ( $user_rel_rel )) {
$user_rel_rel_com [] = $value [ 'uid' ];
}
//Scrambles the users non-randomly. Does not scramble the user at the bottom of the list.
$z = $user_rel_rel_com ;
$i = 0 ;
foreach ( $user_rel_rel_com as $v ) {
$r = rand ( 0 , 1 );
if ( $r === 1 && $user_rel_rel_com [ $i + 1 ]) {
$z [ $i ] = $user_rel_rel_com [ $i + 1 ];
$z [ $i + 1 ] = $v ;
}
$i ++;
}
if( count ( $user_rel_rel_com ) < $max ) {
$max = count ( $user_rel_rel_com );
echo '<span>' . t ( 'Sorry we have no suggestions' ) . '</span>' ;
}
for ( $i = 0 ; $i < $max ; $i ++) {
if ( $z [ $i ] != $user -> uid ) {
$account = user_load (array( 'uid' => $z [ $i ]));
$list [] = theme ( 'username' , $account ). ' ' . theme ( 'user_picture' , $account ) ;
}
}
//Theme with CSS as appropriate. "More" link is optional.
echo '<div class="uymn">' . theme ( 'item_list' , $list ) . '</div>' ;
//add link
$actions = _user_relationships_ui_actions_between ( $user , $account );
if ( count ( $actions )) {
print '<span class="URlinks">' . theme ( 'item_list' , $actions ) . '</div>' ;
}
?>
На д.орг много обсуждений по данному поводу. Наверняка есть решения как реализовать друзей друзей друзя. Картинки в классах сделай.
все равно не айс. через вьюху бы... а то блоки блоки... не айс.
говорят с 2008 года а толку нет
Ну если следовать логике вещей то тут через лефт джоин решается запрос. Делаем временную таблицу туда кидаем ИД текущего юзера и сюда же джоиним ИД юзеров у которых первый юзер в друзях.