Ajax редактирование таблиц и табличных данных

Ссылка на исходники обновлена 25.06.2020 (пока без комментариев)

По просьбам трудящихся — исходники. В архиве .sql и .php — всё в одном, и вывод и обработчик, всё с подробными комментариями.


 

Привет тебе дорогой читатель, сегодня мы немного поговорим об инлайновом редактировании данных в таблицах без перезагрузки страницы (inline edit ajax).

Как я уже сказал, передо мной встала задача редактирования данных в таблицах. После непродолжительных поисков нашел подходящий вариант, который не использует дополнительные плагины и библиотеки кроме самой jQuery. А таких на самом деле вагон и целая тележка и у каждого есть свои преимущества и недостатки. Один из самых неплохих по функционалу — jqGrid, но о нём мы поговорим в следующий раз.

Представим, что наши данные, по умолчанию, хранятся в базе. В моём примере это будет MySql, обновляться они будут с помощью JS и PHP по технологии AJAX.

AJAX, Ajax (ˈeɪdʒæks, от англ. Asynchronous Javascript and XML — «асинхронный JavaScript и XML») — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате, при обновлении данных веб-страница не перезагружается полностью, и веб-приложения становятся быстрее и удобнее.

Источник: Википедия

Итак обсудим то, что у нас имеется, и то, что мы хотим получит в итоге

Исходные данные:

ТаблицЫ с данными, которые генерируются на PHP, запросом из нашей базы данных.
Допустим у нас есть две таблицы: клиенты (clients) и сотрудники (workers)
Поля наших таблиц на самом деле неважно какие, но возьмём для примера такие:

  • id — первичный уникальный ключ с авто инкрементом.
  • firstname — имя сотрудника или клиента
  • lastname — фамилия сотрудника или клиента
  • phone — телефон сотрудника или клиента

Необходимый результат:

Возможность редактирования всех полей всех таблиц без перезагрузки страницы.

Что нам для этого потребуется?

  • jquery.js — jQuery javascript framework
  • Заполненные таблицы в БД
  • Азы PHP + JS
  • Смекалка

Приступим к выполнению нашей задачи

Первым делом подключаем необходимую библиотеку (jQuery) внутри тегов <head></head>. Я обычно использую самую последнюю версию, чтобы поддерживать актуальность знаний о возможностях этой чудно библиотеки и подключаю её минифицированную версию из репозитория Google Hosted Library. На момент написания статьи актуальная версия 1.9.1, её и подключаем.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>

Далее присваиваем нашей таблице уникальный идентификатор id, который соответствует названию таблицы в базе (это важно!).
Выводим все строки циклом и присваиваем строкам класс — edit, класс с названием столбца в БД и числовой класс с идентификатором строки в БД.

</pre>
<table id="clients">
<tbody>
<tr>
<th>Имя</th>
<th>Фамилия</th>
<th>Телефон</th>
</tr>
<!--Эта часть выводится с помощью php -->
<tr>
<td class="edit firstname '.$rows['id'].'">'.$rows['firstname'].'</td>
<td class="edit lastname '.$rows['id'].'">'.$rows['lastname'].'</td>
<td class="edit phone '.$rows['id'].'">'.$rows['phone'].'</td>
</tr>
</tbody>
</table>
<pre>

Далее нам необходим скрипт, который позволит редактировать данные в таблице. Как он работает, я опишу комментариями к каждой строке ниже в коде

//при нажатии на ячейку таблицы с классом edit
$('td.edit').click(function(){
//находим input внутри элемента с классом ajax и вставляем вместо input его значение
$('.ajax').html($('.ajax input').val());
//удаляем все классы ajax
$('.ajax').removeClass('ajax');
//Нажатой ячейке присваиваем класс ajax
$(this).addClass('ajax');
//внутри ячейки создаём input и вставляем текст из ячейки в него
$(this).html('<input id="editbox" size="'+ $(this).text().length+'" type="text" value="' + $(this).text() + '" />');
//устанавливаем фокус на созданном элементе
$('#editbox').focus();
});

Итак форма для редактирования текста у нас появилась, что же мы с ней будем делать дальше?
Теперь нам необходимо сохранять введенные данные при каком то событии, я приведу пример сохранения данных при нажатии Enter.

