Ajax insert в базу данных

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

Аватар пользователя Наденька Наденька 24 июля 2016 в 21:46

Привет коллеги, сегодня столкнулась в очередной раз со своей стеной непонимания. Подтолкните в нужную сторону пожалуйста.

Есть некий самописный модуль, который при помощи аякса делает вычисления на основе полей ноды и того что вводит пользователь, вроде калькулятора.

Так вот я никак не пойму как результать этого вычисления послать в БД по идее нужно в отдкльном от name.module файле создать функцию для отправки такого вида:

<?php
     $sendit 
db_insert('calculate_temp')
               ->
fields(array(
                 
'id' => 78,
                 
'total' => 5000,
               ))
               ->
execute();?>

Соответственно 78 и 5000 заменив на переменные. Если вставить выше описанный код в фуцию с блоком при загрузке страницы, всё прекрасно отрабатывается и статические данные бадают в БД.

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

Пробовала сделать как обычно посыл аякса типа:

  $.ajax({
          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 что бы он аяксом передавал данные и закидывал в БД по клику.

Благодарю всех кто откликнулся!

Лучший ответ

Аватар пользователя Orion76 Orion76 25 июля 2016 в 0:17
1

Никакие файлы никуда подключать не надо, все уже подключено до нас.
Хуком 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

Комментарии

Аватар пользователя gun_dose gun_dose 24 июля 2016 в 23:59

По какому событию аякс срабатывает? По идее, если этот ваш калькулятор сделан через Form API, то аякс там же в форме нужно привесить на кнопку или на ещё что-нибудь, и в ajax_callback уже можно бесчинствовать по полной.

Аватар пользователя Наденька Наденька 25 июля 2016 в 1:04

Срабатывает по клику. Работает через одно место вместо 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 и прекрасно работает.

Я пыталась сделать это так:

  $.ajax({
          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 не знает не то что о базе данных, но и не о друпале.

Вот я и мудохаюсь со своим франкинштейн-велосипедом. Smile

Наверное стоит уточнить, что это мой первый модуль для друпала который делать что то большее чем форм альтер и вообще я верстальщица а не программист. Но это так к слову, что бы оправдятся почему я такой фигни нагородила. I-m so happy

Плюс ко всему, я не уверена что в одном модуле можно сделать две ajax формы одну вместо моего франкинштейна в экстра поле а вторую на отдельной странице.

P.S. Спасибо за внимание к моему вопросу!

Аватар пользователя Orion76 Orion76 25 июля 2016 в 0:17
1

Никакие файлы никуда подключать не надо, все уже подключено до нас.
Хуком 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

Аватар пользователя Наденька Наденька 25 июля 2016 в 1:07

Я уже осознала свою ошибку, сделав это не через form api. Наверное не стоило так делать что бы не мучатся.

P.S. Комментарием выше мое покаяние о содеянном. I-m so happy

Аватар пользователя Наденька Наденька 25 июля 2016 в 2:48

Намучавшись вдоволь со своим монстриком, решила пойти по правильному пути, толко вот уже битый час не могу найти как сделать форму на Form API, только не на отдельной странице а в блоке?

Создавать страницы с формами научилась - function calculator_page_form($form, $form_state) { $form = array(); $form['name'] = array(...

блоки со своим содержимым тоже - function calculator_block_info() { $blocks['...'] = array(...

Как бы теперь это всё объединить?

Аватар пользователя sas@drupal.org sas@drupal.org 25 июля 2016 в 8:00

Наденька wrote:

Намучавшись вдоволь со своим монстриком, решила пойти по правильному пути, толко вот уже битый час не могу найти как сделать форму на 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

Аватар пользователя sas@drupal.org sas@drupal.org 25 июля 2016 в 8:01

tlito wrote:

спросите на дру.ио там есть профессиональные помощники


Лучший помощник программиста = документация, профессиональней её = нет!

Аватар пользователя Наденька Наденька 25 июля 2016 в 16:41

Проблема в том, что я начинающая, документация на моём уровне слишкам скупая на примеры и заумна на всякие словечки. Те-же example модули решают ровно те задачи, которые я и сама уже научилась решать без их помощи, ну может разве-что подглядывая чуток. Но в той-же документации нет доступных примеров, например форму из api в блок засунуть, надо додумывать (у меня даже получилось), но поиск тоже не сильно мне помог найти примеры в этой конкретной задаче. Так что как бы кому не хотелось документацтя это не панацея, а лишь помощник для специалистов, и весьма абстрактный набор для начинающих. Благо скупость документации компенсирует замечательное комьюнити. Очень часто можно найти в обсуждениях инетерсные примеры и решения, понять почему те или инные методы используются.

Аватар пользователя Alamir Alamir 25 июля 2016 в 11:28
1

Ну если не переделывать форму то еще можно сделать hook_menu и в файле callback'а этой страницы отдавать код.