Project

General

Profile

Anomalie #449

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

Added by Mélissa Djebel about 7 years ago. Updated almost 7 years ago.

Status:
Fermé
Priority:
Normal
Category:
Plugins
Target version:
Start date:
12/10/2012
Due date:
% Done:

100%

Estimated time:
Version utilisée:
Vote:

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 ?

Associated revisions

Revision e2c5e38d (diff)
Added by Johan Cwiklinski almost 7 years ago

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

History

#1

Updated by Johan Cwiklinski about 7 years ago

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

Updated by Mélissa Djebel about 7 years ago

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

Updated by Johan Cwiklinski about 7 years ago

  • Assignee set to Johan Cwiklinski
  • Target version set to 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

Updated by Johan Cwiklinski almost 7 years ago

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

Updated by Mélissa Djebel almost 7 years ago

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

Updated by Johan Cwiklinski almost 7 years ago

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

Updated by Mélissa Djebel almost 7 years ago

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

#8

Updated by Johan Cwiklinski almost 7 years ago

OK, merci :)

#9

Updated by Mélissa Djebel almost 7 years ago

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

Updated by Johan Cwiklinski almost 7 years ago

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

Updated by Johan Cwiklinski almost 7 years ago

  • Status changed from Nouveau to In Progress
  • Tracker changed from Souhaits to Anomalie
#12

Updated by Johan Cwiklinski almost 7 years ago

  • Subject changed from Passer une variable à $tpl avant lib\Galette\Core\Plugins::getMenus() to Accès à l'objet d'authentification depuis les plugins
  • Version utilisée set to 0.7.3
#13

Updated by Johan Cwiklinski almost 7 years ago

  • Status changed from In Progress to Résolu
  • % Done changed from 0 to 100
#14

Updated by Johan Cwiklinski almost 7 years ago

  • Status changed from Résolu to Fermé
#15

Updated by Mélissa Djebel almost 7 years ago

Testé et validé :)

Also available in: Atom PDF