В предыдущей статье мы рассмотрели предельно простой способ доступа к базе данных MySQL (редактирование таблицы без перезагрузки HTML страницы). Отправка данных на сервер производилась через статический элемент iframe, помещаемый программой рядом с тем местом, куда пользователь щёлкнул мышкой (рядом с редактируемой ячейкой).
Статический iframe был выбран нами в качестве транспорта для того, чтобы пользователь мог видеть реакцию сервера напрямую (удалось ли изменить данные MySQL, или HTTP-сервер вернул ошибку, и какую именно). Программа получилась действительно простой и прозрачной для пользователя. Но простота повлекла за собой и неизбежные недостатки (или просто неосуществлённые возможности):
Нетрудно видеть, что последние три пункта к способу транспорта прямого отношения не имеют, однако пресловутое засорение истории (о котором так много говорят любители Ajax'a) всё-таки заставляет делать iframe динамическим. Это значит, мы теряем «естественные» ответы сервера, и сообщать пользователю об успехе (или провале) операции придётся с помощью Javascript.
Рабочий пример получившейся системы можно протестировать на странице http://ir2.ru/static/tableedit2.htm. Функции Javascript, необходимые для работы, разместились в трёх файлах: http://ir2.ru/static/ir2.js (3.5K, общая библиотека), http://ir2.ru/static/tabsort.js (3.5K, сортировщик HTML-таблицы, необязательный элемент), http://ir2.ru/static/tableedit2.js (5.5K, редактор таблицы). На сервере данные, полученные от пользователя, обрабатывает небольшой (1.5K) скрипт http://ir2.ru/static/savecell2.php.
Страница HTML с таблицей для редактирования:
Вся остальная работа делается Javascript:
Самая сложная задача – выловить из временного элемента iframe ответ сервера. Она возникает как следствие из нашей генеральной установки считать Ajax лишней сущностью. Сложной является только часть задачи: при нормальных ответах сервера iframe получает нормально сгенерированную страницу, на которой запускается Javascript, передающий родительскому окну необходимую информацию – ничего сложного, всё стандартно!
А вот если, например, страница для iframe (savecell2.php) недоступна, сообщить об этом пользователю изнутри iframe не получится; надо будет из главного окна получить содержимое документа iframe. Тут тоже годится "штатная", отработанная нами в предыдущей версии Table Editor технология:
Проблема возникает даже не на уровне манипуляций с DOM, а на уровне идеологии: это хорошо известное уродство ИЕ – при получении ошибки сервера "404" выдавать свою собственную страницу ошибки (и вот к этой-то "своей" странице ИЕ не предоставляет программного доступа).
Из-за этого (весьма характерного для Микрософт) скотства как раз и возникает небольшая сложность, которую мы обходим с помощью таймера:
Хотя это наоборот – скорее, логика. Программа-редактор таблицы начинает работу по определённому действию пользователя – щелчку мышкой с удержанными клавишами Контрол и Альт. К чему должно быть привязано это событие? К какому объекту или элементу HTML?
Возможны два варианта:
1) привязать это событие к каждому элементу, который можно редактировать – с помощью функции, которая должна будет как-то обнаружить все такие элементы на странице;
2) привязать это событие просто ко всему документу (или открытому окну браузера) – тогда определять редактируемость элемента надо будет позже, в процессе обработки события.
Мы не рискнули (или поленились) заранее попытаться определить, куда пользователю можно щёлкать, а куда нет, и выбрали второй путь. То есть программа обработки щелчка запускается, куда бы пользователь ни щёлкнул. А значит, надо вовремя программу останавливать. Это делается на трёх разных этапах работы:
При использовании Ajax (xmlHTTPRequest) для отлавливания ошибок (и вообще сообщений) сервера существуют специальные методы, призванные вроде бы облегчить работу. Они и облегчают – на ошибке "404" ("Страница не найдена"), которую мы выбрали для тестирования как самую простую. Но в реальной жизни практически невероятно встретить такую ошибку в работе фоновых HTTP-запросов: организуя отправку через Javascript таких запросов, мы ведь сами указываем страницу-обработчик, которую сами же и помещаем на сервер.
Гораздо более вероятно примитивнейшее "зависание" HTTP-сервера или "тормоз" канала связи (или ещё какие-нибудь проблемы интернет-провайдера) – что во всех случаях будет выглядеть просто как отсутствие какого-либо ответа. И тогда "штатный" Ajax теряет все свои преимущества перед нашей простенькой конструкцией с iframe: и там, и тут проблема решается одинаково – с помощью таймера. У нас она в случае любых ошибок (т.е. при отсутствии HTTP-ответа "200 OK" в течение секунды) решается с помощью таймера, т.е. более единообразно и просто, чем в Ajax.
Ну, и ничего страшного не случится, если таймер сообщит пользователю об ошибке связи, а после этого отработает серверный скрипт и пришлёт сообщение "OK" – работа будет сделана, и пользователь узнает об этом.
http://dn.ir2.ru/ct/mmedit/ не открывается. скиньте исходники на облако какое нить пжст
GТ,
Эта статья описывает игрушку – заготовку к mysql-редактору (реализацию можно посмотреть на стр. http://dn.ir2.ru/ct/mmedit/). В рабочей версии тоже нет кнопки "удалить запись" :-).
Она ведь рассчитана на профессиональное использование, и мне совсем нетрудно ввести в поле запроса что-нибудь вроде "delete from `cache` where id=1".
Для заказчика, который умеет только править тексты, такие редакторы не годятся, там надо делать надёжные, кондовые формы редактирования, с валидацией, проверкой целостности данных, ну, и со ссылкой "Удалить", если надо...
Отличная вещь, лично мне она тонну времени сэкономит, даже просто глядя на нее. Но нет удаления записей ;((
Aden, там (ни в config.php, ни в configbase.php) НИГДЕ нет подключения к БД, так что исходные коды этих файлов вам не помогут, а скорее запутают (там не такой код, который можно всем показывать в качестве образца). На этом конкретном сайте авторизация происходит через php.ini.
Вам же лучше в своём коде использовать стандартную функцию php mysql_connect("localhost", "mysql_user", "mysql_password") с параметрами вашего сайта.
Использовал исходники. Не работает. Где в configbase нужно прописать подключение к базе? Можете выложить исходники программы?
Всё, исправил. Сафари тут ни при чём. Просто поменял систему скрытия объектов (сделал на classname вместо display:none) – в одном месте поменял, в другом не поменял, вот они и перестали скрываться.
А вообще это уже вчерашний день. Новейшая разработка (mysql-редактор): http://dn.ir2.ru/mmedit/
Ну, хорошо, что вообще комментарии отправляются. Самый-то плохой javascript при отправке происходит. Пойду смотреть, почему esc не работает. А вообще, не люблю я Сафари...
и когда тут у Вас оставляешь комент, непонятно куда он девается....добавился или нет 0_0
У меня тут вопрос такой, у меня операционна Макинтош на ноуте аппловскойм. Браузер сафари. Так вот, когда нажимаю редактировать все ок, но не могу выйти из редактирования! Т/е/ жму esc и ничего не происходит, сохраняет нормально но опят же не выходит из режима редактирования