web-dev-qa-db-fra.com

Ajout d'une page d'administrateur - OOP approche ne fonctionne pas

J'ai une classe parente, qui contient les éléments suivants:

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();
    }

}

Et la classe qui a les fonctions de la page admin:

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

Cette approche ne fonctionne pas et je ne peux pas voir mon article de menu administrateur ni ma page ajoutée. La deuxième approche que j'ai essayée:

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

Comment puis-je le faire fonctionner? Mon idée est de séparer tous les éléments liés au tableau de bord à l'autre classe.

Mise à jour: La première approche a fonctionné et l'élément de menu est ajouté. Mais la fonction de rappel qui génère le balisage de page ne semble pas fonctionner. J'ai vérifié les fautes de frappe mais tout semble bien aller.

2
Rutwick Gangurde

Je déteste OOP mélangé à la structure fonctionnelle de wordpress (voici les votes négatifs .....). Si vous utilisez OOP uniquement pour l'espacement des noms, utilisez simplement la fonction d'espacement des noms de PHP. Le fait de placer une fonction dans une classe ne représente qu'une toute petite partie de ce que OOP devrait être.

Quoi qu’il en soit, votre problème est qu’il n’existe que deux méthodes pour faire référence à une méthode de classe, soit quand elle est associée à un objet spécifique , soit si elle est statique dans la classe (fondamentalement associée à la classe mais pas à la objets). Dans votre code, vous essayez de traiter une fonction liée à un objet comme s'il s'agissait d'une fonction statique (je suis sûr que si vous vérifiez votre journal des erreurs, vous verrez une erreur pertinente). Il existe deux façons possibles de le résoudre: 1. Rendez les fonctions pertinentes statiques et utilisez la syntaxe de votre deuxième variante 2. utilisez un modèle singleton, instanciez un objet de la classe de tableau de bord, conservez-le en tant que global et utilisez-le à la place nom dans ta première variante au lieu de

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

faire

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

Et toujours déboguer le code avec le rapport d’erreur complet et corriger toutes les erreurs et les avis;)

3
Mark Kaplun

Exemple de travail

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

}

utiliser $ this avec la fonction de rappel

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