[Решено] Form api. Как сделать вкладку только у одной роли, но чтобы просматривать могли все пользователи?.

Аватар пользователя g2100636 g2100636 19 декабря 2013 в 14:50

создаю в дополнительную вкладку в профиле пользователя

<?php
    $items
['user/%user/view_teacher'] = array(
        
'title' => 'Название',
        
'page callback' => 'view_teacher_function',//имя функции для страницы 
            
'access arguments' => array('????'),  
        
'type' => MENU_LOCAL_TASK,
        
'weight' => 11,
    );
?>

Подскажите пожалуйста как выставить 'access arguments' так, чтобы эта вкладка была только у одной роли пользователей.. а просматривать ее могут все. или даже лучше просмотр разрешен всем авторизованным.

Комментарии

Аватар пользователя q2_faith q2_faith 19 декабря 2013 в 16:05

"g2100636" wrote:
или даже лучше просмотр разрешен всем авторизованным.

объявите хук_пермишн и потом его укажите вместо ????. на странице настройки прав укажите кому можно показывать.
"g2100636" wrote:
чтобы эта вкладка была только у одной роли пользователей..

добавьте проверку в пэйдж_коллбэк на роль.

Аватар пользователя duozersk duozersk 20 декабря 2013 в 0:13

Не, не так... вам нужен свой 'access callback', что-то вроде

<?php
$items
['user/%user/view_teacher'] = array(
  
'title' => 'Название',
  
'page callback' => 'view_teacher_function',//имя функции для страницы
  
'access callback' => 'view_teacher_access_callback',
  
'access arguments' => array(1),
  
'type' => MENU_LOCAL_TASK,
  
'weight' => 11,
);
?>

И потом

<?php
function view_teacher_access_callback($account) {
  if (
in_array('teacher'$user->roles) && user_is_logged_in()) {
    return 
TRUE;
  }
  return 
FALSE;
}
?>
Аватар пользователя g2100636 g2100636 20 декабря 2013 в 12:57

q2_faith, duozersk Спасибо за помощь!
но чтото я запутался совсем...((
с хуком_хук_пермишн чето не получается..

сделал как сказал duozersk, так:

<?php    
    $items
['user/%user/my_zakaz'] = array(
        
'title' => 'Мои заявки',
        
'page callback' => 'my_zakaz_function',        
        
'access callback' => 'view_student_access_callback'// 
        
'access arguments' => array(1), 
        
'type' => MENU_LOCAL_TASK,
        
'weight' => 12,
    );
?>
<?php
function view_teacher_access_callback($account) {
  global 
$user;
  if (
array_key_exists('5'$user->roles) && user_is_logged_in()) {
    return 
TRUE;
  }
  return 
FALSE;
}
?>

получилось этим сделать вкладку только для профиля с айди 5 (студент). Но при этом никто из другой роли не может видеть в профиле студента эту вкладку... а нужно чтобы видели..

потом сделал так:

<?php
    $items
['user/%user/my_zakaz'] = array(
        
'title' => 'Мои заявки',
        
'page callback' => 'my_zakaz_function',        //имя функции для страницы 
        
'access callback' => 'view_student_access_callback'// 
        //'access arguments' => array(1), 
        
'access arguments' => array('view page my_zakaz'),
        
'type' => MENU_LOCAL_TASK,
        
'weight' => 12,
    );
?>
<?php
function repetitor_permission(){    
    return array(
'view page my_zakaz' => array(
        
'title' => t('View page my_zakaz'),
        
'description' => t('View page my_zakaz'),
        ),
    );
}
?>

на странице настройки прав появились галочки.. но их установка (для роли преподавателя к примеру) ничего не меняет.. преподаватель не видит эту вкладку в профиле студента..

Аватар пользователя drupby drupby 20 декабря 2013 в 13:25

"g2100636" wrote:
на странице настройки прав появились галочки.. но их установка (для роли преподавателя к примеру) ничего не меняет..

если ты хочешь устанавливать права из админки access callback вообще не нужен , он берется по умолчанию user_access

$items['user/%user/my_zakaz'] = array(
        'title' => 'Мои заявки',
        'page callback' => 'my_zakaz_function',        //имя функции для страницы
        'page arguments' => array(1),
        'access arguments' => array('view page my_zakaz'),
        'type' => MENU_LOCAL_TASK,
        'weight' => 12,
    );

и функцию тогда view_teacher_access_callback убери

Аватар пользователя duozersk duozersk 20 декабря 2013 в 19:27

Не, я всё тебе правильно писал, но опечатался в одном месте... а ты туда ещё и глобал юзера вставил.
Вот правильный вариант:

<?php
function view_teacher_access_callback($account) {
  if (
in_array('teacher'$account->roles) && user_is_logged_in()) {
    return 
TRUE;
  }
  return 
FALSE;
}
?>

Объясняю - тебе нужно контролировать появление вкладки не в зависимости от пользователя, который в данный момент просматривает сайт, а в зависимости от того, на чей профиль этот пользователь смотрит. Чей профиль определяется 1-м параметром в пути меню (%user), отсюда появляется "'access arguments' => array(1)," - в переменной $account аксесс колбека будет сидеть нужный тебе объект (того, чей профиль смотрят). Далее, уже в самой функции, ты должен проверить, что у этого $account есть определённая роль + что пользователь, смотрящий аккаунт, залогинен. Понятно?

Если нужно регулировать появление вкладки не по наличию роли у просматриваемого профиля, а по пермишену - то "in_array('teacher', $account->roles)" заменится на "user_access('permission name', $account)" - опять же, проверить наличие пермишена у объекта юзера просматриваемого профиля, а не у юзера, смотрящего на профиль.

Аватар пользователя g2100636 g2100636 23 декабря 2013 в 15:19

duozersk, Спасибо большое!!) получилось)

а вот
...заменится на "user_access('permission name', $account)"...
permission name - это где брать?..