Видит ли ajax arg() ?

Главные вкладки

Аватар пользователя Kottov Kottov 16 июля 2014 в 2:11

Когда выполняется файл (ajax.php) на севере вызванный axaj запросом то видит ли он функцию аргумента arg() в url?
Делаю проверку чей профиль открыт и такое ощущение что arg() не работает.

Я могу его сразу узнать и отправить в ajax, но понять в чем дело хочется.

Комментарии

Аватар пользователя Kottov Kottov 16 июля 2014 в 4:18

Спасибо, почти убедил. (( Придется пытаться понять Друпал.
Материала хватает, но весь какой-то механический. Это туда, это сюда. Не один раз смотрел на друпаловские методы - могу понять почему это работает. И делать так соответственно не хочется.
Я обычным ajax c первого раза все стало понятно.

Аватар пользователя imarat imarat 16 июля 2014 в 20:34

"Kottov" wrote:
Не один раз смотрел на друпаловские методы - могу понять почему это работает

вы хотели написать "не могу понять"? а то не вяжется с дальнейщей частью предложения

если не получилось

<?php

function тут_название_вашего_модуля_menu(){
$items['тут относительный адрес страницы куда будет идти запрос, без первого слеша'] = array(
'page callback' => '_is_ajax_callback',
'access callback' => TRUE,
);

return $items;
}

function _is_ajax_callback(){
//тут ваш код
}

?>

и сбрасываем друпал-кеш

Аватар пользователя Kottov Kottov 16 июля 2014 в 21:49

Примеров много, но либо с кусками кода, который не понятно как склеивать, либо пример заточен под какую-то специфическую задачу что там вообще черт ногу сломит.
Далее что одни предлагают способ с хук-меню - но без Drupal.ajax, другие с ним.

Вот разобрался с первым более простым. Привожу без всяких довесов, но все 3 файла сразу и целиком.

с помощью js подхавываются данные со страницы (в данном случае с профиля) отправляются на сервер, обрабатываются и возвращается результат в js

все в папуку /sites/default/modules/my_module

my_module.info

name = My Module
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().
 */

function my_module_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,

          

'number' => $numb
        
);
  
  
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);

  

$build['#post_render'][] = 'my_module_user_post_render';
}
?>

my_module.js

(function ($) {
  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 встречал примеры и без него

Аватар пользователя Kottov Kottov 17 июля 2014 в 4:20

не работает 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);

ничего не вышло

как-то через классы можно, но похоже что проблема в друпале

Аватар пользователя Kottov Kottov 17 июля 2014 в 5:22

добавил в модуль

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 - это заначит разрешния не выставлены?

Аватар пользователя imarat imarat 17 июля 2014 в 6:57

"Kottov" wrote:
не работает agr() под my_module_menu_ajax_callback()

думаю вы неправильно понимаете, что делает arg()
данные передавайте через гет параметры

Аватар пользователя Kottov Kottov 17 июля 2014 в 16:35

Мне нужен nid ноды и/или uid хозяина профиля.
Обычно (в полях с php фильтром) получал его их аргумента. И всегда был внутрений путь.

<?php
if (arg(0) == 'user' && is_numeric(arg(1))) $user_uid arg(1); 
$account user_load($user_uidnulltrue);  //  
$my_field_vlue $account->field_my_field['und'][0]['value']; 
?>

В модуле же (my_module_menu_ajax_callback()) в получается его "arg(1)" не видно.
А в других хуках arg() дает чистые ссылки.
Так и прередать переменную, это еще та проблема. global не работает как в php (насколько я понял).

Про гет параметры (поискал) но непонял. Это к базе обращатся что ли. Напишите по англ. пожалуйста.

Аватар пользователя drupby drupby 17 июля 2014 в 16:56

я конечно не совсем понимаю, что вы пытаетесь соорудить, но arg() как вариант можете передавать в javascript в Drupal.settings

function MYMODULE_init() {
  drupal_add_js(array('arg' => arg()),'setting');
}

в javascript
var arg1 = Drupal.settings.arg[1];

Аватар пользователя Kottov Kottov 17 июля 2014 в 17:48

О, СПАСИБО! - это вариант!

Отравил в яваскрипт, от туда по ajax в my_module_menu_ajax_callback().

Как-нибудь, когда прийдет мое время, пойму как это делать в php, отпишусь.

Аватар пользователя Kottov Kottov 26 июля 2014 в 4:09

Использую функцию перевода 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().

Аватар пользователя drupby drupby 26 июля 2014 в 4:35

"Kottov" wrote:
Язык ноды видит тоже, но нужно ведь чтоб выдавал пререводы на том языке что пользователь выбрал в данный момент.

ну так если нода переведена, то это же он и есть
"Kottov" wrote:
хотя в url стоит ru

вот оттуда и бери на крайняк
либо

var language = document.getElementsByTagName("html")[0].getAttribute("lang");
// или var language = document.getElementsByTagName("html")[0].getAttribute("xml:lang");
Аватар пользователя Kottov Kottov 16 августа 2014 в 0:07

еще вариант как получить uid и nid в модулях где не работает arg()

$uid = substr(current_path(), 5);
$nid = substr(current_path(), 5);