|
|
|
|
<?php
//если форма отправлена и нет ошибок, обрабатываем ее
if (isset($_POST['send'])){
if(!$error){
$img_alt = isset($_POST['img_alt']) ? $_POST['img_alt'] : 0;
$mod = isset($_POST['modul']) ? $_POST['modul'] : 0;
$page = isset($_POST['page']) ? $_POST['page'] : 0;
$menu = isset($_POST['menu']) ? $_POST['menu'] : 0;
if(!$mod) $error = 5;
if(!$page) $error = 6;
//вызов функции загрузки текста и картинок, создание уменьшенной копии
echo upload($mod,$page, $img_alt,$menu);
}else{
//если есть ошибки, формируем массив ошибок
$outerror = "";
switch ($error){
case 1: $outerror .= "<div class='d_foto' id='d_foto'>Файл картинки не удалось загрузить<br></div>";
break;
case 2: $outerror .= "<div class='d_text' id='d_text'>Текстовый файл не удалось загрузить<br></div>";
break;
//другие случаи ошибок
}
}
}
if (!isset($_POST['send']) || $error){
//выводим форму, напротив каждого поля формы - ошибка если есть
include("upload_img.php");
//выводим ошибки, связанные с загрузкой файлов
print $outerror;
}
?>
|
В файле формы прописываем место вывода ошибок:
<div id="father">
<div id="d_text"></div>
<div id="d_foto"></div>
<div id="d_modul"></div>
<div id="d_page"></div>
|
Делаем стили, чтобы напротив поля формы выводилась ошибка, если она есть:
<style>
#father {position: relative;}
#d_text, #d_foto, #d_modul, #d_page {
position: absolute;
left: 270 px;
}
#d_text {top: 35px;}
#d_foto {top: 70px;}
#d_modul {top: 234px;}
#d_page {top: 275px;}
</style>
|
Ошибки не выводятся. Что не так?
Все ошибки условно делятся на две группы: те, которые связаны с формой и те, которые связаны с загрузкой файлов. Те, что связаны с формой, должны выводиться напротив соотв. полей, а ошибки загрузки хотелось бы вывести перед формой. | |
|
|
|
|
|
|
|
для: Лена
(28.11.2008 в 00:02)
| | Ммм, а где же определяется $error? | |
|
|
|
|
 5.4 Кб |
|
|
для: BinLaden
(28.11.2008 в 00:09)
| | $error определяется в 115 строке (см. аттач) | |
|
|
|
|
|
|
|
для: Лена
(28.11.2008 в 00:02)
| | Вы не внимательно прочитали пример, а в нем описывалась ситуация, когда поле может иметь несколько ошибок. Поэтому в сообщения добавлялся разделитель <br>. У вас одна ошибка на поле, поэтому он совсем не нужен.
Форма у вас выводится сама по себе (include("upload_img.php")), а ошибки сами по себе (print $outerror), а ведь в примере и форма, и элементы DIV ошибок принадлежат одному родителю - элементу DIV id="father".
Что-то у вас несостыковка получается. Нужно, чтобы $outerror получал и обрабатывал файл upload_img.php, и print $outerror совсем не нужен.
PS. В вашем случае можно обойтись без div и стилей позиционирования. Два поля по одной ошибке в каждом, это таблица 2х2, в правых ячейках которой будут отображаться ошибки (при наличии), при этом $outerror отдавать в файл upload_img.php лучше массивом.
PPS. Ваш код никак не сможет передать пользователю ошибки для двух полей, так как ее тип определяется переменной $error, которая может иметь только одно значение. Следовательно, если пользователь допустил ошибки в двух полях формы, то он увидит только второе сообщение. | |
|
|
|
|
 2.7 Кб |
