Passer des arguments à un rappel de page de menu admin?

12

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, il s’agit d’une re-création, j’ai préfixé toutes mes fonctions et elles ne correspondent pas exactement à ce que j’ai écrit ici, mais j’espère que vous avez eu l’idée de ce que je vous 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.

    
posée Luis 05.05.2011 - 11:47

4 réponses

7

Vous ne pouvez pas passer d'argument à la fonction de rappel. add_menu_page() l'ajoute en tant que gestionnaire d'actions 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. Vous pouvez ensuite utiliser cette option pour rechercher le fichier à 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, donc WordPress inclura le fichier indiqué par le nom du slug lui-même, comme le suggère Brady dans sa réponse.

    
réponse donnée Jan Fabry 05.05.2011 - 15:05
4

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

add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position);
    
réponse donnée user35752 25.07.2013 - 02:24
0

la fonction load_view devrait être comme ceci?:

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.

EDIT:

Voici ce que dit le codex en la matière:

$menu_slug (string) (required) Le nom du slug auquel faire référence à ce menu (doit ê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 devrait être le fichier PHP qui gère l'affichage du contenu de la page de menu. Par défaut: Aucun

$function La 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 généralement 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 générateur de page dans une fonction de leur fichier de plug-in principal.: Dans l'éventualité où le paramètre function est spécifié, il est possible d'utiliser n'importe quelle chaîne pour le paramètre file. Cela permet d’utiliser des pages telles que? Page = my_super_plugin_page au lieu de? Page = mon-super-plugin / admin-options.php.

Donc, ce que je peux comprendre de ceci est que si vous laissez une fonction vide, il essaie d'inclure un fichier php en fonction de ce que vous avez défini comme 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')
                 );
}
    
réponse donnée Brady 05.05.2011 - 12:47
0

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'
                     );

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

    
réponse donnée Jeff 19.02.2015 - 05:43

Lire d'autres questions sur les étiquettes