[Réglé] [twig] tests pour étendre

Aide aux auteurs d'extensions pour phpBB 3.1.x

Modérateur: Equipe

Règles du forum
A lire impérativement : Règlement de phpBB-fr.com

[Réglé] [twig] tests pour étendre

Messagepar papajoke » 31 Juil 2017 à 20:05

bonjour,

petit partage de ma découverte de phpBB (A voir si sujet dans bonne rubrique ?)

Puisque phpBB3.2 utilise twig, j'ai essayé de l'étendre par curiosité et je vous fait partager ma petite expérience.
je donne 2 exemples qui ne sont que des modèles pour d'autres fonctionnalités.

Attension, on va modifier un fichier de phpBB
EDIT: en fait c'est faux

Ajouter une fonction pour le debug

idée : afficher les variables dans les modèles
utilisation :
{{ dump(user) }} tout sur l'utilisateur
{{ dump() }} variables générales
{{ dump('T_JQUERY_LINK') }} une variable générale - pas d’intérêt :wink:

Pour cela if faut modifier le fichier [phpBB-pprojet]/phpbb/template/twig/extension.php
dans ce fichier on peut ajouter nos propres fonctions et filtres

Il faut écrire une fonction php et enregistrer dans twig, pour l'ajouter à twig :
ici, nous ajoutons une fonction dump dans getFunctions() que nous écrirons plus bas
ps: nous voyons que phpbb a ajouté lang() à twig.
Code: Tout sélectionner
	public function getFunctions() {
		return array(
			new \Twig_SimpleFunction('lang', array($this, 'lang')),
			new \Twig_SimpleFunction('dump', array($this, 'dump')),
		);
	}

Pour le code de la fonction, rien de particulier , c'est du php classique, c'est un simple var_dump() :
Code: Tout sélectionner
/** fonction debug 
		{{ dump(user) }} {{ dump() }} {{ dump('T_JQUERY_LINK') }}
	*/
	function dump($arg = null)
	{
		echo '<hr>';
		$context_vars = $this->context->get_root_ref();
		// if (empty($context_vars['DEBUG_OUTPUT'])) return false;

		if (func_num_args()<1) {
			echo "DUMP root <br />";
			return var_dump($context_vars);
		}
        $args = func_get_args();
		foreach($args as $arg){
			if (is_string($arg)){
				echo "DUMP $arg <br />";
				
				if (array_key_exists($arg,$context_vars)) {
					var_dump($context_vars[$arg]);
				}
			}
			else {
				try {
					var_dump($arg);
				} catch (Exception $e) {
					echo 'Erreur : ', $e->getMessage();
				}
			}
		}
	}


--------------------------------------------

If est aussi possible d'ajouter des filtres

on les utilise de cette façon : {{ PAGE_TITLE|upper }}

Pour mon test, j'ai fait un filtre iff avec un seul paramètre
utilisation : {{ TOTAL_USERS|iff(S_USER_LOGGED_IN) }} on affiche les données que si le visiteur est logué

toujours dans le même fichier [phpBB-pprojet]/phpbb/template/twig/extension.php, nous avons déjà une fonction pour déclarer notre filtre :
Code: Tout sélectionner
	public function getFilters() {
		return array(
			new \Twig_SimpleFilter('subset', array($this, 'loop_subset'), array('needs_environment' => true)),
			new \Twig_SimpleFilter('addslashes', 'addslashes'),
			new \Twig_SimpleFilter('iff', array($this, 'iff')),
		);
	}

et nous ajouter notre grosse fonction :
Code: Tout sélectionner
	/** filtre iff() 
		{{ TOTAL_USERS|iff(S_USER_LOGGED_IN) }}
	*/
	function iff($data, $condition = 0){
		return (isset($condition) && $condition !=0) ? $data : '';
	}
ps: on pourrai lui passer plusieurs paramètres et tous les tester

