2014-09-03 86 views
1

我尝试了所有在互联网上都找不到的东西。由hook_menu定义的drupal 7页未找到

模块提供由iframe处理的外部认证。身份验证完成后,会向drupal页面上的套接字发送消息,并显示成功或失败状态。 如果成功,模块需要再次与外部服务器通信以获取drupal上的用户名以完成登录。

两件事: (1)drupal必须不知道外部凭证,并且 (2)外部验证器上的用户名/密码与drupal用户名/密码无关。

该模块的名称是'yauisauth'。

鉴于此,我在hook_menu如下:

return_to = 'yauisauth/callback/'; 
return_to += transid; 
jQuery.post(return_to, null, null); 

我得到的错误是:

function yauisauth_menu() { 
    $items['yauisauth/callback/%'] = array(
    'title' => 'yauis login completion', 
    'description' => 'coordinates yauis login with drupal login', 
    'access callback' => user_is_anonymous, 
    'file' => 'yauisauth.inc', 
    'page callback' => 'yauisauth_callback', 
    'page arguments' => array(2), 
    'type' => MENU_CALLBACK, 
); 
$items['yauisauth/failed'] = array(
    'title' => 'login failed', 
    'description' => 'login failed', 
    'access callback' => user_is_anonymous, 
    'file' => 'yauisauth.inc', 
    'page callback' => 'yauis_login_failed', 
    'type' => MENU_CALLBACK, 
); 
return $items; 

}

回调是从的JavaScript调用

POST http://localhost/drupal7/yauisauth/callback/4ddcd4ab-5167-4aa5-bafa-ee46812237d8 404 (Not Found) 

显然,我不是以drupal想要看到的方式构建url,但我不知道该怎么做。

本来,我曾在yauisauth.module所有功能,但再拆回调函数和调用到yauisauth.inc

每个变化之间的那些,我做了以下内容:

(在MySQL ):

UPDATE system SET status ='0'WHERE name ='yauisauth'; DELETE FROM cache_bootstrap WHERE cid ='system_list';

在bash

则:

drush -cc menu 
drush -cc all 

(盲从每条指令,我可以在网络上找到。)

回调函数看起来像:

function yauisauth_callback($transid) { 
    $attr = get_attributes($transid); 
    if (empty($attr)) { 
     return drupal_not_found(); 
    } 
    ... // calls to other functions local to the yauisauth.inc file 
} 

谁能告诉我为什么我的回调函数的调用失败了,我能做些什么来使它工作?

根据其他地方收到的建议,我将我的drupal更改为驻留在虚拟主机的文档根目录,并将整个url放入javascript调用 - window.location.origin +'/ yauisauth/callback'中。警报通知我URL正确构建。

我有一个“死”在回调函数的开始,永远不会被执行。

如果我把网址放在地址栏中,就会执行“die”语句,以便找到路由。

仍在寻找建议。

+0

你为什么要执行这些MySQL命令?您只需清除要发现的“hook_menu”条目的(菜单)缓存。你是积极的,你不是在回调中返回'drupal_not_found'页面的人吗? (也就是说'$ attr'不是空的?) – 2014-09-03 19:15:33

+0

mysql命令将在更改后取消注册模块。我没有返回drupal_not_found页面,我在控制台中找到未找到的消息。 – Carilda 2014-09-03 19:32:06

+0

您不需要重新注册模块。只需从Drush('drush cc menu')清除菜单缓存或访问'admin/config/development/performance'即可。如果您粘贴的代码中的$ attr'为空,则返回'drupal_not_found'。你是积极的,这不是正在遭受打击? – 2014-09-03 19:43:27

回答

2

我只是再看看你的代码 - 当你不需要任何东西时,你会添加下划线,例如page_callback应该是page callback。参见:https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_menu/7

+0

谢谢,查理 - 我修正了这个问题,仍然没有正确地获得我的新页面。 – Carilda 2014-09-03 23:35:54

+0

如果您可以发布修改后的代码,并确认在浏览器中手动打开URL不能解决问题,我可以尝试提供帮助。 – 2014-09-04 01:11:10

+0

我做了以上建议的更改。当我尝试url localhost/drupal7/yauisauth/callback时,我得到“在此服务器上未找到请求的URL /usr/share/drupal7/index.php”。请注意,它并不拒绝我的路线,而是拒绝使用drupal 7的文件系统地址而不是web地址(/ usr/share/drupal7而不是localhost/drupal7)的index.php。显然我需要为路由做一些不同的事情,但我不知道是什么。 – Carilda 2014-09-04 11:44:21