Drupal → Создание страницы подтверждения удаления

30.05.2010

Страница подтверждения

Основная функция страниц подтверждения — это защита от 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.

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

Комментарии

Хорошая статья, хорошо когда можно найти уже готовое решение.

Добавить комментарий