Le problème

Utiliser de l'ajax sur un site en eZ Publish c'est être confronté à un problème: "par quoi commence mon URL?"

Imaginons un site sous eZ Publish comportant deux siteaccess: monsite.com et admin.monsite.com.

Imaginons maintenant que vous souhaitiez mettre en place un module du style /ajax/json prévu pour n'être appelé que via javascript. Voici un exemple de code pour jQuery (nous partirons du principe que '$' correspond bien à 'jQuery' dans les espaces de nom) :

$.ajax({
  url: "/ajax/json",
  success: function(){console.log('ok')},
  error: function(){console.error('ko')}
})

Seulement voilà... Que se passe-t-il si l'on souhaite pour une raison ou pour une autre passer les siteaccess via l'url ?

monsite.com => monsite.com/plain_site
admin.monsite.com => monsite.com/plain_site_admin

L'url à appeler n'est plus /ajax/json mais /plain_site/ajax/json ou /plain_site_admin/ajax/json en fonction du siteaccess utilisé.

La solution

L'extension ezjscore va nous permettre de régler ce petit souci très simplement. Lors de l'import des scripts avec l'opérateur ezscript il suffit d'ajouter ezjsc::jqueryio :

<html>
  <head>
    ...
    {ezscript(array(
      'ezjsc::jquery',
      'ezjsc::jqueryio',
      'mon_script.js'))}
    ...
  <head>
  ...

Attention! ezjsc::foo se traduit par un appel à la fonction ezjscServerFunctionsJs::foo() et ne prend pas de '.js' à la fin. Cela permet d'avoir un javascript dynamique. Alors que 'mon_script.js' indique qu'il faut chercher un fichier statique du même nom.

Le fait d'ajouter ezjsc::jquery charge juste le bon fichier jquery.js en fonction des settings mais ajouter ezjsc::jqueryio va nous être bien plus utile en définissant la variable $.ez.root_url qui va contenir la racine à partir de laquelle appeler le module.

Après modification, le code précédent devient :

$.ajax({
  url: $.ez.root_url + "ajax/json",
  success: function(){console.log('ok')},
  error: function(){console.error('ko')}
})

Conclusion

Vous savez maintenant comment faire de l'ajax avec eZ Publish sans vous soucier du mode de gestion des siteaccess. Cependant, pour un usage courant et simplifié vous pouvez passer par /ezjscore/call et utiliser la fonction $.ez() telle que décrite dans le tutoriel AJAX (jQuery) + eZ Publish: Demystified!