Привет коллеги, сегодня столкнулась в очередной раз со своей стеной непонимания. Подтолкните в нужную сторону пожалуйста.
Есть некий самописный модуль, который при помощи аякса делает вычисления на основе полей ноды и того что вводит пользователь, вроде калькулятора.
Так вот я никак не пойму как результать этого вычисления послать в БД по идее нужно в отдкльном от name.module файле создать функцию для отправки такого вида:
<?php
$sendit = db_insert('calculate_temp')
->fields(array(
'id' => 78,
'total' => 5000,
))
->execute();?>
Соответственно 78 и 5000 заменив на переменные. Если вставить выше описанный код в фуцию с блоком при загрузке страницы, всё прекрасно отрабатывается и статические данные бадают в БД.
Я понимаю что это надо завернуть в фукцию и разместить в отдельном от .module файле. Но никак не пойму как правильно подключить файл с этой функцией что бы туда потом аяксом отправить данные.
Пробовала сделать как обычно посыл аякса типа:
url: "/sites/all/modules/MYMODULE/data_ajax.php",
type: "POST",
data: {...
И конечно же ничего у меня не вышло, точнонее отработал весь код из /sites/all/modules/MYMODULE/data_ajax.php кроме друпаловского кода:
<?php $sendit = db_insert('calculate_temp')
->fields(array(
?>
Оно и не мудрено, так дико файл в модуль втыкать!
Подскажите пожалуйста как правльно подключить к модулю файл с функией db_insert что бы он аяксом передавал данные и закидывал в БД по клику.
Благодарю всех кто откликнулся!
Комментарии
По какому событию аякс срабатывает? По идее, если этот ваш калькулятор сделан через Form API, то аякс там же в форме нужно привесить на кнопку или на ещё что-нибудь, и в ajax_callback уже можно бесчинствовать по полной.
Срабатывает по клику. Работает через одно место вместо Form API это я поняла через пару часов гугления, как надо было делать. Формы на Form API у меня на ура отправляются через Ajax в БД.
В моём случае получился вот такой франкинштейн:
Создала поле с моим монстриком:
<?phphook_extra_fields() {
$extra['node']['object'] = array(
'display' => array(
'my_form' => array(...?>
в функции задала содержимое
<?php$node->content['booking_form'] = array(
'#markup' => '<div class="calculator">
<p class="basic_price">'.t('Price').': '. $price.'</p> // В этой переменной поле с базовой ценой взятое из ноды
<p class="tax">'.t('TAX').': '.$tax.'</span> €</b></p> // В этой переменной поле с базовой наценкой взятое из ноды
<input type="text" id="option1"> // Здесь прицеплено некоторое подобие coor picker
<input type="text" id="option2"> // Здесь прицеплено некоторое подобие model picker
<span id="reservarbtn">'.t('Buy for').' <span id="totalprice"></span></span> // Это моя кнопка отправки в id="totalprice" прилетает скалькулированная цена
?>
По идее после клика на id="totalprice" мне нужно закинуть в базу данных то, что навыбирал пользователь в пикерах id="option1" и id="option2", затем то, что ему прилетело в кнопку с конечной ценой и затем отправить его на форму заказа, которая как раз сделанна через Form API и прекрасно работает.
Я пыталась сделать это так:
url: "/sites/all/modules/MYMODULE/data_ajax.php",
type: "POST",
data: {...
И в data_ajax.php после получения post и записи из в переменные, засунуть всё это в ДБ таким образом:
<?php$sendtodb = db_insert('calculator_temp')
->fields(array(...?>
И разумеется аякс который в модуле зовет файл таким образом
$.ajax({ url: "/sites/all/modules/MYMODULE/data_ajax.php",
Не сможет отработать db_insert так как по сути data_ajax.php не знает не то что о базе данных, но и не о друпале.
Вот я и мудохаюсь со своим франкинштейн-велосипедом.
Наверное стоит уточнить, что это мой первый модуль для друпала который делать что то большее чем форм альтер и вообще я верстальщица а не программист. Но это так к слову, что бы оправдятся почему я такой фигни нагородила.
Плюс ко всему, я не уверена что в одном модуле можно сделать две ajax формы одну вместо моего франкинштейна в экстра поле а вторую на отдельной странице.
P.S. Спасибо за внимание к моему вопросу!
Никакие файлы никуда подключать не надо, все уже подключено до нас.
Хуком hook_form_alter вешаете аякс-обработчик на нужный элемент формы (в модуле).
(гуглим: drupal hook form alter )
(гуглим: drupal form api #ajax)
Теоретически можно и в аякс-колбэке сделать запрос к бд, но идеологически правильнее добавить к элементу формы(кнопка наверное) по которому будут отправляться аяксом данные, свой submit-callback:
'#submit'=>array('my_submit_callback')
и уже в нем (функция my_submit_callback ) делать запросы к БД
тут примеры для разработчиков на все случаи жизни: https://www.drupal.org/project/examples
А тут уже все разжевано: http://xandeadx.ru/blog/drupal/555
Я уже осознала свою ошибку, сделав это не через form api. Наверное не стоило так делать что бы не мучатся.
P.S. Комментарием выше мое покаяние о содеянном.
если аякс вызывает отдельный php-файл, в нем недостаточно одной функции,надо заново бутстрапить друпал http://www.drupaldeconstructed.com/content/
Спасибо, это уже очень похоже на решение моей проблемы. Отдельное спасибо за сайт, очень информативный!
Намучавшись вдоволь со своим монстриком, решила пойти по правильному пути, толко вот уже битый час не могу найти как сделать форму на Form API, только не на отдельной странице а в блоке?
Создавать страницы с формами научилась - function calculator_page_form($form, $form_state) { $form = array(); $form['name'] = array(...
блоки со своим содержимым тоже - function calculator_block_info() { $blocks['...'] = array(...
Как бы теперь это всё объединить?
Надо в хук блок вью вызвать друпал гет форм.
Спасибо именно так и сделала
спросите на дру.ио там есть профессиональные помощники
https://www.drupal.org/project/examples
Лучший помощник программиста = документация, профессиональней её = нет!
Это если она есть. А если нет, то лучший помощник - это чужой код.
Проблема в том, что я начинающая, документация на моём уровне слишкам скупая на примеры и заумна на всякие словечки. Те-же example модули решают ровно те задачи, которые я и сама уже научилась решать без их помощи, ну может разве-что подглядывая чуток. Но в той-же документации нет доступных примеров, например форму из api в блок засунуть, надо додумывать (у меня даже получилось), но поиск тоже не сильно мне помог найти примеры в этой конкретной задаче. Так что как бы кому не хотелось документацтя это не панацея, а лишь помощник для специалистов, и весьма абстрактный набор для начинающих. Благо скупость документации компенсирует замечательное комьюнити. Очень часто можно найти в обсуждениях инетерсные примеры и решения, понять почему те или инные методы используются.
Ну если не переделывать форму то еще можно сделать hook_menu и в файле callback'а этой страницы отдавать код.