on n'a plus qu'a tester dans un modèle :
Code: Tout sélectionner
{{ 'iff(): voir résultat que si connecté: ' ~ TOTAL_USERS|iff(S_USER_LOGGED_IN) }}
Modifié en dernier par papajoke le 01 Aoû 2017 à 14:19, modifié 4 fois.
modérateur forum manjaro.fr
Avatar de l’utilisateur
papajoke
Apprenti-posteur
Apprenti-posteur
 
Messages: 186
Enregistré le: 23 Juil 2017 à 13:45

Re: [tuto][twig] étendre

Messagepar galixte » 31 Juil 2017 à 20:29

Salut,

en passant il y a ce tuto : https://www.phpbb.com/community/viewtop ... &t=2424606 et cette extension : https://www.phpbb.com/community/viewtop ... &t=2429096 permettant de convertir styles et extensions avec la syntaxe de Twig.
Communau EzCom
Image
« Traductions d’extensions & styles pour phpBB 3.1.x & 3.2.x ».
ImageListes de toutes les extensions recensées pour phpBB 3.1.x & 3.2.x.
ImageListes de tous les styles recensés pour phpBB 3.1.x & 3.2.x.
Avatar de l’utilisateur
galixte
Floodeur universel
Floodeur universel
 
Messages: 10124
Enregistré le: 08 Mar 2004 à 02:40
Localisation: Sud de la France.

Re: [tuto][twig] étendre

Messagepar papajoke » 31 Juil 2017 à 20:39

et un tuto twig car il permet un peu plus que le template d'origine de phpbb
Code: Tout sélectionner
{{- [TOTAL_USERS, TOTAL_TOPICS, TOTAL_POSTS]|join(' &bull; ') -}}
modérateur forum manjaro.fr
Avatar de l’utilisateur
papajoke
Apprenti-posteur
Apprenti-posteur
 
Messages: 186
Enregistré le: 23 Juil 2017 à 13:45

Re: [tuto][twig] étendre

Messagepar Skouat » 31 Juil 2017 à 23:13

Bonjour,

@papajoke : J'ai du mal à saisir l'intérêt de ces modifications

@galixte : sympa le twig converter 8)
Mes MODS

Ultima-World Hébergé par phpBB-Services
Code parrainage : 1241646554
Skouat
Traducteur
Traducteur
 
Messages: 13712
Enregistré le: 02 Avr 2008 à 20:47

Re: [tuto][twig] étendre

Messagepar papajoke » 01 Aoû 2017 à 00:52

bonjour @Skouat

En plus des officiels(+lang) présentent dans phpbb , il faut regarder ce qui existe https://packagist.org/search/?q=twig%20filter il y en a des centaines.

Par exemple si on a un besoin que de la première phrase d'un post ou plus généralement de regex ou twig-lamda qui est impressionnant (utile en phpbb ?pense pas)
Code: Tout sélectionner
{% for author in articles|map(=> _.author)|unique_by('===')|sort_by(=> _.age) %}
    * {{ author.name }}, {{ author.age }}
{% endfor %}


Il est possible d'ajouter un filtre par simplement composer sans toucher au code et ajouter le service dans phpBB/config/default/container/services_twig.yml
Code: Tout sélectionner
composer require falc/twig-text-extension 
# et a la fin du fichier phpBB/config/default/container/services_twig.yml
    twig.extension.text:
        class: Falc\Twig\Extension\TextExtension
        tags:
            - { name: twig.extension }

et le code suivant fonctionne bien
Code: Tout sélectionner
{{ 'hash-something' | hash('md5') }}
{{ '<p>1) This is the first title<br>2) This is the second title<br>42)   Another title</p>' | regex_replace('#\\d+\\)\\s*#', '') }}


Mais si on a besoin d'avoir accès a certaines variables de phpBB on ne trouvera pas notre bonheur sur packagelist ; comme dans mon exemple
Code: Tout sélectionner
$context_vars = $this->context->get_root_ref();
/*  je quitte si je ne suis pas en mode debug */
if (empty($context_vars['DEBUG_OUTPUT'])) return false;


