Добрый день!
Я программист, но 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
С Уважением,
Александр.
Комментарии
Написать собственный модуль
(Это легко, папка и 2 файла внутри)
В модуле написать 2 функции, 1 из которых хук меню, вторая коллбэк этого меню.
<?php
$items['query.getOperator']=array(
function {module_name}_menu(){
'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});
}
?>
Примерно такое содержание модуля, только не уверен что адрес с точкой будет работать (не пробовал)
И зачем там t(), да ещё и с русским текстом?
Я пишу мультиязычные сайты обычно, причем исходный на моих сайтах - русский.
Спасибо!
Читаю про создание модулей...
P.S.
А адрес с точкой я просто для примера привел - в twitter's API в url активно точки используют.
в hook_menu() в title t() не нужен.
Русский язык в t() тем более не надо заворачивать
хз, я над этим не заморачиваюсь, обычно это адреса админок или JSON функций, так что какой там будет тайтл меня мало волнует )
а в t() действительно русский язык не надо заворачивать, эт я погорячился, надыбал один из старых своих проектов и взял оттуда пример.
Создал модуль,
зарегистрировал его в админке...
Выполняю запрос к url site.ru/query_getoperator?q=25001
получаю "Запрашиваемая страница не найдена"
Точку для точности из запроса убрал...
<?php
$items['query_getoperator']=array(
function fox_query_menu(){
'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);
}
?>
кэш полностью надо скинуть
Кеш пробовали чистить?
Очистка кеша не помогла
Administer » Site configuration » Clear cached data
Попробуйте вместо
<?php
drupal_json($data);
?>
написать return '111';
Если страница отобразится, значит проблема в том, что drupal_json($data) ничего не возвращает.
UPD. Или попробуйте вот так
<?php
print json_encode($data);
?>
Это разные вещи.
А модуль подключили?
Проблемам с параметром...
Изменил на:
<?phpfunction fox_query_get_operator(){
return t('Hello world');
}
?>
Запрос
site.ru/query_getoperator - работает,
site.ru/query_getoperator?q=1 - Запрашиваемая страница не найдена
?????????????
Поменяйте гет-параметр q на другой. Если отключите чистые ссылки, то поймете почему.
aa2ndrew: БОЛЬШОЕ СПАСИБО! Заработало!!
А могу я передать в url несколько параметров?
?qyery=1&query2=2&...
или
?query=1+2+3, а затем
$array = explode('+',$_GET['query']);
ВСЕМ Большое Спасибо!
P.S. А url с точкой работает: site.ru/query.getoperator?p='25001'
это как. Я так понимаю в функцию t('Вставляется русский текст') а потом переводиться ?
Мне интересно мнение народа насколько сей вариант кашерен?
некошерен по 2-ум причинам:
1. t() не переводит текст отличный от английского
2. В переводах появляется лишняя мусорная строка
Но если стоит по умолчанию язык русский.
и включен модуль locale.
то перевод можно будет осуществить... функция locale в этом случае вызывается
«
elseif (function_exists('locale') && $langcode != 'en') {
$string = locale($string, $langcode);
»
Да, но просто нужно t('some text');
Даже если язык по умолчанию русский.
Я клоню смысл нашей беседы к следующим вещам:
1. Надо писать текст на английском.
2. Если не пишешь на английском то все равно загоняй текст в функцию t(), что бы потом когда прокачаешь скилл во вражьем языке проще была замена, или люди которые придут после тебя на так сильно тебя вспоминали.
3. @see part 1, 2
Ну как то так....