Forms API. Как сдалать такую форму.

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

Комментарии

Аватар пользователя smartchecker smartchecker 22 мая 2011 в 3:22

Не совсем понятно где описана форма?
Она передаётся параметром в функцию?

Можно ещё пример с вызовом этой ф-ции, где ей передаётся форма?

Аватар пользователя smartchecker smartchecker 22 мая 2011 в 13:33

Допустим я описываю форму так.

    // форма нового типа заявки
    $items['admin/journal-of-requests/data/request-types/add'] = array(
        'title' => 'Редактирование типа заявки',
        'page callback' => 'drupal_get_form',
        'page arguments' => array('journal_of_requests_admin_new_req_type_form'),
        'access arguments' => array('administer site configuration'),
        'file' => 'journal_of_requests.admin.inc',
        'type' => MENU_CALLBACK,
    );

Сама форма

function journal_of_requests_admin_new_req_type_form(&$form_state) {

    $form['req_type_name'] = array(
        '#title' => 'Новый тип',
        '#description' => 'Задайте тип заявки',
        '#type' => 'textfield',
        '#default_value' => '',
        '#required' => true,
        '#maxlenght' => 255,
        '#size' => 40,
        '#weight' => 1,
    );

    $form['submit'] = array(
        '#type' => 'submit',
        '#value' => 'Добавить',
        '#weight' => 3,
    );

    return $form;
}

Ф-ция, которая рисует таблицу

    $items['admin/journal-of-requests/data'] = array(
        'title' => 'Таблицы журнала заявок',
        'description' => 'Здесь настраиваются таблицы.',
        'page callback' => 'journal_of_requests_admin_form_request_types',
        'access arguments' => array('administer site configuration'),
        'weight' => -10,
        'type' => MENU_NORMAL_ITEM,
        'file' => 'journal_of_requests.admin.inc',
    );

    $items['admin/journal-of-requests/data/request-types'] = array(
      'title' => 'Типы заявок',
      'access arguments' => array('administer site configuration'),
      'file' => 'journal_of_requests.admin.inc',
      'weight' => -15,
      'type' => MENU_DEFAULT_LOCAL_TASK,
    );

function journal_of_requests_admin_form_request_types() {

    $header = array('Вид заявки','Действие');

    $rows = array();

    $sql = "SELECT rt.rtid, rt.type FROM request_type AS rt ORDER BY rt.rtid";

    $request_types = db_query($sql);

    while ($req_type = db_fetch_object($request_types)) {
        $actions = array (
            l('редактировать', 'admin/journal-of-requests/data/request-types/edit/' . $req_type->rtid),
            l('удалить',       'admin/journal-of-requests/data/request-types/delete/' . $req_type->rtid, array('query' => 'token=' . drupal_get_token('req-'.$req_type->rtid))),
        );

        $rows[] = array(
            $req_type->type,
            implode('   ', $actions),
        );

    }

    $output = theme('table', $header, $rows);

    return $output;
}

Как форму пропихнуть в таблицу?

Аватар пользователя smartchecker smartchecker 22 мая 2011 в 14:47

Как я понял надо делать свой hook_theme()
Вот только непонятно надо ли там все формы перечислять?
Если мне нужно хитро выводить только одну.

Аватар пользователя Orion76 Orion76 22 мая 2011 в 18:22

можно использовать theme()
код с рабочего модуля:

<?php
function gs_form_tematiks(&$form_state) {
  
_nodes_no_terms_delete();
  
$vocabulary=taxonomy_vocabulary_load(1);
  
  
drupal_set_title(t('Tematiks'));
  
$form = array(
    
'#vocabulary' => (array)$vocabulary,
    
'#tree' => TRUE,
    
'#parent_fields' => FALSE,
  );

  
    

$tree taxonomy_get_tree($vocabulary->vid);
       

  

// Build the actual form.
  
foreach ($tree as $key => $term) {
    
// Save the term for the current page so we don't have to load it a second time.
    
$form[$key]['#term'] = (array)$term;
    
$form[$key]['view'] = array('#value' => l($term->name"taxonomy/term/$term->tid"));

    

$form[$key]['delete'] = array(
        
'#type' => 'checkbox',
        
'#default_value' => false,
    );

    

$form[$key]['rss'] = array(
        
'#type' => 'textfield',
        
'#default_value' => '',
        
'#size' => 20,
        
'#maxlength' => 200,
    );

    

$form[$key]['count'] = array(
        
'#value' => taxonomy_term_count_nodes($term->tid,'gcontent'),
    );

    

$form[$key]['edit'] = array('#value' => l(t('edit'), "admin/content/taxonomy/edit/term/$term->tid", array('query' => drupal_get_destination()))        );

  }

  

$form['#empty_text'] = t('No terms available.');

    

$form['submit'] = array(
      
'#type' => 'submit',
      
'#value' => t('Done')
    );
  
$form['#redirect']='task-load/page';

  return 

$form;
}

function 

theme_gs_form_tematiks($form){

  

$errors form_get_errors() != FALSE form_get_errors() : array();
  
$rows = array();
  foreach (
element_children($form) as $key) {
    if (isset(
$form[$key]['#term'])) {
      
$term = &$form[$key];

      

$row = array();
      
      
$row[] = drupal_render($term['view']);
      
$row[] = drupal_render($term['delete']);
      
$row[] = drupal_render($term['rss']);
      
$row[] = drupal_render($term['count']);
      
$row[] = drupal_render($term['edit']);

      

$row = array('data' => $row);
      
$rows[$key] = $row;
    }
  }

  if (empty(

$rows)) {
    
$rows[] = array(array('data' => $form['#empty_text'], 'colspan' => '2'));
  }

  

$header = array(
        
t('Name'),
        
t('Delete'),
        
t('Load from RSS'),
        
t('Count'),
        
t('Operations'),
      );
  
$output theme('table'$header$rows, array('id' => 'taxonomy'));
  
$output .= drupal_render($form);

  return 

$output;
}

?>

смысл очень прост
в фунуции theme_gs_form_tematiks($form) формируется массив заголовков таблицы($header) и массив строк($rows)
которые передаются функции theme с первым параметром 'table' и на выходе получаем отформатированную таблицу.