Passando argumentos para um retorno de chamada da página do menu admin?

12

Situação: Estou trabalhando em um plugin e estou desenvolvendo como uma classe, tudo funcionou bem até eu me deparar com essa situação. Eu queria tornar as coisas um pouco mais limpas e tentei isso ...

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

Eu tentei várias opções diferentes, mas nada funciona, talvez eu esteja na frente, mas não consigo ver.

Claro que isso é uma recriação, prefixei todas as minhas funções e elas não são exatamente como escrevi aqui, mas espero que você tenha a idéia de que estou pedindo.

Agradecemos antecipadamente.

P. D.: Se você quiser ver o código-fonte original, ficarei feliz em colá-lo e fornecer o link.

    
por Luis 05.05.2011 / 11:47

4 respostas

7

Você não pode passar um argumento para a função de retorno de chamada. add_menu_page() o adiciona como um manipulador de ações e admin.php dispara a ação , sem quaisquer argumentos.

Eu vejo duas soluções simples para esse problema. Uma é armazenar todo o nome do arquivo em uma matriz em sua classe, indexada pelo nome do gancho. Então você pode usar isso para procurar o arquivo que precisa carregar (você também pode armazenar dados adicionais nesta 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';
    }
}

O outro é pular o argumento de callback, então o WordPress incluirá o arquivo indicado pelo próprio nome do slug, como Brady sugere em sua resposta.

    
por Jan Fabry 05.05.2011 / 15:05
4

Você sempre pode usar apenas uma função anônima (ou fechamento). Algo para o efeito de:

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

a função load_view deve ser assim:

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

e no seu arquivo de inclusão, ele deve ecoar qualquer conteúdo para a página que está sendo exibida.

EDITAR:

Aqui está o que o códice diz sobre o assunto:

$menu_slug (string) (required) O nome do slug para se referir a este menu por (deve ser exclusivo para este menu). Antes da versão 3.0, isso era chamado de parâmetro file (ou handle). Se o parâmetro da função for omitido, o menu_slug deverá ser o arquivo PHP que manipula a exibição do conteúdo da página do menu. Padrão: nenhum

$function A função que exibe o conteúdo da página para a página de menu. Tecnicamente, o parâmetro da função é opcional, mas se não for fornecido, o WordPress basicamente assumirá que incluir o arquivo PHP gerará a tela de administração, sem chamar uma função. A maioria dos autores de plugins opta por colocar o código de geração de páginas em uma função dentro de seu arquivo de plug-in principal: No caso em que o parâmetro de função é especificado, é possível usar qualquer string para o parâmetro de arquivo. Isso permite o uso de páginas como? Page = my_super_plugin_page em vez de? Page = meu-super-plugin / admin-options.php.

Então, o que eu posso aprender é que, se você deixar a função vazia, ela tentará incluir um arquivo php com base no que você configurou em 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')
                 );
}
    
por Brady 05.05.2011 / 12:47
0

Eu resolvi esse problema apenas adicionando o ID (ou qualquer dado que você precise) ao slug do menu.

Por exemplo:

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

Isso criará uma URL com 'meu-plugin-configurações-nome do arquivo' (como um exemplo), e eu posso apenas analisar essa parte da URL (com o $ _GET ou filter_input).

    
por Jeff 19.02.2015 / 05:43