2010-08-31 11 views
0

Je modifie un système existant qui utilise Smarty. Ce problème particulier est une pierre d'achoppement majeure car je ne peux pas trouver un moyen de contourner le problème.Barrière d'appel SmartY jQuery/Ajax

J'ai une grille de données, chaque enregistrement a une action qui appelle? Module = the_module & action = the_action.

Ma fonction de fonction correspondante the_module_the_action ($ postData, $ getData) est utilisée pour effectuer la requête particulière.

La requête pour ce module provient d'une requête jQuery $ .ajax ({}), simplement parce que je ne veux pas perdre les variables du formulaire de recherche. Donc en cas de succès, je redirigerai la page en utilisant document.location = 'index.php? Module = & action ='. C'est très bien car cela me permet de détecter que l'action a réussi tout en maintenant les filtres de recherche sur la grille.

Mais, j'ai un problème lorsque l'action de l'utilisateur échoue. La méthode the_module_the_action ($ postData, $ getData) renvoie echo 'succès'; exit() en cas de succès, mais en cas d'échec, il doit imprimer le modèle Smarty, c'est-à-dire les détails de l'enregistrement.

Je crois que le problème se produit en raison d'un appel via Ajax. Le modèle est en cours de traitement, mais comme il s'agit d'un appel effectué à l'aide d'Ajax, il n'est pas affiché.

Comment puis-je contourner ce problème?

Mise à jour: -

Ceci est ma fonction qui Ajax appelle:

public function module_action($post_data) { 
    $object=new Class((int)$post_data["id"]); 
    if($object->method()) { 
     echo "success"; 
     exit(); 
    } 
    else {    
     $this->assignToSmarty('_someSmartyVar', $someData); 
     $this->assignToSmarty('_data', $class->getData()); 
      echo "failed"; 
    } 
} 

L'Ajax utilisé pour appeler cela: -

$(document).ready(function() {   
    $(".revokeButton").click(function(){ 
     var selected=$(this).attr('id'); 
     var filterBu = $('#filter_bu').val(); 
     var filterJc = $('#filter_jc').val(); 
     if(confirm("Are you sure you want to r.....")) { 
      $.ajax({ 
       beforeSend: function() { }, 
       url: 'index.php?module=module&action=action', 
       type: 'POST', 
       data: ({ bid:selected }), 
       cache: false, 
       success: function(data, textStatus) { 
        if(data == 'success') { 
         success_message = 'success'; 
        } else if(data == 'failed') { 
         success_message = 'failed'; 
        } 
        document.location='index.php?module=module&message='+success_message+'&filter_bu='+filterBu+'&filter_jc='+filterJc; 
       } 
      }); 
     } 
    }); 
}); 

Le succès et l'échec sont faisant écho avec succès , mais les trucs smarty ne sont pas.

+0

utilisez-vous un rappel d'erreur dans votre jquery? – Anurag

+0

J'utilise juste le succès: function (data, textStatus) { if (data == 'succès') { \t success_message = 'revocation_success'; } else if (données == 'failed') { \t success_message = 'révocation_failed'; } document.location = 'index.php? Module = réservations & message =' + success_message + '; \t \t \t \t} –

+0

Cela me permet de détecter si la demande est réussie ou non. Je pense que le problème réside dans le fait que j'appelle une action dans Ajax qui ne permettra pas le rendu de Smarty. –

Répondre

1

Je vois deux problèmes. Tout d'abord, vous semblez avoir oublié l'appel de fonction smarty->display() dans la branche d'échec de la fonction module_action. En second lieu, vous avez écrit:

if(data == 'success') { 
    success_message = 'success'; 
} else if(data == 'failed') { 
    success_message = 'failed'; 
} 

Cette sortie sera toujours seulement success ou failure. Vous voulez probablement faire quelque chose de plus comme ceci:

if(data == 'success') { 
    success_message = 'success'; 
} else { 
    // if got here, 'data' doesn't contain "success!", so it must contain 
    // something else, likely error data. You could either just display 
    // data as it is or first do some sort of check to ensure that it 
    // does, in fact, contain error data, and then display it. 
    success_message = 'error!<br \>\n' + data; 
}