it-swarm.com.de

Hinzufügen einer Admin-Seite - OOP Ansatz funktioniert nicht

Ich habe eine Elternklasse, die Folgendes enthält:

use app\My_Dashboard;

class My_Class {
    public function __construct() {
        add_action('admin_menu', array($this, 'setup_dashboard_page'));
    }

    public function setup_dashboard_page() {
        My_Dashboard::add_dashboard_page();
    }

}

Und die Klasse, die die Admin-Seite hat, funktioniert:

class My_Dashboard {
    public static function add_dashboard_page() {
        add_menu_page('My Settings', 'My Settings', 'my-settings', array($this, 'dashboard_page_cb'));
    }

    public function dashboard_page_cb() {
        //The markup
    }
}

Dieser Ansatz funktioniert nicht und ich kann meinen Admin-Menüpunkt und die hinzugefügte Seite nicht sehen. Der zweite Ansatz, den ich versucht habe:

use app\My_Dashboard;

class My_Class {
    public function __construct() {
        add_action('admin_menu', array($this, 'setup_dashboard_page'));
    }

    public function setup_dashboard_page() {
        //Not very sure of the syntax, bad at OOP
        add_menu_page('My Settings', 'My Settings', 'my-settings', 'My_Dashboard::dashboard_page_cb');
    }
}

Wie bringe ich es zum Laufen? Meine Idee ist es, das gesamte Dashboard-bezogene Material der anderen Klasse zuzuordnen.

Update: Der erste Ansatz hat funktioniert, und der Menüpunkt wird hinzugefügt. Die Rückruffunktion, die das Seiten-Markup ausgibt, scheint jedoch nicht zu funktionieren. Ich habe nach Tippfehlern gesucht, aber alles scheint in Ordnung zu sein.

2

Ich hasse OOP gemischt in die Funktionsstruktur von WordPress (hier kommen die Abwertungen .....). Wenn Sie OOP nur für den Namensabstand verwenden, dann verwenden Sie einfach die Namensabstandsfunktion von PHP. Das Einfügen von Funktionen in eine Klasse ist nur ein sehr kleiner Teil dessen, was OOP sein sollte.

Wie auch immer, Ihre Probleme bestehen darin, dass es nur zwei Möglichkeiten gibt, auf eine Klassenmethode zu verweisen, entweder wenn sie einem spezifischen Objekt zugeordnet ist oder wenn sie in der Klasse statisch ist (im Grunde der Klasse zugeordnet, aber nicht der Objekte). In Ihrem Code versuchen Sie, eine objektgebundene Funktion so zu behandeln, als wäre sie statisch (ich bin sicher, dass Sie einen relevanten Fehler sehen, wenn Sie Ihr Fehlerprotokoll überprüfen). Es gibt zwei Möglichkeiten, dies zu beheben: 1. Machen Sie die relevanten Funktionen statisch und verwenden Sie die Syntax in Ihrer zweiten Variante. 2. Verwenden Sie ein Singleton-Muster, instanziieren Sie ein Objekt der Dashboard-Klasse, behalten Sie es als global bei und verwenden Sie es anstelle der Klasse Name in Ihrer ersten Variation. anstatt

public function setup_dashboard_page() {
    My_Dashboard::add_dashboard_page();
}

tun

global $dashboard;
$dashboard = new my_dashboard()
.....
public function setup_dashboard_page() {
   global $dashboard;
    $dashboard->add_dashboard_page();
}

Und debuggen Sie immer Code mit vollständiger Fehlerberichterstattung und beheben Sie alle Fehler und Hinweise;)

3
Mark Kaplun

Arbeitsbeispiel

class PluginSkeleton {

     public function __construct(){
          add_action('admin_menu',array($this,'pluginskeleton_menu'));
     }
     public function pluginskeleton_menu(){
         add_menu_page( 'Application Users', 'Application Users', 'manage_options', 'application-users.php',array($this,'application_users_page'));
     }

    public function application_users_page(){
          echo 'i am here';
     }

}

benutze $ this mit Rückruffunktion

add_menu_page( 'Application Users', '...', ...', '...',array($this,'application_users_page'));
2
Amjad Ali