|
|
для: sim5
(28.11.2008 в 06:42)
| | У меня действительно на поле идет одна ошибка.
Но кроме ошибок заполнения формы у меня есть ошибки, связанные с загрузкой файлов. Вот поэтому я и делаю. так: ошибки, связанные с заполнением формы, я вывожу в самой форме в DIV id="father":
<div id="father">
<div id="d_text"></div>
<div id="d_foto"></div>
<div id="d_modul"></div>
<div id="d_page"></div>
//вот здесь выводятся все поля формы
</div>
|
а ошибки, связанные с загрузкой файлов, я вывожу уже в файле, который загружает данные формы в папки и базу.
В форме у меня не два поля - четыре, просто код свой я сократила, форму прикрепляю.
У меня же был вывод ошибок отдельно. По каждой ошибке - отдельный вывод, тогда ясно было видно, что относится к форме, а что к загрузке файлов, вы же сказали выводить массивом. Вывожу. Только теперь не могу разобраться. Если все ошибки - один массив, как же их разграничить, какие относятся к ошибкам формы, а какие - к ошибкам, связаным с загрузкой файлов?
От абсолютного позиционирования, наверное, откажусь. Лучше действительно таблицей выводить.
>PPS. Ваш код никак не сможет передать пользователю ошибки для двух полей,
Вот это я вообще не поняла. | |
|
|
|
|
|
|
|
для: Лена
(28.11.2008 в 10:38)
| |
if(!$mod) $error = 5;
if(!$page) $error = 6;
|
То есть, если у вас идет проверка четырех полей (кроме этих двух), то значение переменной $error постоянно переопределяется, и если все поля имеют ошибки, то эта переменная последовательно примет все эти значения, например, от 1 до 4. Но в итоге она будет иметь не четыре состояния, а одно! То есть пользователю будет передано сообщение о последней обнаруженной ошибке. Case извлекет номер ошибки, и выдаст соответствующее сообщение. Понятно почему?
Перед проверкой формы определите переменную ошибок, например: $error = array(). Далее, во время проверки полей, если есть ошибка в поле text, добавляем этому массиву сообщение:
$error['text'] = "Error text!";
Есть ошибка в поле page, добавляем:
$error['page'] = "Error page!";
И так для всех. Теперь, передав этот массив ошибок в скрипт вывода формы, не сложно будет вывести ошибки в нужном месте по ключам.
В примере главное не суть позиционирования, а определение ошибок и передача их пользователю. А как их отобразить, это уже дело второе. Например, у вас во время загрузки файла, например, изображения, может возникать не одна ошибка, а несколько. Например, превышение лимита по размеру, превышение лимита по разрешению, неверный тип файла, и последнее, что файл не загружен. Это 4 ошибки. Если определена первая из них, как вы поступите - вернете пользователю фому с ошибкой? Определили вторую, опять возврат? Ошибки можно проверять комплексно, но по ранжиру. Например, нет необходимости выдавать ошибки о размере и разрешении, если тип файла не соответствует. Нет смысла говорить пользователю, что длина выбранного логина или пароля менее 4 символов, если поле вообще не заполнено, и т.п.. Ну это, думаю, вам понятно. | |
|
|
|
|
|
|
|
для: sim5
(28.11.2008 в 11:18)
| | >Понятно почему?
Понятно.
В обработчике определяю ошибки:
<?php
$error = array();
//если форма отправлена и нет ошибок, обрабатываем ее
if (isset($_POST['send'])){
$img_alt = isset($_POST['img_alt']) ? $_POST['img_alt'] : 0;
$mod = isset($_POST['modul']) ? $_POST['modul'] : 0;
$page = isset($_POST['page']) ? $_POST['page'] : 0;
$menu = isset($_POST['menu']) ? $_POST['menu'] : 0;
$max_img_size = 20000000;
if(!$mod) $error['d_modul'] = "<div class='error'>Вы не выбрали нужную папку!</div>";
if(!$page) $error['d_page'] = "<div class='error'>Выберите страницу!</div>";
//вызов функции загрузки текста и картинок, создание уменьшенной копии
echo upload($mod,$page, $img_alt,$menu); //в функции в соответствующих местах тоже определяю ошибки загрузки файлов
}
if (!isset($_POST['send']) || $error){
//форма
include("upload_img.php");
}
?>
|
В форме вывожу их вот так(привожу пример одного из полей):
<tr>
<td>
Выбрать текст, к которому относится фото:<br>
<input type='file' name='text'><br>
</td>
<td>
<?php print $error['text'];?>
</td>
</tr>
|
| |
|
|
|
|
|
|
|
для: Лена
(28.11.2008 в 14:48)
| | Ну если выводить в ячейку таблицы, то div не к чему, ячейка и без них выведет, а стили можно и ячейке указать.
$max_img_size = 20000000. 2 МБ (что по умолчанию на хосте), это будет не 20000000 байт. | |
|
|
|
|
|
|
|
для: Лена
(28.11.2008 в 00:02)
| | юзайте jquery validator и будет вам счастье :) | |
|
|
|
|
|
|
|
для: devzorg
(29.11.2008 в 01:15)
| | При загрузке изображений, от jquery validator проку нет. | |
|
|
|
|
|
|
|
для: sim5
(29.11.2008 в 04:22)
| | Полностью разделяю. От него имхо вообще проку мало. Все тоже самое можно сделать намного легче. Таскать такой груз из-за лени написать пары собственных строчек, какое же это счастье? | |
|
|
|
|