Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'utilise le plugin JQuery AjaxFileUpload (http://www.phpletter.com/Our-Projects/AjaxFileUpload) avec Zend. Lorsque je tente d'uploader un fichier j'obtiens une fenêtre avec ce message d'erreur:
SyntaxError: missing ; before statement
Ci-joint mon script provoquant l'upload au clique sur un bouton:
Code :
function ajaxFileUpload()
{
$.ajaxFileUpload({
type: "POST",
url:"/misc_send-transac/upload-file-csv",
secureuri:false,
fileElementId:'fileUpload',
dataType: 'json',
error:function(data, status, e){alert("--->"+e);},
success:function(data, status)
{
if(typeof(data.error) != 'undefined')
{
if(data.error != '')
{
alert(data.error);
}else
{
alert(data.msg);
}
}
}
}
);
return false;
}
Quelqu'un a une solution ou a déjà rencontré le problème? Le problème vient-il de Zend?
Merci d'avance
Hors ligne
Dans leur exemple, il n'y a pas de point-virgule après la parenthèse fermante de $.ajaxFileUpload. Essaye pour voir si ça ne vient pas de ça.
function ajaxFileUpload()
{
/* $("#loading")
.ajaxStart(function(){
$(this).show();
})
.ajaxComplete(function(){
$(this).hide();
});*/
$.ajaxFileUpload
(
{
url:'/contents/ajaxfileupload/doajaxfileupload.php',
secureuri:false,
fileElementId:'fileToUpload',
dataType: 'json',
beforeSend:function()
{
$("#loading").show();
},
complete:function()
{
$("#loading").hide();
},
success: function (data, status)
{
if(typeof(data.error) != 'undefined')
{
if(data.error != '')
{
alert(data.error);
}else
{
alert(data.msg);
}
}
},
error: function (data, status, e)
{
alert(e);
}
}
)
return false;
}
Hors ligne
Non ça ne change rien toujours le même message d'erreur.
J'avoue que j'ai beaucoup chercher sans résultat, j'ai beaucoup de mal à comprendre ce qu'il y a...
Hors ligne
Bonjour jonath88,
C'est une erreur javascript ou php ta syntax error ?
si c'est une erreur javascript, je ne vois pas d'erreur de syntaxe dans le code que tu as envoyé. Par contre dans alert("--->"+e); tu ne veux pas essayer de mettre alert("===".e);
J'ai juste un doute, des fois que tu sortes d'un commentaire ou du javascript à cause du ">" ou du "-->"...
A+, Philippe
PS : si c'est pas ça, dis nous si ça fait ça sous IE et FF, essaye de lancer ton code avec Firebug sous FF... là on manque un peu d'info pour diagnostiquer. Si t'as moyen de rendre ça public, donne nous une URL, ça simplifiera le diagnostique...
Hors ligne
Tu n'as que ca comme code javascript sur ta page ??
Hors ligne
Je ne peux pas rendre la page public (entreprise). Sinon j'ai essayé avec IE, j'ai également une alert qui s'affiche avec ce message: [object error].
Ensuite mon code (dans le premier post) n'accède pas aux fichier doajaxfileupload.php puisque l'erreur se trouve avant dans l'appel au script du plugin (AjaxFileUpload de JQuery) suivant (l'erreur se trouve en bas du code):
jQuery.extend({
createUploadIframe: function(id, uri)
{
//create frame
var frameId = 'jUploadFrame' + id;
if(window.ActiveXObject) {
var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
if(typeof uri== 'boolean'){
io.src = 'javascript:false';
}
else if(typeof uri== 'string'){
io.src = uri;
}
}
else {
var io = document.createElement('iframe');
io.id = frameId;
io.name = frameId;
}
io.style.position = 'absolute';
io.style.top = '-1000px';
io.style.left = '-1000px';
document.body.appendChild(io);
return io
},
createUploadForm: function(id, fileElementId)
{
//create form
var formId = 'jUploadForm' + id;
var fileId = 'jUploadFile' + id;
var form = $('<form action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
var oldElement = $('#' + fileElementId);
var newElement = $(oldElement).clone();
$(oldElement).attr('id', fileId);
$(oldElement).before(newElement);
$(oldElement).appendTo(form);
//set attributes
$(form).css('position', 'absolute');
$(form).css('top', '-1200px');
$(form).css('left', '-1200px');
$(form).appendTo('body');
return form;
},
ajaxFileUpload: function(s) {
// TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
s = jQuery.extend({}, jQuery.ajaxSettings, s);
var id = new Date().getTime()
var form = jQuery.createUploadForm(id, s.fileElementId);
var io = jQuery.createUploadIframe(id, s.secureuri);
var frameId = 'jUploadFrame' + id;
var formId = 'jUploadForm' + id;
// Watch for a new set of requests
if ( s.global && ! jQuery.active++ )
{
jQuery.event.trigger( "ajaxStart" );
}
var requestDone = false;
// Create the request object
var xml = {}
if ( s.global )
jQuery.event.trigger("ajaxSend", [xml, s]);
// Wait for a response to come back
var uploadCallback = function(isTimeout)
{
var io = document.getElementById(frameId);
try
{
if(io.contentWindow)
{
xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
}else if(io.contentDocument)
{
xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;
xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;
}
}catch(e)
{
jQuery.handleError(s, xml, null, e);
}
if ( xml || isTimeout == "timeout")
{
requestDone = true;
var status;
try {
status = isTimeout != "timeout" ? "success" : "error";
// Make sure that the request was successful or notmodified
if ( status != "error" )
{
// process the data (runs the xml through httpData regardless of callback)
//alert(xml+"---------"+s.dataType);
var data = jQuery.uploadHttpData( xml, s.dataType );
// If a local callback was specified, fire it and pass it the data
if ( s.success )
s.success( data, status );
// Fire the global callback
if( s.global )
jQuery.event.trigger( "ajaxSuccess", [xml, s] );
} else
jQuery.handleError(s, xml, status);
} catch(e)
{
status = "error";
jQuery.handleError(s, xml, status, e);
}
// The request was completed
if( s.global )
jQuery.event.trigger( "ajaxComplete", [xml, s] );
// Handle the global AJAX counter
if ( s.global && ! --jQuery.active )
jQuery.event.trigger( "ajaxStop" );
// Process result
if ( s.complete )
s.complete(xml, status);
jQuery(io).unbind()
setTimeout(function()
{ try
{
$(io).remove();
$(form).remove();
} catch(e)
{
jQuery.handleError(s, xml, null, e);
}
}, 100)
xml = null
}
}
// Timeout checker
if ( s.timeout > 0 )
{
setTimeout(function(){
// Check to see if the request is still happening
if( !requestDone ) uploadCallback( "timeout" );
}, s.timeout);
}
try
{
// var io = $('#' + frameId);
var form = $('#' + formId);
$(form).attr('action', s.url);
$(form).attr('method', 'POST');
$(form).attr('target', frameId);
if(form.encoding)
{
form.encoding = 'multipart/form-data';
}
else
{
form.enctype = 'multipart/form-data';
}
$(form).submit();
} catch(e)
{
jQuery.handleError(s, xml, null, e);
}
if(window.attachEvent){
document.getElementById(frameId).attachEvent('onload', uploadCallback);
}
else{
document.getElementById(frameId).addEventListener('load', uploadCallback, false);
}
return {abort: function () {}};
},
uploadHttpData: function( r, type ) {
var data = !type;
data = type == "xml" || data ? r.responseXML : r.responseText;
//L'erreur se trouve ici, le message SyntaxError: missing ; before statement est contenu dans r.responseText. L'erreur est une erreur JavaScript et Firebug ne détecte et n'affiche rien à ce moment.
// If the type is "script", eval it in global context
if ( type == "script" )
jQuery.globalEval( data );
// Get the JavaScript object, if JSON is used.
if ( type == "json" )
eval( "data = " + data );
// evaluate scripts within html
if ( type == "html" )
jQuery("<div>").html(data).evalScripts();
//alert($('param', data).each(function(){alert($(this).attr('value'));}));
return data;
}
})
Merci de votre aide
Hors ligne
Tu peux regarder dans l'onglet réseau de firebug quelle requête est passée à ce moment et éventuellement essayer la requête à la main?
Philippe
Hors ligne
Salut
@Philippe le caractère de concaténation est bien le "+" en js et non le point
sinon un truc que je ne comprends pas le r.responseText c'est le retour de php non ? Elle s'affiche où ton erreur ? dans la console js de FF ?
Hors ligne
philippe a écrit:
Tu peux regarder dans l'onglet réseau de firebug quelle requête est passée à ce moment et éventuellement essayer la requête à la main?
Philippe
Au clique sur le bouton Upload (qui appel la fonction ajaxFileUpload()), la requête dans l'onglet réseau est: POST doajaxfileupload.php, le fichier php appelé en AJAX.
Hors ligne
@jonath88: Tu peux nous envoyer le contenu de la requête et de la réponse POST ? (c'est aussi donné par firebug).
@grandlap: certes, je fais tt le temps l'erreur en JS
Philippe
Hors ligne
Sinon pour debugger essaye de mettre des alert('test'); a differents endroits de ton code, tu le mets tout en haut, tu regardes si il taffiche l'alert, si c'est le cas tu la decale en dessous etc ... jusqu'a retomber sur la bonne ligne ou ça bloque.
Oublie pas de faire F5 entre temps
Hors ligne
J'ai déjà fait le test avec les alert et mon erreur se trouve à la ligne:
eval( "data = " + data );
juste en dessous du commentaire vert que j'ai mis dans le code que j'ai joint dans un des posts (le dernier post avec du code).
Ensuite voici la requête retournée:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title></title><link href="/public/styles/default/general.css" media="screen" rel="stylesheet" type="text/css" /><script type="text/javascript" src="/public/scripts/jquery.js"></script>
<script type="text/javascript" src="/public/scripts/jqmodal.js"></script>
<script type="text/javascript" src="/public/scripts/scripts.js"></script> </head>
<body>
<div id="header"></div>
<div id="menu"></div>
<div class="clear"></div>
<h1></h1>
<div id="subnav"></div>
<div id="content">{error: 'No file was uploaded..',
msg: ''
}</div>
<div class="clear"></div>
<div id="footer"></div>
</body>
</html>
mais lorsque je je fais un alert($("#fileUpload").val()) j'obtiens bien le nom du fichier sélectionné pour l'upload.
Dernière modification par jonath88 (18-11-2008 14:34:49)
Hors ligne
Après plusieurs test je me suis aperçu que lorsque le plugin accédé au script PHP, il retournait $_FILES vide. J'ai donc déplacé mon script PHP du plugin dans mon controller SendTransacController.
Ci-dessous le script PHP du plugin:
public function fileUploadMethodeAction()
{
if($this->getRequest()->isXmlHttpRequest())
{
$error = "";
$msg = "";
$fileElementName = 'fileUpload';
if(!empty($_FILES[$fileElementName]['error']))
{
switch($_FILES[$fileElementName]['error'])
{
case '1':
$error = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
break;
case '2':
$error = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
break;
case '3':
$error = 'The uploaded file was only partially uploaded';
break;
case '4':
$error = 'No file was uploaded.';
break;
case '6':
$error = 'Missing a temporary folder';
break;
case '7':
$error = 'Failed to write file to disk';
break;
case '8':
$error = 'File upload stopped by extension';
break;
case '999':
default:
$error = 'No error code avaiable';
}
}elseif(empty($_FILES['fileUpload']['tmp_name']) || $_FILES['fileUpload']['tmp_name'] == 'none')
{
$error = 'No file was uploaded..';
}else
{
$msg .= " File Name: " . $_FILES['fileUpload']['name'] . ", ";
$msg .= " File Size: " . @filesize($_FILES['fileUpload']['tmp_name']);
//for security reason, we force to remove all uploaded file
@unlink($_FILES['fileUpload']);
}
echo "{";
echo "error: '" . $error . "',\n";
echo "msg: '" . $msg . "'\n";
echo "}";
}
}
Ci-dessous la fonction Init de mon controller:
public function init()
{
parent::init();
Zend_Loader::loadClass('forms_SendTransacForm');
Zend_Loader::loadClass('Partners');
$this->_oSendTransacOrder = new forms_SendTransacForm();
$this->ajaxable = array(
'header' => array('html'),
'index' => array('html', 'json'),
'patnerNameUpdate' => array('json')
);
if($this->getRequest()->isXmlHttpRequest())
{
$this->_helper->layout()->disableLayout();
$this->_helper->ajaxContext()->initContext('json');
$this->_helper->viewRenderer->setNoRender();
}
else
{
$this->view->title = "Send transac";
$this->view->jScriptStyle = "sendtransac";
$this->_oNavigation->setSubNav($this->getRequest()->getParam('parent'));
$this->view->subNavigation = $this->_oNavigation->renderSubNav();
$oResponse = $this->getResponse();
$oResponse->insert('header', $this->view->render('header.phtml'));
$oResponse->insert('menu', $this->view->render('menu.phtml'));
$oResponse->insert('subnav', $this->view->render('subnav.phtml'));
$oResponse->insert('footer', $this->view->render('footer.phtml'));
}
}
Lorsque j'effectue l'upload, la fonction réseau de Firebug me retourne ceci:
Invalid bind-variable position '?'
Je ne comprends pas trop.
Merci
Hors ligne
Si je comprends bien, le php te retourne du html ?
il serait plutôt censé te retourner du json non ?
S'il te retourne du html la fonction js eval ne comprends forcément pas ce que tu lui donnes à évaluer.
il faudrait que du côté controller tu désactives les layouts à mon avis (j'ai pas regardé tout en détail hein...)
dans ton action
$this->_helper->layout()->disableLayout();
a+
Hors ligne
grandlap a écrit:
Si je comprends bien, le php te retourne du html ?
il serait plutôt censé te retourner du json non ?
S'il te retourne du html la fonction js eval ne comprends forcément pas ce que tu lui donnes à évaluer.
il faudrait que du côté controller tu désactives les layouts à mon avis (j'ai pas regardé tout en détail hein...)
dans ton action
$this->_helper->layout()->disableLayout();
a+
Dans mon controller Zend (où se trouve ma méthode PHP que je souhaite appelé au travers de la fonction javascript), se trouve une fonction init:
public function init()
{
parent::init();
Zend_Loader::loadClass('forms_SendTransacForm');
Zend_Loader::loadClass('Partners');
$this->_oSendTransacOrder = new forms_SendTransacForm();
$this->ajaxable = array(
'header' => array('html'),
'index' => array('html', 'json'),
'patnerNameUpdate' => array('json')
);
if($this->getRequest()->isXmlHttpRequest())
{
$this->_helper->layout()->disableLayout();
$this->_helper->ajaxContext()->initContext('json');
$this->_helper->viewRenderer->setNoRender();
}
else
{
$this->view->title = "Send transac";
$this->view->jScriptStyle = "sendtransac";
$this->_oNavigation->setSubNav($this->getRequest()->getParam('parent'));
$this->view->subNavigation = $this->_oNavigation->renderSubNav();
$oResponse = $this->getResponse();
$oResponse->insert('header', $this->view->render('header.phtml'));
$oResponse->insert('menu', $this->view->render('menu.phtml'));
$oResponse->insert('subnav', $this->view->render('subnav.phtml'));
$oResponse->insert('footer', $this->view->render('footer.phtml'));
}
}
Dans cette fonction, lorsque la requête est de type HttpRequest je désactive bien mon layout:
$this->_helper->layout()->disableLayout();
Donc mon erreur est toujours présente.
Hors ligne
J'ai placé le script PHP du plugin dans un nouveau controller, j'ai donc instancié en conséquence la variable URL du JavaScript. Dans ma réponse de requête que j'obtiens avec Firebug, il y a un flux html qui contient en partie:
<div id="subnav"></div>
<div id="content">{error: 'No file was uploaded..',
Ce message correspondant à un des messages d'erreurs pouvant être retournés par le script PHP ci-dessous (le script du plugin):
$error = "";
$msg = "";
$fileElementName = 'fileUpload';
if(!empty($_FILES[$fileElementName]['error']))
{
switch($_FILES[$fileElementName]['error'])
{
case '1':
$error = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
break;
case '2':
$error = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
break;
case '3':
$error = 'The uploaded file was only partially uploaded';
break;
case '4':
$error = 'No file was uploaded.';
break;
case '6':
$error = 'Missing a temporary folder';
break;
case '7':
$error = 'Failed to write file to disk';
break;
case '8':
$error = 'File upload stopped by extension';
break;
case '999':
default:
$error = 'No error code avaiable';
}
}elseif(empty($_FILES['fileUpload']['tmp_name']) || $_FILES['fileUpload']['tmp_name'] == 'none')
{
$error = 'No file was uploaded..';
}else
{
$msg .= " File Name: " . $_FILES['fileUpload']['name'] . ", ";
$msg .= " File Size: " . @filesize($_FILES['fileUpload']['tmp_name']);
//for security reason, we force to remove all uploaded file
@unlink($_FILES['fileUpload']);
}
echo "{";
echo "error: '" . $error . "',\n";
echo "msg: '" . $msg . "'\n";
print_r($_FILES);
echo "}";
Après avoir effectué un print_r($_FILES), je me suis aperçu que ma variable $_FILES est vide mais je n'arrive pas à trouver pourquoi.
Hors ligne
oui, je suis allé un peu vite, mais il me semble tout de même que controller ne détecte pas que ta requête est de XmlHttpRequest
dans la doc (http://framework.zend.com/manual/fr/zen … quest.html) il est dit
10.4.2.4. Détecter les requêtes AJAX
Zend_Controller_Request_Http possède une méthode rudimentaire pour détecter les requêtes AJAX : isXmlHttpRequest(). Cette méthode parcourt les entêtes de la requête HTTP à la recherche de X-Requested-With ayant la valeur "XMLHttpRequest" ; si celui-ci est trouvé, la méthode retourne true.
Actuellement, on sait que cet entête est fourni par défaut par les bibliothèques JS suivantes :
* Prototype/Scriptaculous (et les librairies dérivées de Prototype)
* Yahoo! UI Library
* jQuery
* MochiKit
La plupart des librairies AJAX vous permettent d'envoyer vos propres entêtes de requête HTTP ; si votre librairie n'envoie pas cet entête, ajoutez le simplement afin d'être sûr que la méthode isXmlHttpRequest() fonctionne dans votre cas.
vérifie que tu as bien cela dans ta requête js sinon, la méthode isXmlHttpRequest ne détectera pas ton contexte d'exécution
Hors ligne
Donc je confirme, dans la réponse de l'entête de ma requête j'ai:
Host: e-financeplateform-dev.groupe-llp.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://e-financeplateform-dev.groupe-ll … /parent/13
Cookie: PHPSESSID=fa076b2883290681a364df3ee3fa9b13; ipex=0; first_connection=1227100520
Par contre (utilisant JQuery) est-ce que quelqu'un sait comment je peux ajouter dans l'en-tête le httpRequest?
J'ai cherché sur Google sans trop de résultat.
Dernière modification par jonath88 (19-11-2008 14:51:56)
Hors ligne
hmm.. Il manque qqchose
J'utilise JQuery et le ZF, et les entêtes sont rajoutés automatiquements par les fonctions JQuery, et mon ZF les détectes.
Hors ligne
Excusez moi, mais je suis un peu perdu là, on en est où
jonath88 tu peux nous faire un petit résumé stp ?
ou mieux, peux tu mettre à dispo ton script js, ta vue et ton controller dans un zip qu'on puisse regarder en local, parce que là, c'est un peu dur dur !
Hors ligne