//определяем нажатие кнопки на клавиатуре
$('td.edit').keydown(function(event){
//получаем значение класса и разбиваем на массив
//в итоге получаем такой массив - arr[0] = edit, arr[1] = наименование столбца, arr[2] = id строки
arr = $(this).attr('class').split( " " );
//проверяем какая была нажата клавиша и если была нажата клавиша Enter (код 13)
   if(event.which == 13)
   {
//получаем наименование таблицы, в которую будем вносить изменения
var table = $('table').attr('id');
//выполняем ajax запрос методом POST
 $.ajax({ type: "POST",
//в файл update_cell.php
 url:"update_cell.php",
//создаём строку для отправки запроса
//value = введенное значение
//id = номер строки
//field = название столбца
//table = собственно название таблицы
 data: "value="+$('.ajax input').val()+"&id="+arr[2]+"&field="+arr[1]+"&table="+table,
//при удачном выполнении скрипта, производим действия
 success: function(data){
//находим input внутри элемента с классом ajax и вставляем вместо input его значение
 $('.ajax').html($('.ajax input').val());
//удаялем класс ajax
 $('.ajax').removeClass('ajax');
 }});
 }});

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

$('#editbox').live('blur',function(){
$('.ajax').html($('.ajax input').val());
$('.ajax').removeClass('ajax');
});

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

Если кому нужны будут полные исходники моего варианта скрипта — пишите в коменты.

Дополнение №1

В версии jQuery 1.9.1 отключен метод .live. Вместо него нужно использовать метод .on, сравните синтаксис сами:

$(document).on('blur', '#editbox', function(){
$('.ajax').html($('.ajax input').val());
$('.ajax').removeClass('ajax');
});

По материалам http://www.iwebux.com

69 комментариев

  1. Mihail says: -

    Подскажите, что нужно изменить если у меня id а Number?

  2. Dmitriy says: -

    Скачал исходники, ввёл свои данные, прочитал предыдущие комментарии и внёс необходимые изменения. Данные из базы выводятся, редактировать ячейки можно, но при обновлении страницы введённые данные исчезают. Значит в базу изменения не попали? В чём может быть дело? Необходимо производить какие действия с файлом update_cell.php? Или достаточно его наличия? Помогите, пожалуйста!

  3. Grangel says: -

    Спасибо тем кто дает исходники

  4. Aleks says: -

    Не могли бы вы выслать мне исходники по корректировке БД. Как раз этим сейчас занимаюсь. Благодарю.

  5. Roman says: -

    И мне пожалуйста, очень бы не помешали

  6. Dmitry says: -

    Добрый день!
    спасибо за обучалку
    данные из БД вывел
    а дальше затупаю
    покажите исходник пожалуйста

  7. Katrin says: -

    Можно исходники плиз

  8. Alex says: -

    Спасибо за статтю!!
    Но можно повторно дать исходники, сcылка недоступна

  9. Sofiya says: -

    Добрый день! Спасибо за информацию, очень информативно даже для чайников в js.
    Останавливаюсь на моменте добавления в базу, можно исходники, пожалуйста.

  10. оптик says: -

    исходники в студию, ссылка не работает

  11. Sergey says: -

    Здравствуйте. Можно ссылку на исходник?

  12. alexey says: -

    Спасибо большое!

  13. Здравствуйте, если ещё актуально, не могли бы вы выслать исходники данного решения, очень был бы благодарен.

  14. Quato says: -

    Ссылку восстановил, можете скачать на странице примера.

  15. Добрый день. Можно исходники получить?
    [email protected]

  16. Quato says: -

    По ссылке в статье исходники доступны для скачивания

  17. ihor says: -

    Доброе время суток!
    Спасибо за пример.
    Все работает.
    Вопрос: а как сделать чтобы при нажатии ЛКМ значение инпута выделялось?
    Что бы сразу можно было ввести новое значение вместо старого, а не — сначала удаляем , а потом вводим новое значение.
    С уважением.

  18. Класс!
    Но можно исходник для вставки данных в базу тоже получить?

  19. Quato says: -

    В архиве ведь и .sql файл присутствует.

Leave A Reply