web-dev-qa-db-fra.com

Passer les arguments en rappel de la page du menu de l'administrateur?

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

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é différentes options 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 ressemblent pas exactement à celles que j'ai écrites ici, mais j'espère que vous avez eu l'idée de ce que je demande.

Merci d'avance.

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

12
Luis

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

Je vois deux solutions simples à ce problème. La première consiste à stocker tous les noms de fichiers dans un tableau de votre classe, indexés par nom de hook. Ensuite, vous pouvez utiliser ceci 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, de sorte que WordPress inclura le fichier indiqué par le nom du slug lui-même, comme le suggère Brady dans sa réponse.

7
Jan Fabry

Vous pouvez toujours utiliser une fonction anonyme (ou une fermeture). Quelque chose à l'affect de:

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

la fonction load_view devrait être comme ça ?:

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

et dans votre fichier d'inclusion, il devrait faire écho au contenu de la page affichée.

MODIFIER:

Voici ce que dit le codex à ce sujet:

$menu_slug (string) (required) Le nom du slug auquel se référer pour 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, 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 pour la page de menu. Techniquement, le paramètre de fonction est facultatif, mais s'il n'est pas fourni, WordPress supposera en principe que l'inclusion du fichier PHP générera l'écran d'administration, sans appeler de fonction. La plupart des auteurs de plug-in choisissent de placer le code de génération de page dans une fonction de leur fichier de plug-in principal.: Dans l'éventualité 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 d'utiliser des pages telles que? Page = my_super_plugin_page au lieu de? Page = my-super-plugin/admin-options.php.

Donc, ce que je peux comprendre de ceci est que si vous laissez la fonction vide, il essaie d'inclure un fichier php basé sur ce que vous avez défini le menu_slug sur.

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')
                 );
}
0
Brady

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

Par exemple:

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

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

0
Jeff