Drupal и JSON

Аватар пользователя alisichkin alisichkin 23 августа 2012 в 14:49

Добрый день!
Я программист, но Drupal и php знаю, к сожалению, плохо.
Даже не знаю с чего начать...
Передо мной стоит задача: Нужно реализовать на моем сайте (Drupal 6) обработку поступающего запроса, например в виде:
http://my.site.ru/query.getOperator?q=25001

Что я должен сделать, что бы в ответ на этот запрос пришел JSON ответ, например в таком виде: {"MNC":25001,"Name":"MTS"}

Да, данные, которые должен вернуть Web сервер лежат в таблицах MySQL, и возвращаются, предположим запросом:
select * from operators where MNC=:q

С Уважением,
Александр.

Комментарии

Аватар пользователя divined divined 23 августа 2012 в 15:14

Написать собственный модуль
(Это легко, папка и 2 файла внутри)

В модуле написать 2 функции, 1 из которых хук меню, вторая коллбэк этого меню.

Аватар пользователя divined divined 23 августа 2012 в 15:21
<?php
function {module_name}_menu(){

    

$items['query.getOperator']=array(
         
'title'=>t('Получение данных'),
         
'access callback' => true,
         
'page callback'=>'{module_name}_get_operator',
         
'type'=>MENU_CALLBACK
    
);
    return 
$items;
}

function {

module_name}_get_operator(){
   
$q $_GET['q'];
   
$sql "select * from operators where MNC = $q";
   
$result db_query($sql);
   
$data db_fetch_object($result);
   
drupal_json($data->{field_name});
}
?>

Примерно такое содержание модуля, только не уверен что адрес с точкой будет работать (не пробовал)

Аватар пользователя divined divined 23 августа 2012 в 15:29

Я пишу мультиязычные сайты обычно, причем исходный на моих сайтах - русский.

Аватар пользователя alisichkin alisichkin 23 августа 2012 в 15:33

Спасибо!
Читаю про создание модулей...

P.S.
А адрес с точкой я просто для примера привел - в twitter's API в url активно точки используют.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 23 августа 2012 в 15:39

"divined" wrote:
Я пишу мультиязычные сайты обычно, причем исходный на моих сайтах - русский.

в hook_menu() в title t() не нужен.
Русский язык в t() тем более не надо заворачивать

Аватар пользователя divined divined 23 августа 2012 в 15:44

хз, я над этим не заморачиваюсь, обычно это адреса админок или JSON функций, так что какой там будет тайтл меня мало волнует )

а в t() действительно русский язык не надо заворачивать, эт я погорячился, надыбал один из старых своих проектов и взял оттуда пример.

Аватар пользователя alisichkin alisichkin 23 августа 2012 в 17:05

Создал модуль,
зарегистрировал его в админке...
Выполняю запрос к url site.ru/query_getoperator?q=25001
получаю "Запрашиваемая страница не найдена"
Точку для точности из запроса убрал...

<?php
function fox_query_menu(){

    

$items['query_getoperator']=array(
         
'access callback' => true,
         
'page callback'=>'fox_query_get_operator',
         
'type'=>MENU_CALLBACK,
     
'title' => t('get data')
    );
    return 
$items;
}

function 

fox_query_get_operator(){
   
$q $_GET['q'];
   
$sql "select MCC, MNC, Name from operators where CONCAT( MCC, MNC )  = $q";
   
$result db_query($sql);
   
$data db_fetch_object($result);
   
drupal_json($data);
}
?>
Аватар пользователя aa2ndrew aa2ndrew 23 августа 2012 в 17:38

Попробуйте вместо

<?php
drupal_json
($data);
?>

написать return '111';
Если страница отобразится, значит проблема в том, что drupal_json($data) ничего не возвращает.
UPD. Или попробуйте вот так

<?php
print json_encode($data);
?>
Аватар пользователя alisichkin alisichkin 23 августа 2012 в 17:46

Проблемам с параметром...

Изменил на:

<?phpfunction fox_query_get_operator(){
   return t('Hello world');
}
?>

Запрос
site.ru/query_getoperator - работает,
site.ru/query_getoperator?q=1 - Запрашиваемая страница не найдена

?????????????

Аватар пользователя aa2ndrew aa2ndrew 23 августа 2012 в 17:47

Поменяйте гет-параметр q на другой. Если отключите чистые ссылки, то поймете почему.

Аватар пользователя alisichkin alisichkin 23 августа 2012 в 18:07

aa2ndrew: БОЛЬШОЕ СПАСИБО! Заработало!!
А могу я передать в url несколько параметров?

Аватар пользователя man-1982 man-1982 23 августа 2012 в 19:38

"divined" wrote:
Я пишу мультиязычные сайты обычно, причем исходный на моих сайтах - русский.

это как. Я так понимаю в функцию t('Вставляется русский текст') а потом переводиться ?
Мне интересно мнение народа насколько сей вариант кашерен?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 23 августа 2012 в 19:42

"man-1982" wrote:

это как. Я так понимаю в функцию t('Вставляется русский текст') а потом переводиться ?


некошерен по 2-ум причинам:
1. t() не переводит текст отличный от английского
2. В переводах появляется лишняя мусорная строка

Аватар пользователя man-1982 man-1982 23 августа 2012 в 20:06

Но если стоит по умолчанию язык русский.
и включен модуль locale.
то перевод можно будет осуществить... функция locale в этом случае вызывается

«

  // Translate with locale module if enabled.
  elseif (function_exists('locale') && $langcode != 'en') {
$string = locale($string, $langcode);

»

Аватар пользователя man-1982 man-1982 24 августа 2012 в 0:51

"divined" wrote:
Да, но просто нужно t('some text');
Даже если язык по умолчанию русский.

Я клоню смысл нашей беседы к следующим вещам:
1. Надо писать текст на английском.
2. Если не пишешь на английском то все равно загоняй текст в функцию t(), что бы потом когда прокачаешь скилл во вражьем языке проще была замена, или люди которые придут после тебя на так сильно тебя вспоминали.
3. @see part 1, 2
Smile
Ну как то так....