¿Pasando argumentos a una devolución de llamada de la página del menú de administración?

12

Situación: Estoy trabajando en un complemento y lo estoy desarrollando como una clase, todo funcionó bien hasta que me encuentro con esta situación. Quería hacer las cosas un poco más limpias y probé esto ...

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

He probado un montón de opciones diferentes pero nada funciona, tal vez esté frente a él pero no puedo verlo.

Por supuesto, esto es una recreación. He prefijado todas mis funciones y no son exactamente como las que escribí aquí, pero espero que tengan la idea de lo que estoy pidiendo.

Gracias de antemano.

P.D .: Si desea ver el código fuente original, estaré encantado de pegarlo y darle el enlace.

    
pregunta Luis 05.05.2011 - 11:47

4 respuestas

7

No puede pasar un argumento a la función de devolución de llamada. add_menu_page() lo agrega como un controlador de acción , y admin.php activa la acción , sin ningún argumento.

Veo dos soluciones simples para este problema. Una es almacenar todo el nombre de archivo en una matriz de su clase, indexado por nombre de enlace. Luego, puede usar esto para buscar el archivo que necesita cargar (también puede almacenar datos adicionales en esta matriz).

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

La otra es omitir el argumento de devolución de llamada, por lo que WordPress incluirá el archivo indicado por el propio nombre de bala, como sugiere Brady en su respuesta.

    
respondido por el Jan Fabry 05.05.2011 - 15:05
4

Siempre se puede usar una función anónima (o cierre). Algo al efecto de:

add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position);
    
respondido por el user35752 25.07.2013 - 02:24
0

¿La función load_view debería ser así ?:

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

y en su archivo de inclusión debería hacerse eco de cualquier contenido de la página que se muestra.

EDITAR:

Esto es lo que dice el códice al respecto:

$menu_slug (string) (required) El nombre del slug para referirse a este menú por (debe ser único para este menú). Antes de la versión 3.0, este parámetro se llamaba archivo (o identificador). Si se omite el parámetro de la función, menu_slug debe ser el archivo PHP que maneja la visualización del contenido de la página del menú. Valor predeterminado: Ninguno

$function La función que muestra el contenido de la página para la página del menú. Técnicamente, el parámetro de función es opcional, pero si no se suministra, WordPress básicamente asumirá que incluir el archivo PHP generará la pantalla de administración, sin llamar a una función. La mayoría de los autores de complementos optan por colocar el código que genera la página en una función dentro de su archivo principal de complementos. En caso de que se especifique el parámetro de función, es posible utilizar cualquier cadena para el parámetro de archivo. Esto permite el uso de páginas como? Page = my_super_plugin_page en lugar de? Page = my-super-plugin / admin-options.php.

Entonces, lo que puedo deducir de esto es que si dejas la función vacía, intenta incluir un archivo php basado en lo que has configurado 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')
                 );
}
    
respondido por el Brady 05.05.2011 - 12:47
0

Resolví este problema simplemente agregando la ID (o cualquier información que necesites) a la barra de menú.

Por ejemplo:

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

Esto creará una URL con 'my-plugin-settings-filename' (como ejemplo), y puedo analizar esa parte de la URL (con $ _GET o filter_input).

    
respondido por el Jeff 19.02.2015 - 05:43

Lea otras preguntas en las etiquetas