web-dev-qa-db-de.com

Argumente an einen Rückruf einer Admin-Menüseite übergeben?

Situation: Ich arbeite an einem Plugin und ich entwickle es als Klasse, alles hat gut funktioniert, bis ich in diese Situation geraten bin. Ich wollte die Dinge ein bisschen sauberer machen und versuchte dies ..

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

Ich habe verschiedene Optionen ausprobiert, aber es funktioniert nichts. Vielleicht bin ich davor, aber ich kann es nicht sehen.

Natürlich ist dies eine Neuerstellung. Ich habe allen meinen Funktionen ein Präfix vorangestellt und sie sind nicht genau so, wie ich sie hier geschrieben habe, aber ich hoffe, Sie haben die Idee, nach der ich frage.

Danke im Voraus.

P.D .: Wenn Sie den Original-Quellcode sehen möchten, füge ich ihn gerne ein und gebe Ihnen den Link.

12
Luis

Sie können der Rückruffunktion kein Argument übergeben. add_menu_page() fügt es als Aktionshandler hinzu , und admin.php löst die Aktion ohne Argumente aus.

Ich sehe zwei einfache Lösungen für dieses Problem. Eine besteht darin, alle Dateinamen in einem Array in Ihrer Klasse zu speichern, indiziert nach dem Hook-Namen. Anschließend können Sie auf diese Weise nachsehen, welche Datei Sie laden müssen (Sie können auch zusätzliche Daten in diesem Array speichern).

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

Das andere ist, das Rückrufargument zu überspringen, damit WordPress die Datei, die durch den Namen des Slugs selbst angezeigt wird, einschließt, wie Brady in seiner Antwort vorschlägt.

7
Jan Fabry

Sie könnten immer nur eine anonyme Funktion (oder Schließung) verwenden. Etwas zu den Auswirkungen von:

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

die Funktion load_view sollte so aussehen:

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

und in Ihrer Include-Datei sollte es jeglichen Inhalt für die angezeigte Seite wiedergeben.

BEARBEITEN:

Folgendes sagt der Kodex dazu:

$menu_slug (string) (required) Der Slug-Name, mit dem auf dieses Menü verwiesen wird (sollte für dieses Menü eindeutig sein). Vor Version 3.0 wurde dies als Datei- (oder Handle-) Parameter bezeichnet. Wenn der Funktionsparameter weggelassen wird, sollte der menu_slug die Datei PHP sein, die die Anzeige des Inhalts der Menüseite verwaltet. Standardeinstellung: Keine

$function Die Funktion, die den Seiteninhalt für die Menüseite anzeigt. Technisch gesehen ist der Funktionsparameter optional, aber wenn er nicht angegeben wird, geht WordPress grundsätzlich davon aus, dass das Einbeziehen der Datei PHP den Verwaltungsbildschirm generiert, ohne eine Funktion aufzurufen. Die meisten Plugin-Autoren fügen den Code für die Seitengenerierung in eine Funktion in ihrer Haupt-Plugin-Datei ein. Wenn der Funktionsparameter angegeben ist, kann für den Dateiparameter eine beliebige Zeichenfolge verwendet werden. Dies ermöglicht die Verwendung von Seiten wie? Page = my_super_plugin_page anstelle von? Page = my-super-plugin/admin-options.php.

Ich kann also daraus schließen, dass, wenn Sie die Funktion leer lassen, versucht wird, eine PHP-Datei einzuschließen, die auf dem Wert basiert, auf den Sie den menu_slug gesetzt haben.

BEARBEITEN 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

Ich habe dieses Problem gelöst, indem ich einfach die ID (oder die Daten, die Sie benötigen) an den Menüpunkt angehängt habe.

Zum Beispiel:

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

Dies wird dann eine URL mit 'my-plugin-settings-filename' (als Beispiel) erstellen und ich kann nur diesen Teil der URL analysieren (mit $ _GET oder filter_input).

0
Jeff