Создание собственного модуля

Главные вкладки

Аватар пользователя Arhavis Arhavis 3 марта 2010 в 16:21

День добрый!
Решил написать свой собственный модуль.
который бы в амдинке выводил записи из нужной мне таблицы БД-х.
на данный момент мне удалось сделать вывод списком всех записей, а именно
в 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 номер записи?

Комментарии

Аватар пользователя Ромка Ромка 3 марта 2010 в 16:31

Ну точно также в хук_меню рядом с

$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',
);

разместить элемент типа

$items['tickets']=array(
'page callback' => 'ticket',
);

А в функции ticket() получить аргументы через [ru-api=arg]arg[/ru-api].

Аватар пользователя Обухов Никита Обухов Никита 3 марта 2010 в 18:13

можно в 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
 }
}
?>

Аватар пользователя dimedrol dimedrol 3 марта 2010 в 21:02

1. При объявлении меню не надо пропускать заголовок и описание через t(). Друпал сделает это за вас. Smile
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, то всё сразу станет нормально. Smile

Более подробно про работу с меню в Друпал можно почитать в туториале Drupal menu system (Drupal 6.x)