Projet

Général

Profil

Actions

Anomalie #449

fermé

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

Ajouté par Mélissa Djebel il y a plus de 11 ans. Mis à jour il y a environ 11 ans.

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

100%

Temps estimé:
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 ?

Mis à jour par Johan Cwiklinski il y a plus de 11 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).

Mis à jour par Mélissa Djebel il y a plus de 11 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 :)

Mis à jour par Johan Cwiklinski il y a plus de 11 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 :)

Mis à jour par Johan Cwiklinski il y a environ 11 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 ?

Mis à jour par Mélissa Djebel il y a environ 11 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 :)

Mis à jour par Johan Cwiklinski il y a environ 11 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.

Mis à jour par Mélissa Djebel il y a environ 11 ans

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

Mis à jour par Johan Cwiklinski il y a environ 11 ans

OK, merci :)

Mis à jour par Mélissa Djebel il y a environ 11 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 ?

Mis à jour par Johan Cwiklinski il y a environ 11 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.

Mis à jour par Johan Cwiklinski il y a environ 11 ans

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

Mis à jour par Johan Cwiklinski il y a environ 11 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

Mis à jour par Johan Cwiklinski il y a environ 11 ans

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

Mis à jour par Johan Cwiklinski il y a environ 11 ans

  • Statut changé de Résolu à Fermé

Mis à jour par Mélissa Djebel il y a environ 11 ans

Testé et validé :)

Actions

Formats disponibles : Atom PDF