День добрый!
Решил написать свой собственный модуль.
который бы в амдинке выводил записи из нужной мне таблицы БД-х.
на данный момент мне удалось сделать вывод списком всех записей, а именно
в tickets.module я указал
$items['admin/tickets']=array(
'title' => t('Tickets'),
'description' => t('change how annotations behave'),
'page callback' => 'tickets_list',
'page arguments' => array('tickets_admin_settings', 'tickets_list'),
'access arguments' => array('access tickets'),
'type' => MENU_NORMAL_ITEM,
'file' => 'tickets.admin.inc',
);
а в функции tickets_list() уже создал запрос к базе данных и вывод списком все записи,
теперь потребовалось при клике на одну из них просмотреть более подобное содержание записи.
и ВОПРОС заключается в следующем: Как мне перехватить ссылку типа admin/tickets/100 и указать какую функцию запускать для вывода информации, где 100 номер записи?
Комментарии
Ну точно также в хук_меню рядом с
'title' => t('Tickets'),
'description' => t('change how annotations behave'),
'page callback' => 'tickets_list',
'page arguments' => array('tickets_admin_settings', 'tickets_list'),
'access arguments' => array('access tickets'),
'type' => MENU_NORMAL_ITEM,
'file' => 'tickets.admin.inc',
);
разместить элемент типа
'page callback' => 'ticket',
);
А в функции ticket() получить аргументы через [ru-api=arg]arg[/ru-api].
можно в page arguments сделать array(2) - будет передавать 2й аргумент..
> Как мне перехватить ссылку типа admin/tickets/100 и указать какую функцию запускать для вывода информации, где 100 номер записи?
<?php$items['admin/tickets/%']=array(
'title' => t('Tickets'),
'description' => t('change how annotations behave'),
'page callback' => 'tickets_list',
'page arguments' => array(2),
'access arguments' => array('access tickets'),
'type' => MENU_NORMAL_ITEM,
'file' => 'tickets.admin.inc',
);
function tickets_list($arg = 'all') {
if ($arg == 'all') {
// по адресу admin/tickets/all выводим все
}
if (is_numeric($arg)) {
// по адресу admin/tickets/100 выводим запись 100
}
}
?>
1. При объявлении меню не надо пропускать заголовок и описание через t(). Друпал сделает это за вас.
2. Не совсем правильно ставить свои формы сразу в раздел меню admin. Форму нужно пихать в одну из созданных групп меню админки или же создавать свою собственную.
3. Отображение данных в стиле список/запись зависит от того, сколько у Вас данных в списке и сколько полей в самой записи.
Если записей не много и каждая запись маленькая, то можно всё запихать в одну форму/страничку. Если же записей много и в записи много полей, то лучше делать всё закладками.
В случае небольшого кол-ва записей можно сделать так:
ticket.module
<?php
function ticket_menu() {
$items['admin/content/tickets'] = array(
'title' => 'Tickets',
'description' => 'Change how annotations behave.',
'page callback' => 'ticket_list',
'access arguments' => array('ticket list'),
'file' => 'ticket.admin.inc',
);
return $items;
}
?>
ticket.admin.inc
<?php
/*
Выгружаем данные из БД. Написал простенькую функцию имитации
*/
function ticket_loads() {
return array(
array('id' => 1, 'name' => 'Ticket one', 'operation' => l('Details', 'admin/content/tickets/0')),
array('id' => 2, 'name' => 'Ticket one', 'operation' => l('Details', 'admin/content/tickets/1')),
array('id' => 3, 'name' => 'Ticket one', 'operation' => l('Details', 'admin/content/tickets/2')),
array('id' => 4, 'name' => 'Ticket one', 'operation' => l('Details', 'admin/content/tickets/3')),
);
} /*
Показываем табличку с тикетами
*/
function ticket_list() {
$tickets = ticket_loads();
$list = theme('table', array('#', 'Title', 'Operations'), $tickets);
if (is_numeric(arg(3))) {
$list .= drupal_get_form('ticket_detail_form', arg(3));
}
return $list;
} /*
Показываем форму по одному тикету
*/
function ticket_detail_form($form_id, $id) {
$form = array();
if (is_numeric($id)) {
$tickets = ticket_loads();
if (array_key_exists($id, $tickets)) {
drupal_set_title(check_plain($tickets[$id]['name']));
$form['id'] = array(
'#type' => 'item',
'#title' => 'Id',
'#value' => check_plain($tickets[$id]['id']),
);
$form['name'] = array(
'#type' => 'item',
'#title' => 'Name',
'#value' => check_plain($tickets[$id]['name']),
);
} else {
drupal_set_message("Ups, you did't again.", 'error');
}
} else {
drupal_set_message("Ups, i did't again.", 'error');
}
return $form;
} ?>
Если же много записей и много полей в записях, то лучше сделать примерно так:
ticket.module
<?php
function ticket_perm() {
return array("ticket list", "ticket detail");
}
function ticket_menu() {
// Пункт меню в админке
$items['admin/content/tickets'] = array(
'title' => 'Tickets',
'description' => 'Change how annotations behave.',
'page callback' => 'ticket_list',
'access arguments' => array('ticket list'),
'file' => 'ticket.admin.inc',
);
// Закладка по умолчанию
$items['admin/content/tickets/list'] = array(
'title' => 'List',
'page callback' => 'ticket_list',
'type' => MENU_DEFAULT_LOCAL_TASK,
'file' => 'ticket.admin.inc',
);
// Закладка с wildcard для отдельной записи
$items['admin/content/tickets/%'] = array(
'title' => 'Detail',
'page callback' => 'drupal_get_form',
'page arguments' => array('ticket_detail_form', 3),
'access callback' => 'ticket_access',
'access arguments' => array('ticket detail', 3),
'type' => MENU_LOCAL_TASK,
'weight' => 1,
'file' => 'ticket.admin.inc',
);
return $items;
} // Прячем закладку Detail
function ticket_access($rule, $id = NULL) {
return user_access($rule) && is_numeric($id);
}
?>
ticket.admin.inc
<?php
/*
Выгружаем данные из БД. Написал простенькую функцию имитации
*/
function ticket_loads() {
return array(
array('id' => 1, 'name' => 'Ticket one', 'operation' => l('Details', 'admin/content/tickets/0')),
array('id' => 2, 'name' => 'Ticket one', 'operation' => l('Details', 'admin/content/tickets/1')),
array('id' => 3, 'name' => 'Ticket one', 'operation' => l('Details', 'admin/content/tickets/2')),
array('id' => 4, 'name' => 'Ticket one', 'operation' => l('Details', 'admin/content/tickets/3')),
);
} /*
Показываем табличку с тикетами
*/
function ticket_list() {
$tickets = ticket_loads();
return theme('table', array('#', 'Title', 'Operations'), $tickets);
} /*
Показываем форму по одному тикету
*/
function ticket_detail_form($form_id, $id) {
$form = array();
if (is_numeric($id)) {
$tickets = ticket_loads();
if (array_key_exists($id, $tickets)) {
drupal_set_title(check_plain($tickets[$id]['name']));
$form['id'] = array(
'#type' => 'item',
'#title' => 'Id',
'#value' => check_plain($tickets[$id]['id']),
);
$form['name'] = array(
'#type' => 'item',
'#title' => 'Name',
'#value' => check_plain($tickets[$id]['name']),
);
} else {
drupal_set_message("Ups, you did't again.", 'error');
}
} else {
drupal_set_message("Ups, i did't again.", 'error');
}
return $form;
}
?>
Прыгающая закладка Detail выглядит немного забавно, но если Вы добавите еще одну постоянную закладку, к примеру Create, то всё сразу станет нормально.
Более подробно про работу с меню в Друпал можно почитать в туториале Drupal menu system (Drupal 6.x)