Les filtres peuvent êtres extrêmement utiles, par exemple, pour moi ils m'ont sauvé la vie avec ceci
Code: Tout sélectionner
< ... title="créé par {{ topicrow.TOPIC_AUTHOR }} {{ topicrow.FIRST_POST_TIME|striptags }}">
puisque topicrow.FIRST_POST_TIME me retournait <span title="...">...</span> et donc cette extension daterelative était inutilisable pour moi.
ps: il existe un filtre du même type que daterelative "ago". Si le résultat est le même, quelle est la meilleure solution ? personnellement j'ai plus confiance en une extension symfony/twig qui est plus utilisée qu'une extension phpbb (pas taper ) et qui sera dépendante de symfony et non de la version de phpbb.

Bien sur tout cela doit être faisable avec une extension, mais a partir du moment ou phpbb utilise twig pourquoi ne pas connaitre ces possibilités qui sont "simples" et en utiliser une pour un besoin ponctuel. Il est clair que si l'on ajoute un filtre perso twig, notre modèle devient incompatible avec tous phpbb.
modérateur forum manjaro.fr
Avatar de l’utilisateur
papajoke
Apprenti-posteur
Apprenti-posteur
 
Messages: 186
Enregistré le: 23 Juil 2017 à 13:45

Re: [tuto][twig] étendre

Messagepar Skouat » 01 Aoû 2017 à 12:11

Hello,

papajoke a écrit:Il est possible d'ajouter un filtre par simplement composer sans toucher au code et ajouter le service dans phpBB/config/default/container/services_twig.yml

Donc tu touches au code vu que tu modies un fichier du core de phpBB :roll:

papajoke a écrit:Bien sur tout cela doit être faisable avec une extension, mais a partir du moment ou phpbb utilise twig pourquoi ne pas connaitre ces possibilités qui sont "simples" et en utiliser une pour un besoin ponctuel. Il est clair que si l'on ajoute un filtre perso twig, notre modèle devient incompatible avec tous phpbb.


