Работаем с формами в DoJo
В предыдущей статье про DoJo мы рассмотрели механизмы взаимодействия с php-скриптом на основе Ajax. Но там не была рассмотрена важная особенность – возможность делать submit любой существующей формы на страничке.
А зачем нам делать submit формы? Можно же просто сформировать некоторый GET-запрос вроде этого:
main.php?action=add&what=address&value=123
Дело в том, что у передачи формы скрипту есть преимущества по сравнению с простым GET-методом:
- сложно закодировать что угодно с помощью URL и передать скрипту (например, двоичные данные)
- нельзя передать динамично изменяющиеся параметры (из текстового поля например)
- нельзя передать файл (input type=file)
Сейчас мы с Вами научимся передавать форму нашему php-скрипту с помощью DoJo. Поставим перед собой цель: загрузить файл на сервер и при этом передать его короткое текстовое описание, которое сохраним в текстовом файле. При этом скрипт должен нам вернуть 1, если все ок (файл принят и сохранен), иначе – 0.
Напишем сначала php-скрипт (назовем его form.php):
form.php
<?
if (is_uploaded_file($_FILES['my_file']['tmp_name']) && $_FILES['my_file']['size'] > 0) {
$filename = basename($_FILES['my_file']['name']);
if (move_uploaded_file($_FILES['my_file']['tmp_name'], $filename)) {
// Save the file description
if (!empty($_REQUEST['desc'])) {
file_put_contents('desc_'.$filename.'.txt', $_REQUEST['desc']);
}
echo '1';
} else {
echo '0';
}
} else {
echo '0';
}
?>
Как видим, наш скрипт будет возвращать 1, если файл успешно сохранен на сервере. При этом описание файла будет загружено в текстовый файл. Теперь напишем код html-страницы, откуда будем загружать наш файл:
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Dojo Form Demo</title>
<script type="text/javascript" src="./dojo/dojo.js" djConfig="parseOnLoad:true, isDebug:false"></script>
<script type="text/javascript">
dojo.require("dojo.io.iframe");
</script>
</head>
<body>
<form id="my_form" method="post" enctype="multipart/form-data">
Browse any file: <input type="file" name="my_file" /><br />
Enter a description: <input type="text" name="desc" /><br />
<br />
<input type="button" id="my_button" value="Upload" />
</form>
<br />
<b>Status:</b> <span id="my_status"></span>
<script type="text/javascript">
dojo.addOnLoad(function() {
var my_button = dojo.byId("my_button");
dojo.connect(my_button, "onclick", function() {
dojo.io.iframe.send({
url: "form.php",
handleAs: "html",
form: "my_form",
load: function(data) {
if (data.body.innerHTML == '1') {
dojo.byId("my_status").innerHTML = 'Success!';
} else {
dojo.byId("my_status").innerHTML = 'Fail!';
}
},
error: function(error) {
dojo.byId("my_status").innerHTML = error;
}
});
});
});
</script>
</body>
</html>
При успешной загрузке файла в поле «Status» будет выведено слово «Success!». Иначе – «Fail!».
На самом деле загрузка файла на сервер с помощью DoJo – целая проблема. Мне потребовалось около двух часов, чтобы разобраться, почему файл не загружался с помощью dojo.io.iframe.send (у меня не сразу все заработало). А изначально я вообще пытался использовать dojo.xhrPost, чтобы передать данные в php-скрипт из формы. Оказывается, с помощью dojo.xhrGet, dojo.xhrPost вообще нельзя передавать файлы. И даже не пытайтесь это сделать (но просто форму без файла передавать можно).
Обратите внимание на строчку
dojo.require(“dojo.io.iframe”);
Здесь мы использовали расширение io.iframe для Dojo. Чтобы представленный пример работал, нужно, чтобы на одном уровне с dojo.js находилась папка io, в которой лежат script.js и iframe.js.
Также параметр handleAs должен обязательно быть равен “html”.
На этом все. Пост довольно небольшой, но раскрывает решение проблемы передачи файла через форму с помощью Dojo 1.0. Судя по многочисленным сообщениям в программерских форумах, с этой проблемой столкнулось большое кол-во программеров, использующих DoJo.
Пример к статье можно скачать здесь.
Удачи!




Сентябрь 10th, 2008
Как по мне – тема раскрыта четко, спасибо за пост!
Сентябрь 19th, 2008
Хотелось бы увидеть статейку про то как сделать голосование на AJAX
Спс за сайт!
Сентябрь 19th, 2008
2 dobs: не за что
В скором времени обязательно напишу про голосования
Октябрь 7th, 2008
очень хотелось бы увидеть статейку по ДнД в дожо
что-то никак не могу освоить, как мне с помощь ДнД дать возможность сортировать список.. возможность дать могу, но как мне это все передать серверу чтобы он мог в соответствии с уже отсортированым списком расставил все в нужном порядке в таблице. Надеюсь novice ты читаешь старые комменты
Октябрь 8th, 2008
2 spry: я полагаю, ты имеешь в виду под словом “таблица” таблицу базы данных (сохранение полученного порядка в базе)?
Октябрь 8th, 2008
да! фактически у меня плейлист.. и мне нужно иногда сортировать песенки т.е. менять порядок их воспроизведения. для этого у меня в таблице некое поле order.. и мне надо его менять в соотвествии с положением в который я могу сортировать с помощью dojo.dnd.Source
Октябрь 8th, 2008
Понятно. Надо будет рассмотреть эту фичу в Dojo
Декабрь 9th, 2008
Спасибо за статью, меня интересуют редактируемые таблицы, почемуто не получается.
Февраль 9th, 2010
Этот катет не прокатит
Такой фокус не работает в Google Chrome
Your text to link…
Здесь предлагают решение проблемы. Но мне пока не удалось заставить этот скрипт работать как надо. Проблема в том, что iframe требует некий blank.html. Подключаю его куда сказана и как сказано, но результат : “Теже яйца, только в профиль.”
Ноябрь 12th, 2011
Как создать dojo-форму и разместить в ней контролы чистым JS?
Февраль 16th, 2012
Неправда на счет того что
handleAs: “html” и это обязательно….
Вовсе не так… без проблем может быть и json, например,
Просто надо определенным образом готовить формат ответа от сервера, обертывая его в html страницу, где сам ответ будет в первом дочернем дом элементе…
т.е например если нужно вернуть JSON, то сервер должен возвращать страницу вида:
isLoaded = true;{“Result”:1, “Other”:”Другое значение”}
Т.е сам JSON как видно находится между тегами textarea. Вот такая нетривиальная штука.
Февраль 16th, 2012
Неправда на счет того что
handleAs: “html” и это обязательно….
Вовсе не так… без проблем может быть и json, например,
Просто надо определенным образом готовить формат ответа от сервера, обертывая его в html страницу, где сам ответ будет в первом дочернем дом элементе…
т.е например если нужно вернуть JSON, то сервер должен возвращать страницу вида(специально заменяю теги скобками, чтобы можно было отправить комментарий):
[html][head][script]isLoaded = true;[/script][/head][body][textarea]{“Result”:1, “Other”:”Другое значение”}[/textarea][/body][/html]
Т.е сам JSON как видно находится между тегами textarea. Вот такая нетривиальная штука.