Крюк вызывается, прежде чем удалить узел - PullRequest
3 голосов
/ 25 июля 2010

Я пишу пользовательский модуль и хотел бы сделать некоторые проверки перед удалением узла. Есть ли ловушка, которая срабатывает до удаления узла? И есть ли способ как-то предотвратить удаление? Кстати, я использую drupal6

Ответы [ 7 ]

3 голосов
/ 26 июля 2010

Вы можете использовать hook_menu_alter, чтобы указать обратный вызов меню node/%node/delete для вашей собственной функции.Ваша функция может выполнять любые проверки, которые вы хотите, а затем представить форму node_delete_confirm, если проверки пройдены.

2 голосов
/ 16 октября 2012

Это удалит кнопку Удалить и добавит вашу собственную кнопку и действие. Это не помешает пользователям использовать URL / узел / [nid] / delete для удаления узла, используйте для этого настройки разрешений.

function my_module_form_alter(&$form, &$form_state, $form_id) {
  if($form_id == "allocation_node_form") {
    if (isset($form['#node']->nid))  {
            $form['buttons']['my_remove'] = array(
                                        '#type' => 'submit',
                                        '#value' => 'Remove',
                                        '#weight' => 15,
                                        '#submit' => array('allocation_remove_submit'),
                                        );

            if($user->uid != 1) {
              unset($form['buttons']['delete']);
              $form['buttons']['#suffix'] = "<br>".t("<b>Remove</b> will...");
            }else{
              $form['buttons']['#suffix'] = t("<b>Delete</b> only if ...");
            }
        }
  }

}


function allocation_remove_submit($form, &$form_state) {
    if (is_numeric($form_state['values']['field_a_team'][0]['nid'])) {
        //my actions

        //Clear forms cache
        $cid = 'content:'. $form_state['values']['nid'].':'. $form_state['values']['vid'];
        cache_clear_all($cid, 'cache_content', TRUE);

        //Redirect
        drupal_goto("node/".$form_state['values']['field_a_team'][0]['nid']);        
    }else{
        drupal_set_message(t("Need all values to be set"), "warning");
    }
}
1 голос
/ 05 ноября 2014

Этот код пользовательского модуля предназначен для Drupal 7, но я уверен, что аналогичная концепция применима к Drupal 6. Кроме того, к настоящему времени вы, скорее всего, ищете решение для Drupal 7.

Этокод будет запускаться «до» удаления узла, и, следовательно, вы можете выполнить нужные проверки, а затем при желании скрыть кнопку удаления, чтобы предотвратить удаление узла.Проверьте комментарии функции для получения дополнительной информации.

Это снимок экрана, показывающий конечный результат:

Screenshot showing node deletion prevention using custom code hook

И это используемый код:

<?php

/**
 * Implements hook_form_FORM_ID_alter() to conditionally prevent node deletion.
 * 
 * We check if the current node has child menu items and, if yes, we prevent
 * this node's deletion and also show a message explaining the situation and 
 * links to the child nodes so that the user can easily delete them first
 * or move them to another parent menu item.
 * 
 * This can be useful in many cases especially if you count on the paths of 
 * the child items being derived from their parent item path, for example.
 */
function sk_form_node_delete_confirm_alter(&$form, $form_state) {
    //Check if we have a node id and stop if not
    if(empty($form['nid']['#value'])) {
        return;
    }

    //Load the node from the form
    $node = node_load($form['nid']['#value']);

    //Check if node properly loaded and stop if not
    //Empty checks for both $node being not empty and also for its property nid
    if(empty($node->nid)) {
        return;
    }

    //Get child menu items array for this node
    $children_nids = sk_get_all_menu_node_children_ids('node/' . $node->nid);
    $children_count = count($children_nids);

    //If we have children, do set a warning and disable delete button and such
    //so that this node cannot be deleted by the user.
    //Note: we are not 100% that this prevents the user from deleting it through
    //views bulk operations for example or by faking a post request, but for our
    //needs, this is adequate as we trust the editors on our websites.
    if(!empty($children_nids)) {
        //Construct explanatory message
        $msg = '';

        $t1 = '';
        $t1 .= '%title is part of a menu and has %count child menu items. ';
        $t1 .= 'If you delete it, the URL paths of its children will no longer work.';
        $msg .= '<p>';
        $msg .= t($t1, array('%title' => $node->title, '%count' => $children_count));
        $msg .= '</p>';

        $t2 = 'Please check the %count child menu items below and delete them first.';
        $msg .= '<p>';
        $msg .= t($t2, array('%count' => $children_count));
        $msg .= '</p>';

        $msg .= '<ol>';        
        $children_nodes = node_load_multiple($children_nids);
        if(!empty($children_nodes)) {
            foreach($children_nodes as $child_node) {
                if(!empty($child_node->nid)) {
                    $msg .= '<li>';
                    $msg .= '<a href="' . url('node/' . $child_node->nid) . '">';
                    $msg .= $child_node->title;
                    $msg .= '</a>';
                    $msg .= '</li>';
                }
            }
        }
        $msg .= '</ol>';

        //Set explanatory message
        $form['sk_children_exist_warning'] = array(
            '#markup' => $msg,
            '#weight' => -10,
        );

        //Remove the 'This action cannot be undone' message
        unset($form['description']);

        //Remove the delete button
        unset($form['actions']['submit']);
    }
}

Для получения дополнительной информации, проверьте этот подробный пост в блоге о условно предотвращающем удаление узла в Drupal 7 .Он содержит подробную информацию обо всем процессе, а также ссылки на ресурсы, в том числе о том, как легко создать пользовательский модуль, в который можно скопировать / вставить приведенный выше код, чтобы заставить его работать.

1 голос
/ 30 августа 2011

Используйте form_alter и удалите кнопку удаления, если ваши условия соблюдены. Как то так.

function xxx_contact_form_alter(&$form, $form_state, $form_id) {
  global $user;

  if (strstr($form_id, 'xxx_node_form')) {
    // Stop deletion of xxx users unless you are an admin
    if (($form['#node']->uid) == 0 && ($user->uid != 1)) {
      unset($form['actions']['delete']);
    }
  }
}
1 голос
/ 25 июля 2010

Вы можете использовать hook_nodeapi op delete.

Может быть плохой идеей попытаться остановить удаление узла, поскольку вы не знаете, что сделали другие модули, например, удаление значений полей cck и т. Д.

Нет крючка, который вы можете использовать для выполнения действий до удаления узла. Вышеуказанное является ближайшим к вам.

0 голосов
/ 17 сентября 2010

вы можете использовать hook_access и ставить условия, если op == delete. если вы выполняете условия, верните True, в противном случае верните false. в случае false ваш узел не будет удален.

Помните, что для администратора это не сработает.

0 голосов
/ 25 июля 2010

Нет ловушки, которая вызывается до удаления узла, но Drupal проверяет с помощью node_access, чтобы узнать, разрешено ли пользователю удалять узел, прежде чем продолжить удаление.

Вы можете установить права доступа к узлу, чтобы не разрешать пользователю удалять узел: это не поможет, если пользователь является пользователем 1 или имеет разрешение на администрирование узлов, поэтому не давайте эти разрешения недоверенным пользователям (т.е. люди, которые удалили бы узел). Это также Drupal-путь для предотвращения неоправданного удаления узлов.

...