Passer des arguments à un rappel de page de menu d'administration?


14

Situation: je travaille sur un plugin et je le développe en classe, tout a bien fonctionné jusqu'à ce que je rencontre cette situation. Je voulais rendre les choses un peu plus propres et j'ai essayé ça ..

class MyPlugin {
    function __construct() {
        add_action('admin_menu', array(&$this, 'myplugin_create_menus');
    }        

    //I don't want to write a function for every options page I create
    //so I prefer to just load the content from an external file.        
    function load_view($filename) {
        $view = require(dirname(__FILE__).'/views/'.$filename.'.php');
        return $view;
    }

    //Here is where the problem comes
    function myplugin_create_menus() {
        add_menu_page( 'Plugin name',
                       'Plugin name',
                       'manage_options',
                       'my-plugin-settings',
                       array(&$this, 'load_view') // Where do I specify the value of $filename??
                     );
    }

}#end of class

J'ai essayé un tas d'options différentes mais rien ne fonctionne, peut-être que je suis devant, mais je ne le vois pas.

Bien sûr, c'est une re-création, j'ai préfixé toutes mes fonctions et elles ne sont pas exactement comme je l'ai écrit ici mais j'espère que vous avez l'idée de demander.

Merci d'avance.

PD: Si vous voulez voir le code source original, je serai heureux de le coller et de vous donner le lien.

Réponses:


8

Vous ne pouvez pas passer d'argument à la fonction de rappel. add_menu_page()l'ajoute en tant que gestionnaire d'actions et admin.phpdéclenche l'action sans aucun argument.

Je vois deux solutions simples à ce problème. L'une consiste à stocker tous les noms de fichiers dans un tableau de votre classe, indexés par nom de hook. Ensuite, vous pouvez l'utiliser pour rechercher le fichier que vous devez charger (vous pouvez également stocker des données supplémentaires dans ce tableau).

class WPSE16415_Plugin
{
    protected $views = array();

    function load_view() {
        // current_filter() also returns the current action
        $current_views = $this->views[current_filter()];
        include(dirname(__FILE__).'/views/'.$current_views.'.php');
    }

    function myplugin_create_menus() {
        $view_hook_name = add_menu_page( 'Plugin name',
            'Plugin name',
            'manage_options',
            'my-plugin-settings',
            array(&$this, 'load_view'),
        );
        $this->views[$view_hook_name] = 'options';
    }
}

L'autre consiste à ignorer l'argument de rappel, afin que WordPress inclue le fichier indiqué par le nom du slug lui-même, comme Brady le suggère dans sa réponse.


ah-ha pourquoi n'ai-je pas pensé à le faire de cette façon :(
Brady

OUAIS!! vous avez sauvé des dizaines de chatons aujourd'hui .. jamais entendu parler de cette fonction si 'current_filter'. Solution très intelligente. Merci beaucoup pour votre aide @Brady @Jan Fabry
Luis

4

Vous pouvez toujours simplement utiliser une fonction anonyme (ou fermeture). Quelque chose qui affecte:

add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position);

1
Ça ne marche pas pour moi. J'utilise WordPress 4.1 (et à partir d'aujourd'hui 4.1.1)
Jeff Vdovjak

Intelligent! Et ça marche. Voici un exemple plus complet: hastebin.com/segibugice qui générerait une URL comme example.com/wp-admin/admin.php?page=my-slug
Quinn Comendant

