RedOK,
Ну да, я типа обкурился и не подключил файл...
ну я потому что не разработчик страницы, откуда мне знать что там когда грузится...
function addProduct() { if (confirm('Добавить продукт?')) { $.ajax({ url:'ajax.php?mode=add_product', data: $('#addProduct').serialize(), type: 'POST', dataType: 'json', success: function(data) { if (data.result) { if (confirm('Продукт успешно добавлен. Добавить ещё один?')) { resetForm('addProduct'); $('#productName').focus(); } else { $('#message-success').removeClass('hidden'); } } else { if (data.need_redirection) { if (confirm(data.error)) { window.location.pathname = data.redirect_url; } } else { alert(data.error); } } } }) } }
Файл с функцией грузится раньше формы. И функция реально существует!
hosting_manager,
Скажу в защиту.
Хостер при чём всегда. Может знаете такое выражение - клиент всегда прав! А почему мы должны платить дополнительные деньги, искать хост у другого провайдера, ещё не факт, что там будет хорошо... а в это время ТП данного хостинга тупо забивает на клиентов. Не западный подход, однозначно...
Это не клиент должен бегать искать хосты. Если уж на то пошло, когда автобус сходит с линии, то что происходит? Водитель останавливается, договаривается с проезжающим автобусом чтобы тот подобрал пассажиров, и все пассажиры организованно идут в новый автобус. Он же не заставляет пассажиров искать новый вид транспорта. А почему здесь так? Вот хостер бы и нашёл другого провайдера, договорился бы с ним о специальной цене для его клиентов и всё, вопросов бы не было. Или на крайний случай, вернул бы всем деньги за период даунтайма и всё, опять все в расчёте.
В общем, накодил вот что:
Это вот функции, которые успешно работают на одном сайте:
function file_send() { sendForm("send", "/admin/includes/copyfile.php", callback); return false;}function photo_send() { sendForm("addProduct", "includes/load_photo.php", callbackPhoto); return false;}function sendForm(form, url, callfunc) { if (!document.createElement) return; if (typeof(form)=="string") form=document.getElementById(form); var frame=createIFrame(); var act = form.getAttribute('action'); frame.onSendComplete = function() {callfunc(form,act,getIFrameXML(frame));}; form.setAttribute('target', frame.id); form.setAttribute('action', url); form.submit();}function createIFrame() { var id = 'frameID'; var div = document.createElement('div'); div.innerHTML = "<iframe style=\"display:none;\" src=\"about:blank\" id=\""+id+"\" name=\""+id+"\" onload=\"sendComplete('"+id+"')\"></iframe>"; document.body.appendChild(div); return document.getElementById(id);}function sendComplete(id) { var iframe=document.getElementById(id); if (iframe.onSendComplete && typeof(iframe.onSendComplete) == 'function') iframe.onSendComplete();}function getIFrameXML(iframe) { var doc=iframe.contentDocument; if (!doc && iframe.contentWindow) doc=iframe.contentWindow.document; if (!doc) doc=window.frames[iframe.id].document; if (!doc) return null; if (doc.location=="about:blank") return null; if (doc.XMLDocument) doc=doc.XMLDocument; return doc;}function callback(form,act,doc) { form.setAttribute('action', act); form.removeAttribute('target'); alert(doc.body.innerHTML);}function callbackPhoto(form,act,doc){ form.setAttribute('action', act); form.removeAttribute('target'); //$('results').set('html', doc.body.innerHTML); //location.reload();}
далее сделал так:
(фрагмент кода)
<iframe name="upload_target" style="width:0;height:0;"></iframe> <div class="formcontent"> <form id="addProduct" name="addProduct" class="form-horizontal" target="upload_target">
Но остаются неясными два вопроса:
1. Откуда берётся файл load_photo.php? От какого корня считается этот путь?
2. Создал 2 файла load_photo.php в разных папках (авось какой-нибудь сработает!). с одинаковым содержанием:
print_r($_FILES);
с надеждой увидеть весь массив...
Форма просто даже не отрабатывает, а непонятно что делает... мне даже не удаётся по Firebug отследить, на какие файлы идёт запрос (если вообще куда-то идёт).---------- Добавлено 25.01.2013 в 14:11 ----------Не пойму, в чём я не догоняю....
Все те функции, указанные в этом посте - работают.
На форме установлен enctype=multipart/form-data
Файл-обработчик php вызывается! проверено...
При попытке вывести содержимое ответа (массив $_FILES) выводится просто пустой массив...
На всякий случай дублирую:
<iframe name="upload_target" style="width:0;height:0;"></iframe> <div class="formcontent"> <form id="addProduct" name="addProduct" class="form-horizontal" target="upload_target" enctype="multipart/form-data">
Callback-функция
function callbackPhoto(form,act,doc) { form.setAttribute('action', act); form.removeAttribute('target'); $('#result').html(doc.body.innerHTML); //$('results').set('html', doc.body.innerHTML); //location.reload(); }
php:
на выходе ТУПО пустой массив...
При том, что файлы ajax-запросом физически отправиться не могут!
если это не так, пример кода, иллюстрирующего ваши слова - в студию!
А что красота? По-вашему у меня форма не через iframe будет отправляться? Если так, то отправятся все поля, не только фото. Если нет, то как вы вообще видите отправку фото?
В чём "красота" я так и не понял)
<form method="post" target="iframeID" enctype="multipart/form-data">
так что ли? но тогда ВСЯ форма будет слаться в iframeID.
Ну я же не могу прочитать массив $_FILES аяксом )))) про iframe понятно, но будет ли это кроссбраузерно? И потом я читал про ифрейм, мне-то нужно чтобы всё скопом отправилось, а не по одному файлику.
Спасибо, всё работает )