[РЕШЕНО]удалить запись из БД по клику

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

Аватар пользователя zlodiak zlodiak 10 ноября 2013 в 18:00

помогите пожалуйста решить проблему

через hook_menu создаю страничку, на которую выводятся из БД несколько записей в виде UL-списка. каждый элемент списка имеет в правом верхнем углу картинку-крестик, при клике на который запись должна удаляться(стираться из БД и удаляться с экрана)

для решения этой задачи я пытаюсь делать следующее:
через jquery создаю обработчик события 'click', который запускает файл dbQueries.php посредством ajax-запроса.

$('.icon_delete').on('click', function(){
        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 »

при этом запись в БД не добавляется

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

Комментарии

Аватар пользователя serega111 serega111 10 ноября 2013 в 19:39

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/

Аватар пользователя Chyvakoff Chyvakoff 11 ноября 2013 в 9:02

"zlodiak" wrote:
dbQueries.php

Не имеет понятия об апи друпала, следовательно незнает функций db_insert и т.д.
Нужно подтянуть ядро друпала,как в индекс.пхп, или ,как уже сказали, всё писать в модуле.

Аватар пользователя zlodiak zlodiak 14 ноября 2013 в 13:13

не получается что-то, подскажите пожалуйста где ошибка

есть страница с html:

<li class="first">
        <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:

(function ($){
        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. кэш друпала сбрасывал

Аватар пользователя sergeybelya sergeybelya 14 ноября 2013 в 14:10

zlodiak wrote:
не получается что-то, подскажите пожалуйста где ошибка

есть страница с html:

<li class="first">
        <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:

(function ($){
        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

Аватар пользователя serega111 serega111 14 ноября 2013 в 21:59

Что за страница модуля? почему ее нет в вашем hook_menu?

У вас на сайте во всех урлах есть добавка после домена '/drupal/d7_modules'?

Аватар пользователя Chyvakoff Chyvakoff 15 ноября 2013 в 8:57

"zlodiak" wrote:
$items['ajaxQuery/%'] = array(
    'title' => 'ajax-query',
    'page callback' => 'ajaxQuery',
    'page arguments' => array(1),
    'access arguments' => array('access content'),
    'type' => MENU_LOCAL_TASK,    
);   

В твоём случае надо писать 'type' => MENU_CALLBACK
И функция ajaxQuery должна делать print, а не return;

Аватар пользователя serega111 serega111 15 ноября 2013 в 10:26

"Chyvakoff" wrote:
В твоём случае надо писать 'type' => MENU_CALLBACK
И функция ajaxQuery должна делать print, а не return;

В коде, конечно, куча нарушений стандартов друпала. Но вроде все это не должно вызывать 404 ошибку. Страница должна вызываться.
Я подозреваю, что у автора сам друпал находится тут http://test1.ru/drupals/d7_modules/, а в javascript он делает запрос к http://test1.ru/ajaxQuery. А так как http://test1.ru папка не друпаловская, то и пути такого на сервере нет.

Аватар пользователя drupby drupby 15 ноября 2013 в 11:02

"serega111" wrote:
Я подозреваю, что у автора сам друпал находится тут http://test1.ru/drupals/d7_modules/, а в javascript он делает запрос к http://test1.ru/ajaxQuery. А так как http://test1.ru папка не друпаловская, то и пути такого на сервере нет.

ну тогда надо делать так
вместо
url: '/ajaxQuery/' + num,
пишем
url: Drupal.settings.basePath + '/ajaxQuery/' + num,