J'aurais dû mentionner lors du passage de variables dans le cadre d'une fonction anonyme, vous devez utiliser le mot-clé "use". function() use ($my_var) { // now you can use $my_var }
user35752

0

la fonction load_view devrait être comme ça?:

function load_view($filename) {
    include(dirname(__FILE__).'/views/'.$filename.'.php');
}

et dans votre fichier include, il devrait faire écho à tout contenu de la page affichée.

ÉDITER:

Voici ce que dit le codex à ce sujet:

$menu_slug (string) (required)Le nom du slug pour faire référence à ce menu (devrait être unique pour ce menu). Avant la version 3.0, cela s'appelait le paramètre file (ou handle). Si le paramètre de fonction est omis, le menu_slug doit être le fichier PHP qui gère l'affichage du contenu de la page de menu. Par défaut: aucun

$function Fonction qui affiche le contenu de la page de la page de menu. Techniquement, le paramètre de la fonction est facultatif, mais s'il n'est pas fourni, WordPress supposera essentiellement que l'inclusion du fichier PHP générera l'écran d'administration, sans appeler de fonction. La plupart des auteurs de plugins choisissent de placer le code de génération de page dans une fonction dans leur fichier de plugin principal.: Dans le cas où le paramètre de fonction est spécifié, il est possible d'utiliser n'importe quelle chaîne pour le paramètre de fichier. Cela permet l'utilisation de pages telles que? Page = my_super_plugin_page au lieu de? Page = my-super-plugin / admin-options.php.

Donc, ce que je peux en déduire, c'est que si vous laissez la fonction vide, elle essaie d'inclure un fichier php en fonction de ce que vous avez défini menu_slug.

EDIT 2

function load_view() {
    include(dirname(__FILE__).'/views/'.$this->filename.'.php');
}

function myplugin_create_menus() {
    $this->filename = "something";
    add_menu_page( 'Plugin name',
                   'Plugin name',
                   'manage_options',
                   'my-plugin-settings',
                   array(&$this, 'load_view')
                 );
    $this->filename = "somethingelse";
    add_menu_page( 'Plugin name',
                   'Plugin name',
                   'manage_options',
                   'my-plugin-settings',
                   array(&$this, 'load_view')
                 );
}

@ Brady, je le sais, et la fonction "load_view" fonctionne bien et génère correctement le contenu lors de l'utilisation d'une valeur statique. Par exemple: incl .... / views / my-panel.php ');
Luis

@Luis - Alors quel est le problème?
Brady

@Brady array (& $ this, 'load_view') // Où dois-je spécifier la valeur de $ filename ??. Je ne peux pas faire quelque chose comme un tableau (& $ this, 'load_view ("my-value")') Je veux trouver un moyen de passer des paramètres à la fonction que j'appelle
Luis

Oh je comprends maintenant. Vous voulez passer une fonction de classe mais avec un paramètre. Eh bien, j'ai regardé et regardé et ne peux pas trouver comment vous le faites. Mais puisque vous réussissez le cours, ne pouvez-vous pas faire ce que j'ai mis dans EDIT 2?
Brady

@Brady: Votre deuxième modification n'aidera pas beaucoup, vous remplacez simplement la filenamevariable pour qu'elle le soit toujours "somethingelse". Votre première modification pourrait être l'astuce ici: si load_viewne fait rien sauf pour inclure le fichier, vous ne devez en effet pas passer une fonction de rappel et WordPress essaiera de charger la page que vous avez passée en tant que slug.
Jan Fabry

0

J'ai résolu ce problème en ajoutant simplement l'ID (ou toutes les données dont vous avez besoin) au slug du menu.

Par exemple:

 add_menu_page( 'Plugin name',
                       'Plugin name',
                       'manage_options',
                       'my-plugin-settings-' . $identifier,
                       'setting-function-callback'
                     );

Cela créera ensuite une URL avec «my-plugin-settings-filename» (à titre d'exemple), et je peux simplement analyser cette partie de l'URL (avec $ _GET ou filter_input).


Vous pouvez également utiliser un paramètre d'URL, mais vous devez créer un élément de menu (puis vous pouvez le masquer si vous le souhaitez).
Jeff Vdovjak

Merci d'avoir mis mon code dans un bloc de code toscho. Lorsque je pose une question, il y a un bouton pour cela, mais je ne connais pas le balisage pour le faire dans une réponse.
Jeff Vdovjak

0

Basé sur la réponse de user35752 , vous pouvez même utiliser une méthode objet avec des paramètres comme rappel.

$args = [ [new Foo(), 'bar'], [$param1, $param2, ...] ];

$callback = function () use ($args){
                call_user_func_array($args[0], $args[1]);
            };
add_menu_page( $page, $menu, $capability, $slug, $callback , $icon, $position)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.