На денвере не выполняються ajax(javascript) запросы

Здравствуйте!
Поставил Денвер+ Д7.

И аякс запросы+хук_меню не выполняются.

А на Д6. Таких проблем нет.

Коментарів:

10

Коментувати

Увійдіть або зареєструйтесь, щоб додати коментар

Коментарі

Яка помилка в консолі? Код продемонструйте будь ласка. Аякс працює на Drupal 7. Це можна побачити на модулі Overlay, який є в ядрі.

Файл JS.
$.ajax({url: "/multimetr_set" ,
global: false,
type: "POST",
data: "mmddd="+a_val,
dataType: "html",
success: function(msg){
alert(msg);
}
});

Файл multimter.module

//hook_menu
$items=array();
$items['multimetr_set'] = array(
'access callback'=>true,
'page callback'=>'mpage',
'type'=>MENU_CALLBACK
);
return $items;

//mpage
function mpage()
{
print "test";
ob_get_clean();
}

Роблю так. Ця зв'язка на ура! Працює в Drupal6 а Drupal7 аж не як.

Идейно все сделано не правильно. В Друпале АЯКС называется AHAH и работает на библиотеке и АПИ AHAH. Вот очень простой пример взятый отсюда
Хук_меню — определяет сначала страницу с формой калькулятора, а ниже определяем страницу которая даст ответ нашему АЯКС запросу — calc/ahah
function simplecalc_menu()
{
$items['calc'] = array(
'title' => 'Simple Calc',
'page callback' => 'drupal_get_form',
'page arguments' => array('simplecalc_form'),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
$items['calc/ahah'] = array(
'title' => 'Calculate',
'page callback' => 'simplecalc_ahah',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
Форма калькулятора, стоит обратить внимание на кнопке есть поле #ahah с описанием формата запроса и параметрами куда размещать ответ (подробнее в АПИ)
function simplecalc_form()
{
$form['wrapper'] = array(
'#prefix' => '',
'#suffix' => '',
);
$form['wrapper']['number1'] = array(
'#type' => 'textfield',
'#size' => 3,
'#suffix' => '+',
);
$form['wrapper']['number2'] = array(
'#type' => 'textfield',
'#size' => 3,
);
$form['wrapper']['answer'] = array(
'#value' => '= ?',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Посчитать',
'#ahah' => array(
'path' => 'calc/ahah', // адрес по которому будет отправлен AJAX запрос
'wrapper' => 'answer', // id элемента в который вернёться результат AJAX запроса
),
);
return $form;
}
Ну и вот обработка страницы АНАН, возвращаем json
/**
* AHAH callback
*/
function simplecalc_ahah()
{
// по хорошему, тут мы должны достать форму из кэша, добавить новый
// элемент (поле ответ), сохранить форму в кэш, отрендерить новый элемент
// и вернуть его html код. Подробнее по ссылкам ниже.
$number1 = isset($_POST['number1']) ? (int)$_POST['number1'] : 0;
$number2 = isset($_POST['number2']) ? (int)$_POST['number2'] : 0;
drupal_json(array('status' => true, 'data' => $number1 + $number2));
}

Такой метод намного лучше прямого АЯКС запроса или сторонних библиотек, потому что Друпал будет заботится о безопасности, кросброузерности, поддержки разных версий Друпала да и в общем работоспособности

В сімці він вже називається Ajax :)
http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....

Треба дійсно його використовувати, а не писати свій велосипед. Топікастеру читати це http://drupal.org/node/751744

а зачем его переименовали?

Наскільки я знаю через ідейну концецію, AHAH - в своїй назві несе відбиток того шо від сервера мають перадаватись дані лише в html форматі, а в Ajax хоча і передбачав спочатку передачу данних лише в форматі XML, але де-факто данні можна передавати в чому хочеш від html до json

Доречі в сімці для провадження ajax взяли також дуже потужній модуль ahah_helper. Якщо в 6-ці Вам для роботи з ajax і формами треба було писати щось типу такого http://www.drupal.ru/node/55274#334726
То в 7-ці треба буде прив"язати лише властивість #ajax і прописати в ньому #callback

К стати частично проблема решена.
Вот решение...

Только вопрос а как "привязать" АЯКС не к "кнопке" submit-а, а к обычной ссылке?

function ab_basket_menu()
{
$items = array();
$items['calc'] = array(
'title' => 'Simple Calc',
'page callback' => 'drupal_get_form',
'page arguments' => array('simplecalc_form'),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
$items['calc/ahah'] = array(
'title' => 'Calculate',
'page callback' => 'simplecalc_ahah',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}

function simplecalc_form()
{
$form['calc_form'] = array(
'#prefix' => '',
'#suffix' => '',
);
$form['calc_form']['number1'] = array(
'#type' => 'textfield',
'#size' => 3,
'#suffix' => '+',
);
$form['calc_form']['number2'] = array(
'#type' => 'textfield',
'#size' => 3,
);
$form['calc_form']['answer'] = array(
'#prefix'=>'=?',
'#suffix' => '',
);

$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Посчитать',
'#ajax' => array(
//'path' => 'calc/ahah', // адрес по которому будет отправлен AJAX запрос
'callback'=>'mysimplecalc_ahah',
'wrapper' => 'answer' // id элемента в который вернёться результат AJAX запроса
),
);
return $form;
}

function mysimplecalc_ahah($form, &$form_state)
{
$number1 = isset($form['calc_form']['number1']['#value']) ? (int)$form['calc_form']['number1']['#value'] : 0;
$number2 = isset($form['calc_form']['number2']['#value']) ? (int)$form['calc_form']['number2']['#value'] : 0;

ob_start();
print '=';
print $number1+$number2;
$bod = ob_get_clean();

$form['calc_form']['answer'] = array(
'#prefix'=>''.$bod,
'#suffix' => '',
);
return $form['calc_form']['answer'];
}

ничего не мешает оформить стилями кнопку как ссылку. Сделать всю форму из одной кнопки и готово

а можно использовать обычный JQuery — $.get/$.post/$().load
мануал