【问题标题】:Skip validation on node delete in Drupal 7在 Drupal 7 中跳过节点删除验证
【发布时间】:2013-08-02 15:36:07
【问题描述】:

当用户尝试在 Drupal 7 中删除节点时,如何完成跳过验证? 我以以下方式调用我的自定义验证函数:

function my_issue_form_alter(&$form, &$form_state, $form_id) {
    switch ($form_id) {
        case 'my_issue_node_form':{
            $form['#validate'][] = 'my_issue_node_form_validate';
            break;
        }
    }
}

function my_issue_node_form_validate($form, &$form_state) {
    //custom validation done here
}

我已经四处寻找了几天,大多数可能的解决方案都在考虑开发人员正在创建一个自定义表单,而我不是。

提前感谢任何提示/建议。

【问题讨论】:

    标签: php validation drupal drupal-7 drupal-modules


    【解决方案1】:

    很好的问题,这已经困扰了我多年,我什至没有意识到这一点。应该这样做:

    function my_issue_form_my_issue_node_form_alter(&$form, &$form_state, $form_id) {
      // Make sure it's an edit form.
      if (!empty($form['nid']['#value'])) {
        // The nid is required for the delete confirmation form.
        $form['actions']['delete']['#limit_validation_errors'] = array(array('nid'));
      }
    
      $form['#validate'][] = 'my_issue_node_form_validate';
    }
    

    【讨论】:

    • 这很好,应该被标记为接受的答案。相对于 OP 解决方案的优势在于,这甚至适用于在核心验证中验证的必填字段,而不是在自定义验证中验证的内容。谢谢!
    【解决方案2】:

    我认为这里的关键点是节点。看看 hook_node_validate() 如果我是你,我会看到堆栈并找到它。

    当你有更新时告诉我。

    【讨论】:

      【解决方案3】:

      我的解决方案是对我的原始代码进行简单修改,在我的自定义验证函数中添加以下行以仅在操作未被删除时进行验证。

      //Set current operation
      $currOp = $form_state['values']['op'];
      
      //If not deleting, validate
      if($currOp != "Delete"){
          //validate code here.
      }
      

      回复的朋友,谢谢指点!

      【讨论】:

      • 注意:其他解决方案(由 Clive 和 Vishal 提供)也可能有效。
      【解决方案4】:

      对于节点编辑表单,要删除删除提交按钮的验证,只需在您的文章内容类型节点编辑表单的自定义模块中编写以下代码。

      function module_name_form_alter(&$form, &$form_state, $form_id) {
        if ($form_id == 'article_node_form') {
          if (!empty($form['nid']['#value'])) {
            // The nid is required for the delete confirmation form.
            $form['actions']['delete']['#limit_validation_errors'] = array(array('nid'));
          }
        }
      }
      

      【讨论】:

        【解决方案5】:

        如果您使用的是 Entity api,则表单验证也适用于 delete 操作上的 required 字段。即使您使用自己的函数来验证表单 (your_form_name_form_validate),drupal 也不允许您提交带有空字段的表单。

        那是因为 drupal_validate_form() 在调用 your_form_name_form_validate 之前验证表单。

        drupal_validate_form 必须在任何表单验证函数之前调用,因为它会验证表单令牌。但随后它调用_form_validate(),并且不会让您提交带有空必填字段的表单。

        在我的情况下,我无法做任何事情,因为我使用一种表单进行编辑/创建/删除操作。但是如果你使用不同的表单,可能在删除操作上你可以设置

        $form['your_field_name']['#validated'] = TRUE;
        

        并且 _form_validate 函数不会验证该字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-06
          • 1970-01-01
          • 2011-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多