Pour rappel, la règle d'or est désormais 0 modification du core de phpBB.
Avec 3.1 c'était toléré, avec 3.2 ca l'est encore (bien que moins nécessaire) et avec les furtures versions ca le sera de moins en moins. A terme, il y a de forte chance que phpBB prenne le parti, après chaque mise à jour, d'écraser l'ensemble des fichiers du core par les nouveaux fichiers (méthode déjà utilisée par d'autres CMS) afin de garantir l'intégrité du core de phpBB
Donc, si tu veux exploiter Twig et afin de rester "corporate" avec la philosophie phpBB, je ne peux que te suggérer de transformer cette idée en extension phpBB.

++
Mes MODS

Ultima-World Hébergé par phpBB-Services
Code parrainage : 1241646554
Skouat
Traducteur
Traducteur
 
Messages: 13712
Enregistré le: 02 Avr 2008 à 20:47

Re: [tuto][twig] étendre

Messagepar papajoke » 01 Aoû 2017 à 14:03

je viens de faire le test (que maintenant désolé) avec la même extension twig prise au hasard.

phpbb est bien fait ! Il est possible de charger l'extension twig avec une extension "vide" phpbb :
Il suffit de référencer notre filtre twig dans le fichier [dev/name_ext]/config/service.yml
Code: Tout sélectionner
services:
    twig.extension.text:
        class: Falc\Twig\Extension\TextExtension
        tags:
            - { name: twig.extension }


--------------------------------
du coup mon premier post est bien faux, mais il donne la recette pour écrire ces propres extensions twig (et non phpbb)
modérateur forum manjaro.fr
Avatar de l’utilisateur
papajoke
Apprenti-posteur
Apprenti-posteur
 
Messages: 186
Enregistré le: 23 Juil 2017 à 13:45

Re: [twig] tests pour étendre

Messagepar Skouat » 01 Aoû 2017 à 18:28

Si dans une extension, il est nécessaire d'avoir des dépendences gérées via composer, alors cela ne pose pas de problème.

cf. l'extension phpBB Skeleton
https://github.com/phpbb-extensions/php ... on#L22-L25

Après, et j'ai peut-être mal cerné vos exemples, si vous passer ces modifications via une extension, il pourrait y être implémenté une page d'administration qui permettrait de créer nos propres filtre.
Mais bon j'avoue que je n'ai tjs pas cerné l'intérêt de tout cela. :?
Mes MODS

Ultima-World Hébergé par phpBB-Services
Code parrainage : 1241646554
Skouat
Traducteur
Traducteur
 
Messages: 13712
Enregistré le: 02 Avr 2008 à 20:47

Re: [twig] tests pour étendre

Messagepar papajoke » 01 Aoû 2017 à 22:31

l’intérêt est d'étendre twig, j'ai donné pas mal de liens sur les extensions twig mais bon, je ne cherche pas à ce que tu l'utilises si tu n'en a pas le besoin :wink:
un (autre) exemple, relativement simple à écrire : avec les images faire des miniatures dans un cache
Code: Tout sélectionner
<img src="images/{{ '45789.jpg'|filtre_créer_miniature(50,50) }}">

par exemple, ce filtre va tester si la miniature existe dans images/miniatures/45789.50-50.jpg, si non il la crée et retourne l'url créée : miniatures/45789.50-50.jpg à la place de notre "45789.jpg"

Reprise de mon petit exemple du début (debug une variable {{ user.data|dumpv }} ) en extension php , installée dans phpbb/ext/manja/dumpvar/ . Elle s'installe comme toute extension php, ne nécessite aucune procédure particulière.

manja/dumpvar/config/services.yml :
Code: Tout sélectionner
services:
    manja.dumpvar.twig.extension:
        class: manja\dumpvar\twig\extension\dumpvarextension
        calls:
            - [setTemplate, ["@service_container"]]
            #- [setTemplate, ["@template"]]
        tags:
            - { name: twig.extension }


et le code php (même que précédent) dans manja/dumpvar/twig/extension/dumpvarextension.php

Code: Tout sélectionner
<?php 
namespace manja\dumpvar\twig\extension;
use Symfony\Component\DependencyInjection\ContainerInterface;
 
class dumpvarextension extends \Twig_Extension
{
	protected $context;

	public function setTemplate(ContainerInterface $container = null)
	{
		$this->context = $container->get('template_context');
	}

    public function getName()
    {
        return 'dumpvar_phpbb_extension';
    }

    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('dumpv', array($this, 'dumpFilter')),
            new \Twig_SimpleFilter('iff', array($this, 'ifFilter')),
        );
    }

	public function getFunctions()
	{
		return array(
    		new \Twig_SimpleFunction('dumpv', array($this, 'dumpFilter')),
		);
	}    

    /** fonction debug 
		{{ dumpv(user) }} {{ dumpv() }} {{ dumpv('T_JQUERY_LINK') }} {{ user|dumpv }}
	*/
	public function dumpFilter($arg = null)
	{
		echo '<hr>';
		$context_vars = $this->context->get_root_ref();
		/** fonctionne uniquement en mode DEBUG ON par sécurité */
		if (empty($context_vars['DEBUG_OUTPUT'])) return false;

		if (func_num_args()<1) {
			echo "DUMP root <br />";
			return var_dump($context_vars);
		}
        $args = func_get_args();
		foreach($args as $arg){
			if (is_string($arg)){
				echo "DUMP $arg <br />";
				if (array_key_exists($arg,$context_vars)) {
					var_dump($context_vars[$arg]);
				}
			}
			else {
				try {
					var_dump($arg);
				} catch (Exception $e) {
					echo 'Erreur : ', $e->getMessage();
				}
			}
		}
	}

    /** filtre iff() 
		{{ TOTAL_USERS|iff(S_USER_LOGGED_IN) }}
	*/
	public function ifFilter($data, $condition = 0){
		return (isset($condition) && $condition !=0) ? $data : '';
	}
 
}
modérateur forum manjaro.fr
Avatar de l’utilisateur
papajoke
Apprenti-posteur
Apprenti-posteur
 
Messages: 186
Enregistré le: 23 Juil 2017 à 13:45

Re: [twig] tests pour étendre

