Столкнулся с такой задачей: на сайте есть три вида связей (отношений) между пользователями - друзья, сотрудники компании и компании-друзья. Необходимо было в анонсе профиля пользователя выводить ссылки на добавление, удаление, подтверждение той или иной связи. Нашел функцию _user_relationships_ui_actions_between, которая выводит список возможных действий в отношениях между двумя пользователями. Очень полезная функция, но вид ссылок меня не устроил и я пошел своим путем.
Сделал функцию, которая принимает в качестве входных параметров id связи, залогиненного пользователя и пользователя, в профиле которого необходимо вывести ссылки, а возвращает ссылки.
function mymodule_relationship_link($ur_id,$user,$user2){
//получаем все существующие связи между двумя пользователями
$existing_relationships = user_relationships_load(array('between' => array($user->uid, $user2->uid)), array('sort' => 'rtid'));
//получаем все типы отношений на сайте
//это необходимо, чтобы получить название новой связи в множественном числе
$type=user_relationships_types_load();
//если связь создана
if($existing_relationships[$ur_id]){
//Проверяем подтверждена ли связь
if($existing_relationships[$ur_id][0]->approved == 1)
//если подтверждена, то выводим ссылку на ее удаление
$user_act[] = l('Remove from '.$existing_relationships[$ur_id][0]->plural_name, "user/{$user->uid}/relationships/{$existing_relationships[$ur_id][0]->rid}/remove", array('query' => drupal_get_destination(), 'attributes' => array('class' => 'user_relationships_popup_link')));
if($existing_relationships[$ur_id][0]->approved == 0){
//если связь не подтверждена, то возможно два варианта:
//-либо Вы ее отправили и можете отменить =>формируем ссылку вида "friend? Cansel"
//-либо она Вам отправлена и Вы можете ее принять/отказать
//тогда формируем ссылку вида "friend? Approve | Cansel"
$st=$existing_relationships[$ur_id][0]->name."? ";
//если Вы тот, к кому обратились
if($existing_relationships[$ur_id][0]->requestee_id == $user->uid)
$st.= l('Approve', "user/{$user->uid}/relationships/requested/{$existing_relationships[$ur_id][0]->rid}/approve", array('query' => drupal_get_destination(), 'html' => TRUE, 'attributes' => array('class' => 'user_relationships_popup_link')))." | ";
$user_act[] =$st.theme('user_relationships_pending_request_cancel_link', $user->uid, $existing_relationships[$ur_id][0]->rid);
}
} else
//Если связь не создана, то выводим ссылку на добавление.
//Тут нам и понадобится массив $type, в котором хранится имя связи
$user_act[] = l('Add to '.$type[$ur_id]->plural_name, "relationship/{$user2->uid}/request/".$ur_id, array('query' => drupal_get_destination(), 'html' => TRUE, 'attributes' => array('class' => 'user_relationships_popup_link')));
return theme('item_list', $user_act);
}
Функция user_relationships_load возвращает информацию об отношениях между двумя пользователями в виде массива следующей структуры:
$existing_relationships =Array(
[1] => Array (
[0] => stdClass Object (
[rid] => 63 // id существующей связи
[requester_id] => 1 // id пользователя
[requestee_id] => 19 // id пользователя
[rtid] => 1 // id связи
[approved] => 1 //подтверждена ли связь (0-нет, 1- да)
[created_at] => 1339537327 //дата установления связи
[updated_at] => 1339538596
[flags] => 0
[name] => friend //имя связи в единственном числе
[plural_name] => friends //имя связи во множественном числе
[is_oneway] => 0
[is_reciprocal] => 0
[requires_approval] => 1
[expires_val] => 0
)
)
)
Функция user_relationships_types_load возвращает информацию обо всех типах отношений, возможных на сайте, в виде массива:
$type=Array (
[1] => stdClass Object (
[rtid] => 1 //id связи
[name] => friend //имя связи в единственном числе
[plural_name] => friends //имя связи во множественном числе
[is_oneway] => 0
[is_reciprocal] => 0
[requires_approval] => 1
[expires_val] => 0
[roles] => Array ([3] => 3)
[roles_receive] => Array ([3] => 3)
)
[2] => stdClass Object ( ........ )
[3] => stdClass Object
(
[rtid] => 3
[name] => company-friend
[plural_name] => companies-friends
[is_oneway] => 0
[is_reciprocal] => 0
[requires_approval] => 1
[expires_val] => 0
[roles] => Array ([4] => 4 )
[roles_receive] => Array ([4] => 4)
)
)
Профили создавал по аналогии со статьей Создание социальной сети на Drupal
Комментарии
Гостьпн, 09/12/2013 - 17:53 #1
Согласен, что пост получился удачным. Хорошая работа!
Гостьвт, 10/12/2013 - 02:00 #2
Должен признать, вебмастер зачетно накропал.
Добавить комментарий