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.
Комментарии
Уважаемый автор какой 'page callback' => должен быть в hook_menu ???
drupal_get_form
'page arguments' => array('sprice_uniona_mass_edit'), ???
так точно
Что делать если форма в fieldset? После drupal_render(), fieldset выводится отдельно, пустым.
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 есть ? ... или там все так же ? Есть ли подводные камни?
Оставить комментарий