Основная функция страниц подтверждения — это защита от XSRF атак, которым подвержены действия, выполняемые без проверки токенов (специальных скрытых полей форм).
Для примера создадим таблицу со списком нод и ссылками, на редактирование и удаление. При клике по ссылке Удалить, будет выведен стандартный диалог подтверждения действия, в котором можно отменить операцию и вернуться к списку.
Модуль будет называться Node Manager, сокращённо nodemngr.
Шаг 1. С помощью хука hook_menu
регистрируем адрес для вывода списка и адрес для удаления ноды:
function nodemngr_menu() {
$items['nodemngr'] = array(
'title' => 'Список нод',
'page callback' => 'nodemngr_list',
'access arguments' => array('administer nodes'),
'type' => MENU_CALLBACK,
);
$items['nodemngr/delete/%nodenmgr_node'] = array(
'title' => 'Delete node',
'page callback' => 'drupal_get_form',
'page arguments' => array('nodemngr_delete_confirm', 2),
'access arguments' => array('administer nodes'),
'type' => MENU_CALLBACK,
);
return $items;
}
Шаг 2. По адресу example.com/nodemngr, выводим список нод в табличной форме:
function nodemngr_list() {
$nodes = db_query("SELECT nid, title, created FROM {node} ORDER BY nid DESC");
$tableHeader = array('Nid', 'Заголовок', 'Дата создания', 'Действия');
$tableData = array();
while ($node = db_fetch_object($nodes)) {
$actions = l('изменить', 'node/' . $node->nid . '/edit', array('alias' => true)) . ' | ';
$actions .= l('удалить', 'nodemngr/delete/' . $node->nid, array('alias' => true));
$tableData[] = array(
$node->nid,
$node->title,
format_date($node->created, 'small'),
$actions,
);
}
return theme('table', $tableHeader, $tableData);
}
Шаг 3. В меню у нас зарегистрирован адрес nodemngr/delete/%nodenmgr_node
. В нём используется специальный шаблон, начинающийся с символа %
. Это так называемый Wildcard Loader. Drupal, встретив такой шаблон, вызовет функцию nodenmgr_node_load
, которая вернёт в page callback информацию о ноде. Если nodenmgr_node_load
вернёт false
, то Drupal выведет страницу Page not found.
Добавим соответствующую функцию:
function nodenmgr_node_load($nid) {
$node = db_query("SELECT nid, title FROM {node} WHERE nid = %d", $nid);
return db_fetch_object($node);
}
Шаг 4. Выводим диалог подтверждения удаления:
function nodemngr_delete_confirm(&$form_state, $node) {
$form['nid'] = array(
'#type' => 'value',
'#value' => $node->nid,
);
return confirm_form($form,
'Вы действительно хотите удалить ноду <i>' . check_plain($node->title) . '</i>?',
'nodemngr',
'Эта операция не обратима',
'Удалить',
'Отменить'
);
}
Шаг 5. При подтверждении диалога, удаляем ноду:
function nodemngr_delete_confirm_submit($form, &$form_state) {
if ($form_state['values']['confirm']) {
db_query('DELETE FROM {node} WHERE nid = %d', $form_state['values']['nid']);
drupal_set_message('Нода удалена');
}
drupal_goto('nodemngr');
}
— Исходники модуля.
— Оригинальная статья: Create an action confirm form using "confirm_form()" function in Drupal.
Комментарии
Хорошая статья, хорошо когда можно найти уже готовое решение.
Добавить комментарий