jQuery и PHP - автоматическое обновление текущего представления таблицы следующими записями при удалении записей в существующем представлении

ПЛАТФОРМА:

PHP, mySQL и JQuery

ЧТО У МЕНЯ ЕСТЬ:

У меня есть таблица базы данных. В моем приложении я могу получить все строки. Когда я запрашиваю базу данных, я установил ограничение на выборку записей, равное 30, но это можно изменить с помощью раскрывающегося списка. Поэтому учтите, что я извлекаю до 30 строк данных в одном запросе и отображаю их. Я заполняю эти данные в таблице (строках). У меня есть флажок рядом с каждой записью и кнопка «Удалить». При нажатии кнопки «Удалить» все отмеченные строки будут удалены.

ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ:

Для каждой удаляемой строки я пытаюсь обновить текущее представление следующим набором строк, пока не будет достигнут предел выборки строк. Сбивает с толку? Вот пример:

ПРИМЕР:

Учтите, что в моей таблице 1000 строк, и я установил ограничение на выборку записей как 30, что означает, что одновременно будет отображаться до 30 записей. Я могу использовать разбиение на страницы для перехода к другим записям. Теперь, на мой взгляд, у меня есть 30 строк данных в таблице. Я выбрал 5 строк и удалил их через jQuery. После удаления я могу удалить удаленные строки из поля зрения. Итак, в этом случае, поскольку я удалил 5 строк, я могу удалить их, и теперь мое представление показывает мне только 25 строк (что правильно). Поскольку в моей таблице осталось 995 строк, и поскольку у меня есть ограничение на выборку записей, равное 30, теперь я хочу, чтобы это работало таким образом, чтобы я автоматически показывал следующие 5 записей. Я хочу, чтобы существующие записи перемещались вверх, а новые записи заполнялись внизу.

Другими словами, пока существует достаточно строк, я хочу заполнить свое представление таким же количеством записей, сколько было удалено. Поэтому, если я удалю 10 записей, я хочу, чтобы следующие 10 записей автоматически извлекались и отображались снова, в результате чего общее количество отображаемых строк данных составляло 30. Если 20 записей удалены, то я хочу, чтобы следующие 20 записей извлекались и отображались автоматически (опять же, общее количество отображаемых строк данных составляет 30). Я хочу сделать это с прикрепленным к нему эффектом, чтобы я мог визуально заметить, что появились новые строки. Может быть, можно применить эффект скольжения или постепенного увеличения + скольжение? Надеюсь, я имею смысл.

ЧТО МНЕ НУЖНО:

Мне нужен код PHP и jQuery, чтобы иметь возможность достичь вышеуказанного эффекта/функциональности. Заранее спасибо.

Вот немного моего кода jQuery (если это поможет):

$('#button_delete').click(function() {  

  $.ajax({
   type: 'POST',  
   cache: false,
   url: 'test.php',
   data: $('#form1').serialize(), 
   dataType: 'json',
   success: function(data) {            

      if(data.success === 1)
      {
       $.each(data.id, function (index, value) {       

         $('#'+value).remove();
       });   

             jQuery.each(data.new_rows_data, function(i, val) 
            {

                jQuery.each(val, function(i, new_val) 
                {                  
                    $('#table').append('<tr id='+new_val+'>'+

                  '<td></td>'+
                  '<td></td>'+
                  '<td>'+new_val+'</td>'+           
                  '</tr>'); 
                });
            });


      }
     }       
   }) 

  return false;
});

Код PHP:

<?php
 $from = 0;
 $limit = 30;

$result = mysql_query( "SELECT * FROM mytable ORDER BY m_id ASC LIMIT  $from, $limit" );  
?>

<table>
 <tr>
     <td>ID</td>
     <td>Content</td>
    </tr>   

 <?php
 while( $rows = mysql_fetch_array($result) )
 {
 ?>
 <tr id=<?php echo $rows['m_id']; ?>>
     <td><?php echo $rows['m_id']; ?></td>
     <td><?php echo $rows['content']; ?></td>
    </tr>   
 <?php    
 }
 ?>

</table>

test.php

//test.php

<?php 

$id = $_POST['id'];

if( is_array( $id ) )
{
    $arr_size = sizeof( $id );

    foreach ( $id as $value )
    {
        $sql = "DELETE FROM mytable WHERE id = ".(int)$value." LIMIT 1";
        $result = mysql_query($sql);
    }

    if( $result )
            {
                $success = 1;
                $message = 'Deleted';   
            }
        else
            {
                $success = 0;
                $message = 'Unable to DELETE FROM DB.';             
            }
}

$last_id = 500; 


