[spip-dev] Calcul mathématique dans article

Bonjour à tous les développeurs

Je poste sur cette liste car je pense que mon besoin nécessite un développement et je sollicite votre avis de développeur sur le "comment faire".

Je souhaite réaliser des calculs à partir de données stockées par FORMIDABLE.
Les calculs peuvent être faits à partir de données provenant de plusieurs formulaires répartis dans plusieurs articles.

Par exemple :
- dans un article A, un formulaire me demande une longueur
- dans un article B, un autre formulaire me demande une largeur
- dans un article C, je veux afficher la surface (=longueur x largeur).

Les données sont stockées dans la bdd formidable et sont liées à chaque visiteur connecté. OK.
Je sais déjà comment récupérer les données dans la bdd. J'ai fait un modèle pour cela.

Idéalement, je souhaite déclarer les données et les calculs correspondant dans le corps de l'article.
J'avais pensé à faire cela sous forme de modèle :
<calcul1|retour = surface|traitement = $formA[longueur] * $formB[largeur]>

La partie "traitement" serait simplement du PHP.

Comment feriez-vous ?

Bonjour

Pas de réponse.
Ai-je bien formulé ma demande ?
Suis-je assez clair ?

Je ré-essaye avec des questions plus précises :

  • Y’a t’il des précautions particulières pour insérer du code PHP dans un modèle ?
  • Il me semble que SPIP utilise des variables de session. Peut-on lire/créer des var. de sessions SPIP dans un modèle ?

MERCI pour votre aide.

Si j’ai bien compris, ton appel de modèle serait de la forme : <calcul1|retour = surface|traitement = $formA[longueur] * $formB[largeur]>

#ENV{retour} vas dès lors contenir du texte.
Tu peux créer un filtre perso quu tu appliquerais ainsi : [(#ENV{retour}|calculer)]

avec une fonction filtre_calculer_dist($texte) qui fonctionnerait ainsi :

tu utilises des expression régulères pour remplacer $formA[longueur] par sa valeur, etc.

Tu obtiendras ainsi une chaine du type “4*6” que tu pourras ensuite passer à la fonction eval pour obtenir le résultat attendu et le retourner.

A toi de voir qu’elle serait la syntaxe la plus simple à utiliser dans ‘retour’. Peut-être que quelque chose comme @nomform:champ@ serait plus simple.

Cordialement

Joseph

Attention tout de même, avec eval() : à ce que personne ne vienne saisir dans un forum :
< calcul1|retour = surface|traitement = sql_delete(’*’, ‘spip_articles’) >

– Fil

Merci Joseph

J’avais aussi pensé à la solution du filtre. Mais cela s’appliquerait à tous mes sites qui utilisent le même squelette. Je pensais au modèle car cela me permettrait de le faire en plugin et donc ne l’activer que pour les sites que je souhaite.

En plus, je voudrais que le calcul soit fait systématiquement et non qu’il soit mis en cache.
Car le visiteur peut modifier les données du formulaire FORMIDABLE à tout moment et donc il faut recalculer.
Si je mets du PHP dans le modèle, est-ce le code ou le résultat qui est mis en cache ?
Si je fais avec un filtre, c’est le résultat qui sera mis en cache, non ?

Pour le reste, tu confirmes ce que j’intuitais et je te remercie.

Salut,

Merci Joseph

J'avais aussi pensé à la solution du filtre. Mais cela s'appliquerait à
tous mes sites qui utilisent le même squelette. Je pensais au modèle car
cela me permettrait de le faire en plugin et donc ne l'activer que pour
les sites que je souhaite.

Il suffit de coller ce modèle et le filtre associé dans un plugin distinct.

En plus, je voudrais que le calcul soit fait systématiquement et non
qu'il soit mis en cache.

Un cache à 0 sur le modèle et zou.

ps : ce fil a plus sa place sur spip-zone (liste des contributions et des plugins) que sur spip-dev (liste du développement de spip).

Salut,

Merci Joseph

J'avais aussi pensé à la solution du filtre. Mais cela s'appliquerait à
tous mes sites qui utilisent le même squelette. Je pensais au modèle car
cela me permettrait de le faire en plugin et donc ne l'activer que pour
les sites que je souhaite.

Il suffit de coller ce modèle et le filtre associé dans un plugin distinct.

En plus, je voudrais que le calcul soit fait systématiquement et non
qu'il soit mis en cache.

Un cache à 0 sur le modèle et zou.

Apparemment, le cache{0} ne fonctionne pas sur les modèles. Le modèle hérite du cache de article.html
C'est ce que j'ai constaté

ps : ce fil a plus sa place sur spip-zone (liste des contributions et des plugins) que sur spip-dev (liste du développement de spip).

A chaque fois, je confonds les deux. Désolé.
Je forwarde sur la zone.
Désolé pour le dérangement.

Apparemment, le cache{0} ne fonctionne pas sur les modèles. Le modèle hérite du cache de article.html
C’est ce que j’ai constaté

oui tout à fait ; ce qu’on met en cache ce n’est pas le fait qu’on appelle le modèle (comme c’est le cas d’un ), mais le résultat de l’appel au modèle (ça ressemble de ce point de vue à un #INCLURE).

– Fil

OK Merci c’est plus clair pour moi maintenant.

donc si je veux que mon modèle soit calculé à chaque fois, il faut que je le code en PHP ?

Une solution consiste à avoir une balise qui renvoie non le résultat mais l’appel à une fonction qui calcule le résultat. Dès lors, ce qui est mis en cache est, si je ne me trompe pas, le code PHP à exécuter.

Joseph

Une solution consiste à avoir une balise qui renvoie non le résultat mais l’appel à une fonction qui calcule le résultat. Dès lors, ce qui est mis en cache est, si je ne me trompe pas, le code PHP à exécuter.

Oui c’est une « balise dynamique », comme un formulaire.

Autre possibilité, peut-être plus simple : produire la formule en javascript, qui s’exécutera dans la page.

– Fil

C'est une excellente idée sauf qu'à un moment, le visiteur clique sur un bouton pour générer un PDF de son projet. Le PDF est la concaténation de toute une rubrique, et inclut tous les articles correspondant, dont les formulaires et les calculs.
J'utilise le plugin SPIPDF qui se base sur un squelette spécial. Et donc le javascript ne fonctionne pas dans le PDF. DOMMAGE.

Cordialement

Bruno

Je ne comprends pas.
Une balise est insérée dans un squelette mais pas dans le texte de l’article ?

Et je souhaite aussi que la donnée calculée soit enregsitrée dans la session du visiteur connecté.

Est-ce que je peux faire un :
include_spip(‘inc/session’);
session_set($retour, $val_retour);

C’est propre ?

En appelant la balise dans un modèle.

OK MERCI Joseph

Juste pour mon éducation, qu’apporte en plus une balise dynamique insérée dans un modèle par rapport à insérer le code PHP directement dans le modèle ?

C’est plus propre.

Mélanger PHP et syntaxe SPIP dans un squelette est pas toujours optimal.

Joseph