Projet

Général

Profil

Anomalie #449

Accès à l'objet d'authentification depuis les plugins

Ajouté par Mélissa Djebel il y a presque 5 ans. Mis à jour il y a plus de 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
Plugins
Version cible:
Début:
10/12/2012
Echéance:
% réalisé:

100%

Version utilisée:

Description

Dans le cadre de mon plugin d'aéroclub, je souhaite afficher une partie du menu à des membres ayant au niveau de Galette un statut normal, mais dans le cadre du plugin aéroclub un statut particulier (table séparée), cad des instructeurs dans mon cas.

Dans menu.tpl, je peux faire avec smarty {if $login->isAdmin() || $login->isStaff()}

Mais ce n'est donc pas suffisant dans mon cas.

Je souhaiterai pouvoir soit affecter une valeur à $login côté PHP (mais si il n'y a pas de variable private $_isInstructeur par exemple, pas moyen de stocker quoi que ce soit), soit pouvoir faire une déclaration $tpl->assign('is_instructeur', true/false) avant l'appel à getMenus();

Peut-on par exemple ajouter une fonction virtual beforeGetMenus() qui serait appelée au bon moment et où je pourrai faire ma requête et affecter à $tpl ce dont j'ai besoin ?

Révisions associées

Révision e2c5e38d
Ajouté par Johan Cwiklinski il y a plus de 4 ans

Instanciate Authentication before Plugins, so latter can access former; fixes #449

Historique

#1 Mis à jour par Johan Cwiklinski il y a presque 5 ans

Hum... Je vois bien ce que tu veux faire ; effectivement, ce n'est pas possible.

En revanche... Ça sent l'usine à gaz :D

Bon, je dis ça, je n'ai pas du tout eu le temps de regarder non plus. Si tu as des idées, voire un patch (ou un bout de patch), ça pourrait faire avancer un peu le schmilblick. Il y a aussi d'autres possibilités ; comme l'ajout de propriétés "à la volée" dans $login (si ça se trouve, c'est encore plus compliqué, je sais pas).

#2 Mis à jour par Mélissa Djebel il y a presque 5 ans

J'ai testé quelque chose qui me donne satisfaction. J'ai ajouté ces lignes à la fonction getMenus() en m'inspirant de la fonction loadSmarties($id) :

    public function getMenus() {
        global $tpl, $preferences;
        $modules = $this->getModules();
        foreach (array_keys($this->getModules()) as $r) {

            // DEBUT INSERTION MELISSA
            $f = $modules[$r]['root'] . '/_tpl.php';
            if (file_exists($f)) {
                include_once $f;
                if (isset($_tpl_array)) {
                    foreach ($_tpl_array as $k => $v) {
                        $tpl->assign($k, $v);
                    }
                }
            }
            // FIN INSERTION MELISSA

            $menu_path = $this->getTemplatesPath($r) . '/menu.tpl';
            if ($tpl->template_exists($menu_path)) {
                $name2path = strtolower(
                        str_replace(' ', '_', $modules[$r]['name'])
                );
                $tpl->assign(
                        'galette_' . $name2path . '_path', 'plugins/' . $r . '/'
                );
                $tpl->display($menu_path);
            }
        }
    }

Dans mon _tpl.php je peux accéder à $login, faire ma requête et ma variable {$is_instructeur} dans Smarty est correctement remplie.

global $login;
$_tpl_array = array(
    'is_instructeur' => $login->login . '/' . PiloteInstructeur::isPiloteInstructeur($login->login)
);

Donc moi ça m'irait. On ne touche pas à Authentication ou Login, ça va quoi :)

A toi de voir :)

#3 Mis à jour par Johan Cwiklinski il y a presque 5 ans

  • Assigné à mis à Johan Cwiklinski
  • Version cible mis à 0.7.4

Hum... Ça me semble plutôt correct en effet. À priori, je pense qu'on devrait préfixer automatiquement (ou vérifier la présence du préfixe, ce serait peut-être mieux) les variables ajoutées par le nom du plugin (par exemple), pour éviter que Galette et les plugins ne se marchent sur les pieds.

Merci :)

#4 Mis à jour par Johan Cwiklinski il y a plus de 4 ans

