Когда выполняется файл (ajax.php) на севере вызванный axaj запросом то видит ли он функцию аргумента arg() в url?
Делаю проверку чей профиль открыт и такое ощущение что arg() не работает.
Я могу его сразу узнать и отправить в ajax, но понять в чем дело хочется.
Комментарии
видит, если не создать файл ajax.php, а делать нормально через hook_menu
Спасибо, почти убедил. (( Придется пытаться понять Друпал.
Материала хватает, но весь какой-то механический. Это туда, это сюда. Не один раз смотрел на друпаловские методы - могу понять почему это работает. И делать так соответственно не хочется.
Я обычным ajax c первого раза все стало понятно.
вы хотели написать "не могу понять"? а то не вяжется с дальнейщей частью предложения
если не получилось
<?php
function тут_название_вашего_модуля_menu(){
$items['тут относительный адрес страницы куда будет идти запрос, без первого слеша'] = array(
'page callback' => '_is_ajax_callback',
'access callback' => TRUE,
);
return $items;
}
function _is_ajax_callback(){
//тут ваш код
}
?>
и сбрасываем друпал-кеш
вот тут http://drupalace.ru/vsyo-ob-ajax-v-drupal-7-drupal-camp-minsk-2012 лучше описано
Примеров много, но либо с кусками кода, который не понятно как склеивать, либо пример заточен под какую-то специфическую задачу что там вообще черт ногу сломит.
Далее что одни предлагают способ с хук-меню - но без Drupal.ajax, другие с ним.
Вот разобрался с первым более простым. Привожу без всяких довесов, но все 3 файла сразу и целиком.
с помощью js подхавываются данные со страницы (в данном случае с профиля) отправляются на сервер, обрабатываются и возвращается результат в js
все в папуку /sites/default/modules/my_module
my_module.info
description = description of My Module
project = Custom
core = 7.x
version = "7.x-1.x-dev"
package = My modules
project = "my_module"
files[] = my_module.module
regions[content] = 'content'
my_module.module
<?php /**
* @file
* A module for customizing stuffs on the site.
*/
/**
* Implements hook_menu().
*/
$items['max-path'] = array( // max-path - это ссылка для запроса ajax. может быть любой
'title' => 't(Get max path to user)',
'description' => t('Works on user profile.'),
'page callback' => 'my_module_menu_ajax_callback',
'access arguments' => array('access content'),
// 'access callback' => TRUE,
'type' => MENU_CALLBACK,
// 'type' => MENU_NORMAL_ITEM,
);
return $items;
} /**
* AJAX function that returns something
*/
function my_module_menu_ajax_callback() {
//достаем значение нашей переменной из массива $_POST.
$number = $_POST['number'];
//в зависимости от присылаемого значения определяем ответ 1 или 2 .
if($number == 1){
// print_r( "got 1");
$numb = 1;
}else{
$numb = 2;
}
$res = array( // собираем в массив , можно добавить еще данные типа 'number1' => $numb1,
);
drupal_json_output($res); // отпрваляем в обработку аваскиптом,
}
function
my_module_user_view_alter(&$build) {// этот хук запустит скрипт при просмотре профиля, если надо чтоб запускался везде то используем hook_init() тогда последнюю строку не пишем
$path = drupal_get_path('module', 'my_module');
$options = array(
'weight' => 1000, // High number to push this file to the bottom of the list
'scope' => 'footer' // This will output the JS file in the footer scope, so at the end of the document
);
drupal_add_js ("$path/my_module.js", $options);
}
?>
my_module.js
Drupal.behaviors.my_module_ajax = {
attach:function (context) {
var idValue = $("#your_htlm_element_id").val();// получаем со страницы нужно нам данное по его id
// сюда же можно добавить событие по которому должен срабатывать ajax
$.ajax({
type: "POST",
data: "number=" + idValue, // шлем его на сервер в обработку в my_module_menu_ajax_callback
url: Drupal.settings.basePath + 'max-path',
dataType: "json",
success: function(data) { // получаем ответ
alert(data.number); // выводим или делаем что нужно
}
});
// }
}
}
})(jQuery);
если бы кто поправил (подсказал) что надо чтоб сделать тоже самое по настоящему - через Drupal.ajax - было бы вообще чудненько
можно ли чтоб js был без Drupal.behaviors встречал примеры и без него
не работает agr() под my_module_menu_ajax_callback()
а под my_module_user_view_alter(&$build) работает
и протащить эту как переменную через global тоже не получается,
прописывал my_module_user_view_alter(&$build)
global $user_uid_glob;
$user_uid_glob = arg(1)
print_r ($user_uid_glob);
и потом в my_module_menu_ajax_callback()
global $user_uid_glob; // пробал сначала без этой строки
print_r ($user_uid_glob);
ничего не вышло
как-то через классы можно, но похоже что проблема в друпале
добавил в модуль
function user_uid_glob_init(){
global $user_uid_glob_outopt;
$user_uid_glob_outopt = arg(1);
print_r($user_uid_glob_outopt);
}
print_r($user_uid_glob_outopt); - не сработало
user_uid_glob_init(); - выдавало не uid пользователя, а name - это заначит разрешния не выставлены?
думаю вы неправильно понимаете, что делает arg()
данные передавайте через гет параметры
Мне нужен nid ноды и/или uid хозяина профиля.
Обычно (в полях с php фильтром) получал его их аргумента. И всегда был внутрений путь.
<?php
if (arg(0) == 'user' && is_numeric(arg(1))) $user_uid = arg(1);
$account = user_load($user_uid, null, true); //
$my_field_vlue = $account->field_my_field['und'][0]['value'];
?>
В модуле же (my_module_menu_ajax_callback()) в получается его "arg(1)" не видно.
А в других хуках arg() дает чистые ссылки.
Так и прередать переменную, это еще та проблема. global не работает как в php (насколько я понял).
Про гет параметры (поискал) но непонял. Это к базе обращатся что ли. Напишите по англ. пожалуйста.
я конечно не совсем понимаю, что вы пытаетесь соорудить, но arg() как вариант можете передавать в javascript в Drupal.settings
drupal_add_js(array('arg' => arg()),'setting');
}
в javascript
var arg1 = Drupal.settings.arg[1];
О, СПАСИБО! - это вариант!
Отравил в яваскрипт, от туда по ajax в my_module_menu_ajax_callback().
Как-нибудь, когда прийдет мое время, пойму как это делать в php, отпишусь.
Использую функцию перевода t() в ajax_callback.
Похоже что ajax не видит язык интерфейса, язык в пути, но видит язык по умолчанию в профиле пользователя. Язык ноды видит тоже, но нужно ведь чтоб выдавал пререводы на том языке что пользователь выбрал в данный момент.
Мог бы его указать явно t('blabla', array(), array('langcode' => $langcode));
но откуда его взять $langcode? - если в $GLOBALS тоже нужного языка(ru) нигде нет, хотя в url стоит ru и выбран русский интерфейс.
['language']->language
['user']->language
['language_content']->language
['language_url']->language
$node->language und
Короче говоря таже проблема что и с agr().
ну так если нода переведена, то это же он и есть
вот оттуда и бери на крайняк
либо
// или var language = document.getElementsByTagName("html")[0].getAttribute("xml:lang");
еще вариант как получить uid и nid в модулях где не работает arg()
$uid = substr(current_path(), 5);
$nid = substr(current_path(), 5);