for($i=1; $i <= $arr_size;  $i++)
{
    $new_value = ($last_id + $i);

    $new_rows[] .= $new_value;

    $res = mysql_query("SELECT id,  message, date 
                       FROM mytable WHERE id = ".(int)$new_value." "); //LIMIT 1

    $row = mysql_fetch_array($res);



    $new_rows_data['row']['id'] .= $row['id'];

    $new_rows_data['row']['message'] .= $row['message'];

    $new_rows_data['row']['date'] .= $row['date'];
}



print json_encode(array('success' => $success, 'message' => $message, 'id' => $id,  'new_rows' => $new_rows,
                        'new_rows_data' => $new_rows_data));    
?>

person Devner    schedule 07.01.2010    source источник


Ответы (1)


Поскольку вы используете AJAX (или, я думаю, ajaj) для удаления строк, вы также можете передать последний идентификатор, который в настоящее время отображается, на страницу сообщения об удалении.

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

$('#button_delete').click(function() {  

  $.ajax({
   type: 'POST',  
   cache: false,
   url: 'test.php',
   data: $.extend($('#form1').serialize(), { 'last_id':$('#table tr:last').attr('id') }), 
   dataType: 'json',
   success: function(data) {            

      if(data.success === 1)
      {
       $.each(data.id, function (index, value) {       

         $('#'+value).remove();
       });   
       jQuery.each(data.new_rows_data, function(i, val) 
            {
                 $('#table').append('<tr id='+val.id+'>'+

                  '<td></td>'+
                  '<td></td>'+
                  '<td>'+val.message+'</td>'+           
                  '</tr>');   

            });

      }
     }       
   }) 

  return false;
});

Или что-то в этом роде.

Теперь вы сможете получить доступ к последнему идентификатору в вашем коде удаления через $_POST['last_id']. Изменив пост-удаление, выберите:

$res = mysql_query("SELECT id,  message, date 
                   FROM mytable WHERE id > ".(int)$last_id." limit ".$arr_size);

Вы должны получить результаты после вашего последнего.

person Adam Benzan    schedule 07.01.2010
comment
Привет Адам, Спасибо за ваш ответ. Поскольку я уже передаю идентификатор выбранной строки посредством сериализации формы, как мне передать идентификатор последней видимой строки? - person Devner; 07.01.2010
comment
Если подумать, вам на самом деле не нужно явно отслеживать этот last_id. $(table tr:last).attr('id') , вероятно, надежно даст вам последний видимый. (Тем не менее, я бы добавил несколько классов в строки данных и идентификатор в таблицу, чтобы селектор не был таким общим.) - person Adam Benzan; 07.01.2010
comment
Привет, Адам, я отредактировал свой исходный пост, включив в него страницу test.php (страницу, на которую отправляется форма). Я изменил свой код, чтобы я мог отправлять значения $new_rows_data['row']['id'], $new_rows_data['row']['message'] и $new_rows_data['row']['date'] в событие успеха, а затем в основной таблице заполнить новые строки соответствующими данными для каждой из строк, но это не работает неправильно. Вместо того, чтобы заполнять данные одной записи в одной строке, он создает несколько строк для каждого из полученных данных. - person Devner; 08.01.2010
comment
..продолжение сверху... Итак, если я удалю 1 запись, я пытался заставить ее заполнить 1 новую строку значениями идентификатора, сообщения и данных в соответствующих столбцах (ну, мой исходный PHP-код показывает только 2 столбца, извините об этом), но вместо этого он заполняет 3 новые строки, одна для идентификатора, вторая для сообщения и третья строка для даты. Проще говоря, он обрабатывает каждый столбец как новую строку и неправильно обновляет мою таблицу. Я надеюсь, что я имею смысл. Надеюсь, мы сможем найти решение для этого. Большое спасибо. - person Devner; 08.01.2010
comment
Тогда он, вероятно, перебирает поля объекта, а не объекты в списке. Используете ли вы data.new_rows или data.new_rows_data в своем методе успеха? Похоже, что new_rows_data должен нормально работать с каждым оператором, я предполагаю, что ['row'] в конечном итоге будет идентификатором строки или чем-то подобным. Я бы порекомендовал вам использовать firebug или что-то подобное и использовать console.log(data), чтобы увидеть, что анализирует этот возвращаемый объект. - person Adam Benzan; 08.01.2010
comment
Я отредактировал свой исходный пост и добавил код, который я использую для возврата данных. Это показывает, как я заполняю данные. Пожалуйста, дайте мне знать, какие изменения мне нужно внести в существующий код. Спасибо. - person Devner; 08.01.2010
comment
Попробовал ваш обновленный код. Это не позволяет мне даже отправить и получить ответ, если я использую $.extend($('#form1').serialize(), { 'last_id':$('#table tr:last').attr(' id') }), оператор кажется правильным, но он не отправляет форму при использовании в сочетании с приведенным выше кодом. Однако, если я использую данные: $('#form1').serialize() и жестко закодирую значение для last_id (для тестирования) и удалю одну запись, то это действительно успешно доставит мне следующую запись. Но у этого метода есть ошибка, заключающаяся в том, что если я удаляю 2 или более записей, то вместо вывода соответствующего количества новых записей.продолжение.. - person Devner; 09.01.2010
comment
..продолжение) все данные новых записей отображаются в одной и той же строке, тогда как на самом деле должны были быть добавлены 2 (или столько, сколько удалено) строк. Обратите внимание, что значение last_id все еще жестко запрограммировано. Я гуглил и пытался найти docs.jquery.com, но я думаю, что моя наивность побеждает меня в этом. Надеюсь, вы сможете мне помочь. Цените многое. - person Devner; 09.01.2010
comment
Привет Адам, понял большую часть этого. Мне пришлось вызывать результаты в цикле while, а в текущем коде я этого не делаю. Так что это исправлено. Единственная часть, которая нуждается в исправлении, — это одна из неповторяющихся строк, т. е. если я удаляю 2 или более записей, то вместо вывода соответствующего количества новых записей данные всех новых записей отображаются в одной строке. Итак, если я удаляю 10 строк, то вместо создания 10 строк и заполнения их соответствующими данными создается 1 строка и заполняется данными из 10 строк. Надеюсь, я имею смысл. Я думаю, если мы сможем это исправить, мы будем в порядке. Спасибо. - person Devner; 09.01.2010