En y regardant de nouveau ; je vois un « problème » : tout ceci est limité aux seuls menus, ce serrait probablement intéressant que ces déclarations soient faites de façon plus globale (comme d'autres dans le core).

Comme ça, les menus et tous les autres templates (ce plugin, les autres et le core) pourront en bénéficier. On aurait un truc du genre $tpl->plugins['plugin_id'] = $_tpl_array ; si le fichier adéquat est présent. Qu'en penses-tu ?

#5 Mis à jour par Mélissa Djebel il y a plus de 4 ans

Oui absolument.
On peut en avoir besoin pour les autres templates disponibles (actions de la fiche adhérent, menus, etc.)
Tant qu'à faire, autant ne pas être trop restrictifs si c'est possible :)

#6 Mis à jour par Johan Cwiklinski il y a plus de 4 ans

Hum... En fait, je pense qu'il suffit d'utiliser le fichier _smarties.php, qui contient déjà un tableau de variables passées globalement aux templates.

Rien n'empêche à priori d'ajouter ce que l'on souhaite dans ce tableau, et de les utiliser partout ailleurs dans les templates. Tu devrais pouvoir vérifier assez rapidement si ça fonctionne.

#7 Mis à jour par Mélissa Djebel il y a plus de 4 ans

Je teste ce week-end.
Surement demain.
Et je fais un retour sur le tracker

#8 Mis à jour par Johan Cwiklinski il y a plus de 4 ans

OK, merci :)

#9 Mis à jour par Mélissa Djebel il y a plus de 4 ans

Je viens d'effectuer quelques tests:
Alors effectivement, on peut bien donner des valeurs à $tpl ainsi et il les récupère.

Si j'écris :

$_tpl_assignments = array(
    'is_instructeur' => 'TEST_27/01/2013',
    'dossier_includes' => '__plugin_include_dir__dossier',
    'pilote_tpl_dir' => '__plugin_templates_dir__',
    'pilote_dir' => '__plugin_dir__'
);

J'aurai bien dans la variable $tpl {$is_instructeur} la valeur indiquée au dessus : TEST_27/01/2013.

Le problème est que j'ai besoin de faire un test sur le login de l'utilisateur :

$_tpl_assignments = array(
    'is_instructeur' => PiloteInstructeur::isPiloteInstructeur($login->login),
    'dossier_includes' => '__plugin_include_dir__dossier',
    'pilote_tpl_dir' => '__plugin_templates_dir__',
    'pilote_dir' => '__plugin_dir__'
);
Et j'ai essayé comme je pouvais d'accéder à la variable globale $login et je n'y parviens pas.
  • global $login n'existe pas encore (== null)
  • à partir de la $_SESSION['galette'][PREFIX_DB . '_' . NAME_DB], ça me jette des erreurs et ça ne marche pas non plus

Donc, ce n'est pas concluant à mon niveau.

Avec la solution proposée plus en haut, j'avais accès à $login et ça marchait comme j'en avais besoin. As-tu une idée pour moi ?

#10 Mis à jour par Johan Cwiklinski il y a plus de 4 ans

Huhu, la « bonne blague »...

Si tu regardes dans le fichier galette.inc.php ; tu verras que les plugins sont déclarés tout juste avant... $login. Du coup, il suffit d'intervertir les appels je pense.

#11 Mis à jour par Johan Cwiklinski il y a plus de 4 ans

  • Statut changé de Nouveau à In Progress
  • Tracker changé de Souhaits à Anomalie

#12 Mis à jour par Johan Cwiklinski il y a plus de 4 ans

  • Sujet changé de Passer une variable à $tpl avant lib\Galette\Core\Plugins::getMenus() à Accès à l'objet d'authentification depuis les plugins
  • Version utilisée mis à 0.7.3

#13 Mis à jour par Johan Cwiklinski il y a plus de 4 ans

  • Statut changé de In Progress à Résolu
  • % réalisé changé de 0 à 100

#14 Mis à jour par Johan Cwiklinski il y a plus de 4 ans

  • Statut changé de Résolu à Fermé

#15 Mis à jour par Mélissa Djebel il y a plus de 4 ans

Testé et validé :)

Formats disponibles : Atom PDF