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

Drupal → Создание табличной формы

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

Пример создания таблицы со списком материалов, в которой можно редактировать заголовки и устанавливать статус ноды:

Табличная форма

Небольшая вводная информация — при создании любых табличных форм, я обычно применяю принцип прогрессивного улучшения. Т.е. первым делом создаю форму как если бы я ничего не знал о темизации, но форма при этом должна быть полностью рабочая и понятно выглядеть. Например вот так выглядит наша табличная форма без использования темизации:

Форма без темизации

Ну а вторым шагом, с помощью темизации, придаю ей необходимый вид:

Форма в виде таблицы после применения темизации

Если следовать такому принципу, то достаточно легко создавать формы любой сложности.

Итак, код с комментариями:

/**
 * Описание формы
 */
function mymodule_mass_edit($form_state)
{
    $form['table'] = array(
        '#tree' => true,
        '#theme' => 'tabular_form', // функция, с помощью которой мы будем придавать форме табличный вид
    );
 
    $form['table']['header'] = array(
        '#type' => 'value',
        '#value' => array('Дата создания', 'Заголовок', 'Опубликовано'),
    );
 
    $nodes = db_query("SELECT nid, title, created, status FROM {node}");
 
    while ($node = db_fetch_object($nodes))
    {
        $form['table']['data'][$node->nid]['created'] = array(
            '#value' => format_date($node->created, 'small'),
        );
 
        $form['table']['data'][$node->nid]['title'] = array(
            '#type' => 'textfield',
            '#default_value' => $node->title,
            '#required' => true,
            '#size' => 50,
        );
 
        $form['table']['data'][$node->nid]['status'] = array(
            '#type' => 'checkbox',
            '#default_value' => $node->status,
        );
    }
 
    $form['submit'] = array(
        '#type' => 'submit',
        '#value' => 'Сохранить',
    );
 
    return $form;
}
 
/**
 * Реализация hook_theme()
 * Регистрируем ф-ю tabular_form, которая будет собирать форму в таблицу
 */
function mymodule_theme()
{
    return array(
        'tabular_form' => array('arguments' => array('form' => null)),
    );
}
 
/**
 * Реализация функции темизации tabular_form
 */
function theme_tabular_form($form)
{
    $rows = array();
 
    foreach (element_children($form['data']) as $key)
    {
        foreach (element_children($form['data'][$key]) as $name)
        {
            $rows[$key][] = drupal_render($form['data'][$key][$name]);
        }
    }
 
    return theme('table', $form['header']['#value'], $rows);
}

Я уже писал про то, как создавать формы в виде таблицы, на примере формы удаления нод, но этот способ более универсальный — здесь темизируется только часть формы ($form['table']) и в функции темизации не нужно перечислять поля таблицы, они выводятся в порядке определения.

Рабочий пример можно посмотреть в демо-модуле Mass Edit.

Написанное актуально для Drupal 6.x
Похожие записи

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

Уважаемый автор какой 'page callback' => должен быть в hook_menu ???

drupal_get_form

'page arguments' => array('sprice_uniona_mass_edit'), ???

так точно

Что делать если форма в fieldset? После drupal_render(), fieldset выводится отдельно, пустым.

$form['fieldset'] = array('#type' => 'fieldset', '#title' => 'fieldset');
$form['fieldset']['table'] = ...
$form['fieldset']['table']['header'] = ...
$form['fieldset']['table']['data'] = ...
$form['fieldset']['submit'] = ...

1) не вижу где происходит drupal_write_record().

в mymodule_mass_edit_submit

Спасибо, нашел в примере - $node_save().
Допустим сохраняем данные кастомной таблице (прописанной в $schema) и пользователь поменял несоклько записей

$data = array ('id'=>'1', 
  'name'=> 'vasya', // (было вася)
  'gorod'=> '2', //(было 3)
 
$data = array ('id'=>'2', 
  'name'=> 'kolya', // (было колян)
  'gorod'=> '2', //(было 3)

Вопросец: надо каждую отдельно строку с полями сохранять drupal_write_record($table, $data, 'id') - получилось!
или можно как-то сразу все поля всех строк "хором" передать в drupal_write_record ?

сохранять по отдельности

Спасибо за подробные и познавательные статьи. Ваш блог очень помогает в разборках с Друпалом.

А аналог статьи по таблицам и чекбоксам для drupal 7 есть ? ... или там все так же ? Есть ли подводные камни?

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

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

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