developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 12 years ago

Closed 10 years ago

#539 closed new feature (wontfix)

Zones Ajax

Reported by: sylvain261 Owned by:
Priority: low Milestone:
Component: jelix Version: 1.0.3
Severity: normal Keywords:
Cc: Blocked By:
Blocking: Documentation needed: no
Hosting Provider: Php version:

Description

Il est souvent nécessaire de vouloir (re)charger le contenu d'une zone en Ajax.

Cela, à mon sens soulève 2 problématique :

  1. Jelix ne permet actuellement pas d'appeler une zone directement (pas de façon native). Il convient de passer par un controller qu'on aura créé exprès pour ça.

Pourquoi utiliser une zone et pas justement faire ca via un controller ? Dans 99% des cas la partie de page qu'on a besoin de charger en Ajax doit avoir été préchargé lors de la génération de la page et quand bien même c'est pas le cas, il est nécessaire d'implémenter une version de la page ne nécessitant pas javascript (pour l'accessibilité et le référencement). Ce que j'ai fait jusque là c'est d'utiliser une action générique qui permet de charger une zone dont on aura passé le sélecteur en paramètre. Ca donne qqch tel que :

	/**
	* Action générique permettant d'appeler une zone sans passer par un controlleur en particulier
	*
	* Utile pour le chargement en ajax(on a donc pas à créer une action pour chaque zone appellable en ajax)
	*/
	function getZone() {
        $rep = $this->getResponse('text');

		$zone = $this->param('zone');
		if (is_null($zone)) {
			throw new Exception('Paramètre zone requis');
		}
		$params = $GLOBALS['gJCoord']->request->params;


		$rep->content = jZone::get($zone, $params);

        return $rep;
	}

Cette approche est simple et pragmatique mais :

  • A mon avis c'est une problématique qui devrait être gérée par Jelix
  • Là, il faut bien avoir conscience que les plugins de coordinateur (et en particulier jAuth..) sont en quelque sorte squizzé dans la mesure où eux ils savent juste qu'elle est l'action appelée mais pas la zone (par exemple dans le cas de jAuth, il ne peut donc pas vérifier que l'utilisateur est habilité à appelé la zone en question) .
  1. La 2eme problématique est comment se simplifier la vie quand on veut faire de l'Ajax, car faire de l'Ajax c'est simple (vive jQuery), faire de l'Ajax débrayable pour les gens et les moteurs qui n'ont pas de javascript, ça c'est un peut plus chronophage.

Faire un lien Ajax en bonne et dut forme çà consiste à avoir :

  • un onClick gérant le chargement du bloc HTML via un appel Ajax à la zone concernée.
  • un href permettant de recharger la page dans laquelle on est mais avec le bloc HTML contenant ce qui aurait été chargé en Ajax si javascript été activé.
  • le href n'est pas suivi par les navigateurs car on termine le onClick par un return false.

Les principes que j'envisage pour implémenter ça :

  • L'action affichant la page reçoit des paramètres lui permettant de savoir quel contenu à afficher dans le bloc amené à être chargé en Ajax (avec une valeur par défaut correspondant au contenu initial). Ces paramètres permettent d'avoir autant d'URL et de version de la page que j'ai de version de mon block Ajax.
  • Le template fait appel à un plugin jAjaxLink qui génère un tag A avec le href adhoc et avec les attributs (non W3C..) suivants :
    • srcUrl : Url de l'action permettant le chargement Ajax du block
    • targetId : Id du block (en général on utilise des div) devant être mis à jour en ajax
  • On a du code JS qui implémente pour nous le onClick pour tous les tags A ayant un attribut srcURL

Ce joint a ce post les fichiers sur lesquels j'avais un peu travaillé à l'époque où j'avais tenté de me pencher sur cette problématique. C'est un peu bancale mais ca pourra tjs servir pour s'en inspirer.

Attachments (3)

function.jAjaxLink.php (2.3 KB) - added by sylvain261 12 years ago.
Plugin pour jtpl
ajax.classic.php (802 bytes) - added by sylvain261 12 years ago.
Controller avec l'action générique getZone
commun.js (767 bytes) - added by sylvain261 12 years ago.
JS implémentant le chargement Ajax des block

Download all attachments as: .zip

Change History (6)

Changed 12 years ago by sylvain261

Plugin pour jtpl

Changed 12 years ago by sylvain261

Controller avec l'action générique getZone

Changed 12 years ago by sylvain261

JS implémentant le chargement Ajax des block

comment:1 Changed 12 years ago by laurentj

Jelix ne permet actuellement pas d'appeler une zone directement (pas de façon native). Il convient de passer par un controller qu'on aura créé exprès pour ça.

Oui, c'est normal, c'est fait exprès. Une zone, est "une partie d'une réponse". Et non pas une réponse entière.

Là, il faut bien avoir conscience que les plugins de coordinateur (et en particulier jAuth..) sont en quelque sorte squizzé dans la mesure où eux ils savent juste qu'elle est l'action appelée mais pas la zone (par exemple dans le cas de jAuth, il ne peut donc pas vérifier que l'utilisateur est habilité à appelé la zone en question) .

Là il y a erreur de ta part. Je ne vois pas ce qui t'empêche d'appeller directement jAuth dans ta zone pour faire les vérifications nécessaires.

Dans l'idée générale, pourquoi pas. Mais ton code pose quand même un souci majeur de sécurité : on peut appeler n'importe quelle zone, même celles qui ne sont pas utilisées par l'application (fourni par des modules tiers par ex). Il faudrait donc avoir une liste des zones autorisées à être appelée par ce contrôleur, quelque part (dans la conf) (utiliser jauth ou jacl ne suffit pas, car si le développeur n'utilise pas ces deux trucs...)

comment:2 Changed 11 years ago by laurentj

  • Priority changed from normal to low

comment:3 Changed 10 years ago by laurentj

  • Resolution set to wontfix
  • Status changed from new to closed
Note: See TracTickets for help on using tickets.