помогите пожалуйста решить проблему
через hook_menu создаю страничку, на которую выводятся из БД несколько записей в виде UL-списка. каждый элемент списка имеет в правом верхнем углу картинку-крестик, при клике на который запись должна удаляться(стираться из БД и удаляться с экрана)
для решения этой задачи я пытаюсь делать следующее:
через jquery создаю обработчик события 'click', который запускает файл dbQueries.php посредством ajax-запроса.
var f = $(this).attr('data-num'); // это уникальный id записи
console.log(f);
r = $.ajax({
type: 'POST',
url: 'dbQueries.php',
data: f,
dataType: 'html',
success: success
});
if(r){
console.log('yyy');
}
else{
console.log('nnn');
}
function success(dat){
console.log('y');
$('body').html(dat);
}
});
содержание dbQueries.php:
<?php$q = db_insert('news_tape') //для удаления нужно использовать другую команду, но в целях упрощения отладки пока заменил на db_insert
->fields(array(
'title' => '1',
'body' => '1',
'date' => '1'
))
->execute();
echo('complete');?>
в результате после того как пользователь кликает по картинке-крестику в консоль выводится следующее
«14
yyy
y »
при этом запись в БД не добавляется
посоветуте пожалуйста как решить эту типовую задачу. возможно, я изобретаю велосипед и в друпале есть готовый функционал для подобных действий...
Комментарии
1. В hook_menu задать путь для ajax запроса
2. В page callback для ajax запроса выполнить с БД
3. Не использовать js вообще. Достаточно к ссылкам добавить класс use-ajax и подключить либу для ajax запросов при формировании страницы со списком
<?php
drupal_add_library('system', 'ajax').
?>
В ссылках указать путь для ajax запросов и GET параметры для формирования запроса к бд
4. page callback должен возвращать ajax commands для того чтобы скрыть/удалить строку на странице
пример модуля с пояснениями, работающего по тому же сценарию http://xandeadx.ru/blog/drupal/346
описание команд ajax fremawork'a http://xandeadx.ru/blog/drupal/492
А насчет вашего кода:
1. Не создавайте отдельных php файлов в корне друпала. Вся логика должна быть в файле модуля
2. В js нужно использовать Drupal.behaviors. Тут немного написано о js в друпал http://habrahabr.ru/post/161039/
Не имеет понятия об апи друпала, следовательно незнает функций db_insert и т.д.
Нужно подтянуть ядро друпала,как в индекс.пхп, или ,как уже сказали, всё писать в модуле.
не получается что-то, подскажите пожалуйста где ошибка
есть страница с html:
<div class="title">121<div class="icon_delete jquery-once-1-processed" data-num="15"></div></div>
<div class="body">11111221</div>
<div class="date">2013-11-20</div>
</li>
в hook_menu добавляю страничку с кодом, который вставляет в БД запись:
<?phpfunction news_tape_menu() {
$items = array();
$items['ajaxQuery/%'] = array(
'title' => 'ajax-query',
'page callback' => 'ajaxQuery',
'page arguments' => array(1),
'access arguments' => array('access content'),
'type' => MENU_LOCAL_TASK,
);
return $items;
}
function ajaxQuery($num){
$query = db_insert('news_tape')
->fields(array(
'title' => 1,
'body' => 2,
'date' => 3
))
->execute();
return drupal_json_output('hello');
}?>
добавляю на страницу js:
Drupal.behaviors.Example = {
attach: function (context, settings){
$(".icon_delete").once(function(){
$(this).click(function(event){
console.log(55555);
var num = $(this).attr('data-num');
jQuery.ajax({
url: '/ajaxQuery/' + num,
type: 'POST',
dataType: 'application/json',
success: function(data){
var jobj = jQuery.parseJSON(data);
console.log(jobj);
}
});
});
});
}
}
})(jQuery);
после этого заходу на страничку с вышеуказанным html и кликаю по
<div class="icon_delete" data-num="15"></div>
в результате консоль выводит следующее:
«55555
POST http://test1.ru/ajaxQuery/15 404 (Not Found) »
при этом запись в БД не вставляется. все типы полей в целевой таблице - varchar. кэш друпала сбрасывал
Используйте фреймворк Ajax Drupal 7 в соответствии с
http://www.slideshare.net/merlinofchaos/drupal-7-advanced-ajax
спасибо за ссылку, но нельзя ли всё таки указать где я ошибся в моём примере?..
В коде ошибок нет, вроде все норм.
Как имя модуля, который вы создали?
news_tape
так же и все файлы называются:
news_tape.info
news_tape.module
news_tape.install
путь к странице модуля
http://test1.ru/drupals/d7_modules/admin/config/user-interface/news_tape
Что за страница модуля? почему ее нет в вашем hook_menu?
У вас на сайте во всех урлах есть добавка после домена '/drupal/d7_modules'?
В твоём случае надо писать 'type' => MENU_CALLBACK
И функция ajaxQuery должна делать print, а не return;
а если присмотреться к drupal_json_output , то она делает echo внутри своего тела
В коде, конечно, куча нарушений стандартов друпала. Но вроде все это не должно вызывать 404 ошибку. Страница должна вызываться.
Я подозреваю, что у автора сам друпал находится тут http://test1.ru/drupals/d7_modules/, а в javascript он делает запрос к http://test1.ru/ajaxQuery. А так как http://test1.ru папка не друпаловская, то и пути такого на сервере нет.
ну тогда надо делать так
вместо
url: '/ajaxQuery/' + num,
пишем
url: Drupal.settings.basePath + '/ajaxQuery/' + num,