Drupal → Создание страницы подтверждения удаления
Основная функция страниц подтверждения — это защита от 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.
Комментарии
Хорошая статья, хорошо когда можно найти уже готовое решение.
Оставить комментарий