モジュールに次のメニュー項目を定義しました。
_function visita_virtual_menu(){
$items = array();
$items['visita_virtual/marker_selected_handler'] = array(
'title' => t('Marker Selected Handler'),
'description' => t('Ajax handler for selected markers'),
'type' => MENU_CALLBACK,
'access arguments' => array('access panoramas'),
'callback' => 'marker_selected_handler');
return $items;
_
}
そして、私のモジュールに特別な許可を作成しました:
_function visita_virtual_permission(){
return array('access panoramas' => array(
'title' => t('Configurar Panoramas'),
'description' => t('Configurar la visita virtual'),
)
);
_
}
当然のことながら、アクセスパノラマの権限はDrupalの[People Permissions]設定タブに表示されました。匿名ユーザー、ログに記録されたユーザー、および管理者ユーザーに割り当てました(テスト目的のみ)。
今、私のJavaScript関数は次のことを行います:
_alert('Callback URL: '+url);
$.ajax({
type : "POST",
url : url,
data : {
'marker_latitude' : location.lat,
'marker_longitude' : location.lng,
},
success : function(data){
alert('Entro a la funcion success');
},
error: function(xmlhttp) {
alert('An error ocurred: '+xmlhttp.status);
}
});
_
alert('Callback URL: '+url);
行には、次の情報が表示されます。
/ drupal/visita_virtual/marker_selected_handler
ただし、403アクセス禁止エラーが常に発生します。なぜ??私は何を間違っていますか???
私はサーバーのコードをデバッグしていますが、問題はmenu.incのこのコードにあるようです。
_function menu_execute_active_handler($path = NULL, $deliver = TRUE) {
// Check if site is offline.
$page_callback_result = _menu_site_is_offline() ? MENU_SITE_OFFLINE : MENU_SITE_ONLINE;
// Allow other modules to change the site status but not the path because that
// would not change the global variable. hook_url_inbound_alter() can be used
// to change the path. Code later will not use the $read_only_path variable.
$read_only_path = !empty($path) ? $path : $_GET['q'];
drupal_alter('menu_site_status', $page_callback_result, $read_only_path);
// Only continue if the site status is not set.
if ($page_callback_result == MENU_SITE_ONLINE) {
if ($router_item = menu_get_item($path)) {
if ($router_item['access']) {
if ($router_item['include_file']) {
require_once DRUPAL_ROOT . '/' . $router_item['include_file'];
}
$page_callback_result = call_user_func_array($router_item['page_callback'], $router_item['page_arguments']);
}
else {
$page_callback_result = MENU_ACCESS_DENIED;
}
_
_$path
_パラメータがデフォルト値を取得しています。 NULL、次に_$read_only_path
_がq
_$_GET
_値から取得されます。この場合、$ read_only_pathには値が設定されています:_visita_virtual/marker_selected_handler
_いいですか? _/drupal/visita_virtual/marker_selected_handler
_にすべきではありませんか?
この時点で$router_item = menu_get_item($path)
は、「アクセス」値がfalseの$ router_itemを取得しています。それが403を受け取っている理由です。それでも失われましたが、メニューの何を間違って構成しているのかわかりません...
Access deniedが表示されるのは、メニュー項目に_page callback
_属性が指定されていないためです。 (代わりにcallback
を使用しています)。 hook_menu()
here のドキュメントを確認できます。
同じページでは、メニュー項目の_page callback
_属性が省略されている場合は、その親の_page callback
_が使用されることがわかります。
ただし、問題のメニュー項目の親が存在しない場合は、_Access denied
_を返します。これは、現在のユーザーによるメニュー項目へのアクセスが解決される前でも発生します。したがって、_access callback
_は重要ではありません。 (それを変更しても改善されなかった理由を説明します)
Ajaxの経験はあまりありませんが、
$items['visita_virtual/marker_selected_handler'] = array(
// ...
'access callback' => TRUE,
)
追加する必要があります
'access callback' => 'user_access',
メニュー定義で(モジュールを無効/有効にします)