Messagepar Steph » 01 Aoû 2017 à 23:12

Salut,

L'idée et les exemples que tu donnes peuvent servir, c'est vrai. Par contre, cela risque de poser quelques soucis lors des demandes de supports.

Je ne peux qu'affirmer le fait de passer par une extension qui aura le mérite par exemple d'au minimum pouvoir être désactivée en cas de souci et en plus d'être mieux entretenue lors de mises à jour futures de phpBB.
Avatar de l’utilisateur
Steph
Administrateur
Administrateur
 
Messages: 18199
Enregistré le: 29 Déc 2008 à 16:48
Localisation: Alsace / Bas-Rhin / France

Re: [twig] tests pour étendre

Messagepar Skouat » 01 Aoû 2017 à 23:58

Hello,

Juste pour clarifier les choses (dans le cas où mes précédentes interventions eut été mal interprétées... et je ne dis pas que c'est le cas)... Je ne remet pas en question l'utilité de ce que tu évoques dans ce sujet. Je n'en vois juste pas la portée.

Maintenant, pour en venir au sujet dans son ensemble, selon l'expérience que j'ai des directives de codage de phpBB et également de comment fonctionne phpBB, ce qui me gêne le plus dans tes exemples c'est qu'ils font références à des éléments qui ne correspondent pas à la logique de phpBB ou sont imprécis. L'exemple est certe fonctonnel, mais partiellement hors contexte de phpBB.

Si je reprends ton dernier exemple de miniature, tu fais référence à un répertoire images/miniatures/45789.50-50.jpg.
  1. Cette arborescence n'existe pas au sein de phpBB.
  2. sachant le point 1, difficile de savoir de quel répertoire images tu parles.
  3. vu le nom de fichier que tu donnes en exemple, il est également difficile de savoir si tu fais référence à une image stockée dans une extension/un style ou d'une image uploadée par un membre du forum.
  4. Je pourrais encore cité d'autres remarques juste pour cet exemple, mais ce n'est pas le but de mon message...
De plus, initialement ton sujet s'appelait tuto et il était loin de ressembler à un tuto, dans le sens où nous l'entendont, mais plutot à une boite à idées complétée au fil de tes découvertes.

Pour conclure mon (p'tit ? :roll: :mrgreen: ) message... Je ne veux surtout pas stopper ton élan de découverte de Twig/phpBB, mais garde à l'esprit que nous sommes une communauté phpBB (et non Twig).
Partant de là, tu pourras aisement comprendre que nous ne pouvons pas "approuver" des portions de codes qui ne respectent pas une certaine convention d'écriture.

Donc, si souhaites conserver la notion de tuto, prend exemple sur les tutos que nous mettons à dispostion (notamment celui concernant l'utilisation des sessions phpBB3).

Ou sinon, nous ne pouvons que t'insiter à transfomer ton idée en extension pour phpBB.
Pour ce faire, n'hésistes pas à créer un sujet de développement dans le forum qui jouxte celui-ci. Nous nous ferons un plaisir de tester, vérifier, critiquer et décortiquer ton extension afin qu'elle puisse être approuvée au sein de notre base de données des extensions. :wink:

A+ 8)
Mes MODS

Ultima-World Hébergé par phpBB-Services
Code parrainage : 1241646554
Skouat
Traducteur
Traducteur
 
Messages: 13712
Enregistré le: 02 Avr 2008 à 20:47

Re: [twig] tests pour étendre

Messagepar papajoke » 02 Aoû 2017 à 01:31

bon je vais clore le sujet car il y a un ENORME problème.

On change le langage twig ! donc lorsque l'on dévalide l’extension, twig PLANTE à la première balise non reconnue. On devient donc prisonnier de cette extension :twisted:
modérateur forum manjaro.fr
Avatar de l’utilisateur
papajoke
Apprenti-posteur
Apprenti-posteur
 
Messages: 186
Enregistré le: 23 Juil 2017 à 13:45


Retourner vers Aide au développement

 


  • Articles en relation
    Réponses
    Vues
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité