Agregar una página de administración - El enfoque OOP no funciona

2

Tengo una clase padre, que contiene lo siguiente:

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

}

Y la clase que tiene las funciones de la página de administración:

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

Este enfoque no funciona y no puedo ver mi elemento de menú de administrador ni la página agregada. El segundo enfoque lo intenté:

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

¿Cómo consigo que funcione? Mi idea es separar todas las cosas relacionadas con el tablero de mandos de la otra clase.

Actualización: El primer enfoque funcionó, y se agrega el elemento de menú. Pero la función de devolución de llamada que genera el marcado de la página no parece funcionar. Revisé los errores tipográficos, pero todo parece estar bien.

    
pregunta Rutwick Gangurde 01.09.2015 - 16:48

2 respuestas

3

Odio OOP mezclado en la estructura funcional de wordpress (aquí vienen los votos abajo .....). Si usa OOP solo para el espacio entre nombres, simplemente use la función de espacio entre nombres de PHP, poner la función en una clase es solo una parte muy pequeña de lo que debería ser OOP.

De todos modos, su problema es que solo hay dos formas de referirse a un método de clase, ya sea cuando está asociado con un objeto específico o si es estático en la clase (básicamente asociado con la clase pero no con los objetos). En su código, intenta tratar una función de enlace de objeto como si fuera una estática (estoy seguro de que si revisa su registro de errores verá algún error relevante). Hay dos formas posibles de arreglarlo. 1. Haga que las funciones relevantes sean estáticas y use la sintaxis en su segunda variación 2. use un patrón de singleton, cree una instancia de un objeto de la clase del panel, manténgalo como un elemento global y utilícelo en lugar del nombre de la clase en su primera variación. en lugar de

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

hacer

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

Y siempre depure el código con informes completos de errores y corrija todos los errores y avisos;)

    
respondido por el Mark Kaplun 01.09.2015 - 17:51
2

Ejemplo de trabajo

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

}

usa $ esto con la función de devolución de llamada

add_menu_page( 'Application Users', '...', ...', '...',array($this,'application_users_page'));
    
respondido por el Amjad Ali 24.02.2017 - 14:13

Lea otras preguntas en las etiquetas