xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Создание локальных задач (табы, вкладки)

Опубликовано в

api.drupal.ru про локальные задачи:

В интерфейсе Друпал по умолчанию, вы найдёте много ссылок, которые показаны как вкладки. В системе меню они называются локальные задачи (local tasks) и по-умолчанию отображаются как вкладки (хотя и есть возможность представить их по-другому). Локальные задачи работают также, как и другие пункты меню во многих аспектах. Подробнее

Локальные задачи

Реализуются с помощью типов MENU_DEFAULT_LOCAL_TASK и MENU_LOCAL_TASK:

/**
 * Implements hook_menu().
 */
function mymodule_menu() {
  // описание первой вкладки и по совместительству пункта меню
  $items['admin/settings/mymodule'] = array(
    'title' => 'MyModule',             // заголовок страницы, будет выводится во всех вкладках, обязательный параметр
    'page callback' => ...,            // callback первой вкладки, обязательный параметр
    'access arguments' => array(...),  // разрешения на просмотр дефолтной вкладки, обязательный параметр
    'type' => MENU_NORMAL_ITEM,        // пункт будет отображаться в меню
  );
 
  // описание дефолтной вкладки
  $items['admin/settings/mymodule/settings'] = array(
    'title' => 'Settings',             // не переведённое название первой вкладки
    'type' => MENU_DEFAULT_LOCAL_TASK, // пункт будет отображаться как локальная задача по умолчанию, т.е. выделяться при просмотре страницы "admin/settings/mymodule"
  );
 
  // описание второй вкладки
  $items['admin/settings/mymodule/items'] = array(
    'title' => 'Items',                // не переведённое название второй вкладки
    'page callback' => ...,            // callback второй вкладки
    'access arguments' => array(...),  // разрешения на просмотр второй вкладки, обязательный параметр
    'type' => MENU_LOCAL_TASK,         // пункт будет отображаться как локальная задача
    'weight' => 2,                     // вес вкладки в списке вкладок
  );
 
  // описание третьей вкладки
  $items['admin/settings/mymodule/add_item'] = array(
    'title' => 'Add item',
    'page callback' => ...,
    'access arguments' => array(...),
    'type' => MENU_LOCAL_TASK,
    'weight' => 3,
  );
 
  return $items;
}
Написанное актуально для Drupal 6, Drupal 7
Похожие записи

Комментарии RSS

У меня если в первом пункте меню не поставить 'page callback' то пункт с типом MENU_DEFAULT_LOCAL_TASK не отображается..

как заставить табы по ajax работать? Стандартные средсва для этого есть в семёрке?

стандартных средств нет

Как определить какой пункт меню был вызван?
MENU_NORMAL_ITEM или MENU_DEFAULT_LOCAL_TASK?

    $items['source'] = array(
        'title' => 'Источники',
	'page callback' => 'drupal_get_form',
        'page arguments' => array('source_list'),
	'access arguments' => array('access content'),
	'type' => MENU_NORMAL_ITEM,
    );
 
    $items['source/list'] = array(
        'title' => 'Список источников',
        'type' => MENU_DEFAULT_LOCAL_TASK,
        'weight' => 1,
    );

menu_get_item('path') выдает один и тот же адрес 'source'.

вызывайте без параметров

а вообще не понятен смысл просьбы. MENU_DEFAULT_LOCAL_TASK это просто описание вкладки для соответствующего MENU_NORMAL_ITEM

Смысл в том, что есть две ссылки от модуля, одна находится в главном меню, а другая находится как тут (Например пункт "Настройки").

Обе ссылки ведут на одну форму, их я описал в моём комментарии выше. Требуется определить какая ссылка была нажата. Если нажата та, которая находится в главном меню, то ничего не надо делать, в противном случае выполнить действие, если нажата вторая.

MENU_DEFAULT_LOCAL_TASK это не ссылка

// пункт будет отображаться как локальная задача по умолчанию, т.е. выделяться при просмотре страницы "admin/settings/mymodule"

Как определить что был нажат он? (Пункт, а не ссылка)

if ($_GET['q'] == 'source/list')

Да, был такой вариант, только несмотря на то что прописано $items['source/list'], всё равно в адресной строке "/?q=source", list никогда не отображается.

если вы переходите по адресу source/list как в адресной строке может быть source?

Не знаю, я нажимаю на вкладку и в адресной строке "/?q=source" не меняется на "/?q=source/list".

а для конкретного типа материала создать неограниченое число доп табов?

Как менять title у табов через callback?

'title' => 'Items', // не переведённое название второй вкладки

Как перевести название вкладки?
Через - /admin/config/regional/translate/translate - её нет.
через какой то хук в модуле?

Через - /admin/config/regional/translate/translate - её нет.

должно быть

Я тоже был уверен что должно быть, но его нет, может потому что оно тоже через hook_menu_alter() в том модуле?
сделал так же в своём модуле:

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$callbacks) {
  $callbacks['user/%user_category/edit/mobile']['title arguments'][0] = 'Новый тайтл';
}

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании