【问题标题】:Drupal "You are not authorized to access this page."Drupal “您无权访问此页面。”
【发布时间】:2012-02-24 19:09:21
【问题描述】:

我刚开始使用drupal,如果这是一个非常愚蠢的问题,我深表歉意。我编写了以下模块,但每次尝试访问它时,转到 url (http://localhost:8888/drupal/doodil_viral_signup) 我都会收到拒绝访问消息。我已经尝试重建权限并禁用和重新启用模块,但它似乎不起作用。

<?php
// $Id$
/**
* @file
* A module to encourage users to sign up.
* This module allows users to sign up to register for the site, and invite their friends to do the same.
*/

/**
* Implements hook_help().
*/
function doodil_viral_signup_help($path, $arg) {
  if ($path == 'admin/help#first') {
    return t('This module allows users to sign up to register for the site, and invite their friends to do the same.');
  }
}

/**
* Implements hook_menu().
*/
function doodil_viral_signup_menu($may_cache = true) {
  $items = array();
  if ($may_cache) {
    $items[] = array(
      'path' => 'doodil_viral_signup',
      'title' => t('Doodil Signup'),
      'callback' => 'doodil_viral_signup_page',
      'access' => TRUE,
      'type' => MENU_CALLBACK,
    );
  }
  return $items;
}

function doodil_viral_signup_page() {
  return drupal_get_form('doodil_viral_signup_page_form');
}

function doodil_viral_signup_page_form() {
  // [input text] First Name
  $form['first_name'] = array(
    '#type' => 'textfield',
    '#title' => t('First Name'),
  );

  // [input text] Last Name
  $form['last_name'] = array(
    '#type' => 'textfield',
    '#title' => t('Last Name'),
  );

  // [input text] Email Address
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Email Address'),
  );

  // [input submit] Sign Me Up
  $form['submit'] = array(
    '#type' => 'submit',
    '#title' => t('Sign Me Up'),
  );
  return $form;
}

function doodil_viral_signup_page_form_submit($form_id, $form_values) {
  $message = 'You have submitted the following information <pre>'.print_r($form_values).'</pre>';
  drupal_set_message(t($message));
}

谁能告诉我如何解决这个问题?

提前致谢!

【问题讨论】:

    标签: php drupal drupal-7 drupal-modules


    【解决方案1】:

    除了hook_menu() 之外,按照loganfsmyth 的建议做所有事情,应该是这样的:

    function doodil_viral_signup_menu() {
      $items = array();
      $items['doodil_viral_signup'] = array(
        'title' => 'Doodil Signup',
        'page callback' => 'drupal_get_form',
        'page arguments' => array('doodil_viral_signup_page_form'),
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
      );
      return $items;
    }
    

    并删除doodil_viral_signup_page()函数。

    编辑

    这只是在我的机器上测试过,它运行完美。如果它不能在你的机器上运行,那么问题不在这个模块上。

    function doodil_viral_signup_help($path, $arg) {
      if ($path == 'admin/help#first') {
        return t('This module allows users to sign up to register for the site,
        and invite their friends to do the same.');
      }
    }
    
    function doodil_viral_signup_menu() {
      $items = array();
      $items['doodil_viral_signup'] = array(
        'title' => 'Doodil Signup',
        'page callback' => 'drupal_get_form',
        'page arguments' => array('doodil_viral_signup_page_form'),
        'access callback' => TRUE,
        'type' => MENU_CALLBACK
      );
      return $items;
    }
    
    function doodil_viral_signup_page_form($form, &$form_state) {
      $form['first_name'] = array(
        '#type' => 'textfield',
        '#title' => t('First Name')
      );
      $form['last_name'] = array(
        '#type' => 'textfield',
        '#title' => t('Last Name')
      );
      $form['email_address'] = array(
        '#type' => 'textfield',
        '#title' => t('Email Address')
      );
      $form['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Sign Me Up')
      );
      return $form;
    }
    
    function doodil_viral_signup_page_form_submit($form, $form_state) {
      $message = t('Your submitted information <pre>!info</pre>', array(
        '!info' => print_r($form_state['values'], TRUE)
      ));
      drupal_set_message($message);
    }
    

    【讨论】:

    • 还是什么都没有 :( 我已经浏览了整个模块代码,并确保我没有做任何愚蠢的事情,比如缺少分号(以及所有其他因打字太快而带来的各种废话) . 你们中的任何一个愿意仔细看看代码和我的 Drupal 安装吗?我很乐意提供管理员访问权限等。
    【解决方案2】:

    当你在上面给出的代码中给出($form, &$form_state) 时。 您可能会收到此类错误:

    --------------------------------------
    warning: Missing argument 2 for 
    --------------------------------------
    

    函数中必须只有一个参数。

    function_name($form)
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的错误。

      通过这样做解决: 去掉page_callback、page_arguments和access_callback中的下划线。

      它们应该是“页面回调”、“页面参数”、“访问回调”。 (没有下划线)

      【讨论】:

        【解决方案4】:

        这段代码都是 Drupal 5 使用的格式。你的标签上写着 drupal 7,所以我假设这就是你想要的?

        function doodil_viral_signup_menu() {
          $items = array();
          $items['doodil_viral_signup'] = array(
            'title' => 'Doodil Signup',
            'page callback' => 'doodil_viral_signup_page',
            'access callback' => TRUE,
            'type' => MENU_CALLBACK,
          );
          return $items;
        }
        

        表格应该是

        function doodil_viral_signup_page_form($form, &$form_state) {
        

        提交应该是:

        function doodil_viral_signup_page_form_submit($form, $form_state) {
          drupal_set_message(t('You have submitted the following information <pre>!info</pre>', array(
            '!info' => print_r($form_state['values'], TRUE),
          )));
        }
        

        虽然使用&lt;pre&gt; 是一种丑陋的调试方式。你应该下载devel模块并使用它的功能dsm($form_state['values']);

        【讨论】:

        • 是的,我正在使用 Drupal 7。适合我使用过时的教程!即使在进行了您建议的更改之后,这似乎仍然不起作用。我禁用了模块,重建了权限并在进行更改以确保后重新启用它。
        • 实际上,我刚刚尝试了另一个测试页面,也显示拒绝访问。我猜这是权限问题?
        • 我不知道你说的重建权限是什么意思,但是你需要在“性能”页面点击“清除缓存”。 Drupal 将 hook_menu 中的所有数据保存在缓存中,因此仅当您清除缓存时才会执行 hook_menu。
        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多