Melewati argumen ke panggilan balik halaman menu admin?

14

Situasi: Saya sedang mengerjakan sebuah plugin dan saya mengembangkannya sebagai sebuah kelas, semuanya bekerja dengan baik sampai saya mengalami situasi ini. Saya ingin membuat segalanya lebih bersih dan mencoba ini ..

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

Saya sudah mencoba banyak opsi berbeda tetapi tidak ada yang berhasil, mungkin saya ada di depannya tetapi saya tidak bisa melihatnya.

Tentu saja ini adalah kreasi ulang, saya telah mengawali semua fungsi saya dan mereka tidak persis seperti yang saya tulis di sini tapi saya harap Anda mendapat ide yang saya minta.

Terima kasih sebelumnya.

PD: Jika Anda ingin melihat kode sumber asli saya akan dengan senang hati menempelkannya dan memberi Anda tautan.

Luis
sumber

Jawaban:

8

Anda tidak bisa meneruskan argumen ke fungsi panggilan balik. add_menu_page()menambahkannya sebagai penangan tindakan , dan admin.phpmemecat tindakan , tanpa argumen.

Saya melihat dua solusi sederhana untuk masalah ini. Pertama adalah menyimpan semua nama file dalam array di kelas Anda, diindeks dengan nama hook. Kemudian Anda dapat menggunakan ini untuk mencari file apa yang perlu Anda muat (Anda juga dapat menyimpan data tambahan dalam array ini).

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

Yang lain adalah untuk melewatkan argumen panggilan balik, sehingga WordPress akan menyertakan file yang ditunjukkan oleh nama siput itu sendiri, seperti yang disarankan Brady dalam jawabannya.

Jan Fabry
sumber
ah-ha kenapa aku tidak berpikir untuk melakukan itu :(
Brady
YA!! Anda menyimpan lusinan anak kucing hari ini .. tidak pernah mendengar fungsi itu meskipun 'current_filter'. Solusi yang sangat pintar. Terima kasih banyak atas bantuan Anda @Brady @Jan Fabry
Luis
4

Anda selalu bisa menggunakan fungsi anonim (atau penutupan). Sesuatu yang mempengaruhi:

add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position);
pengguna35752
sumber
1
Ini tidak berhasil untuk saya. Saya menggunakan WordPress 4.1 (dan hari ini 4.1.1)
Jeff Vdovjak
Pintar! Dan itu berhasil. Berikut adalah contoh yang lebih lengkap: hastebin.com/segibugice yang akan menghasilkan URL seperti example.com/wp-admin/admin.php?page=my-slug
Quinn Comendant
Saya seharusnya menyebutkan ketika meneruskan variabel ke dalam lingkup fungsi anonim, Anda harus menggunakan kata kunci "gunakan". function() use ($my_var) { // now you can use $my_var }
user35752
0

fungsi load_view harus seperti ini ?:

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

dan di file sertakan Anda itu harus menggemakan konten apa pun untuk halaman yang ditampilkan.

EDIT:

Berikut adalah apa kata kodeks tentang masalah ini:

$menu_slug (string) (required)Nama siput untuk merujuk ke menu ini oleh (harus unik untuk menu ini). Sebelum Versi 3.0 ini disebut parameter file (atau handle). Jika parameter fungsi dihilangkan, menu_slug harus berupa file PHP yang menangani tampilan konten halaman menu. Default: Tidak Ada

$function Fungsi yang menampilkan konten halaman untuk halaman menu. Secara teknis, parameter fungsi adalah opsional, tetapi jika tidak disediakan, maka WordPress pada dasarnya akan menganggap bahwa menyertakan file PHP akan menghasilkan layar administrasi, tanpa memanggil fungsi. Sebagian besar penulis plugin memilih untuk menempatkan kode penghasil halaman dalam suatu fungsi di dalam file plugin utama mereka.: Jika parameter fungsi ditentukan, dimungkinkan untuk menggunakan string apa pun untuk parameter file. Ini memungkinkan penggunaan halaman seperti? Page = my_super_plugin_page bukan? Page = my-super-plugin / admin-options.php.

Jadi yang saya dapat kumpulkan dari ini adalah bahwa jika Anda membiarkan fungsi kosong itu mencoba untuk memasukkan file php berdasarkan apa yang telah Anda atur menu_sluguntuk.

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')
                 );
}
Brady
sumber
@ Brady Saya tahu itu, dan fungsi "load_view" bekerja dengan baik dan mengeluarkan konten dengan benar saat menggunakan nilai statis. Misalnya: termasuk .... / views / my-panel.php ');
Luis
@Luis - Lalu apa masalahnya?
Brady
@Brady array (& $ this, 'load_view') // Di mana saya menentukan nilai $ filename ??. Saya tidak dapat melakukan sesuatu seperti array (& $ this, 'load_view ("my-value")') Saya ingin menemukan cara untuk mengirimkan parameter ke fungsi yang saya panggil
Luis
Oh, aku mengerti sekarang. Anda ingin melewatkan fungsi kelas tetapi dengan parameter. Yah aku sudah melihat dan melihat dan tidak dapat menemukan bagaimana Anda melakukannya. Tetapi karena Anda lulus kelas maka tidak bisakah Anda melakukan apa yang saya masukkan dalam EDIT 2?
Brady
@ Brady: Suntingan kedua Anda tidak akan banyak membantu, Anda hanya perlu mengganti filenamevariabelnya agar selalu seperti itu "somethingelse". Suntingan pertama Anda bisa menjadi trik di sini: jika load_viewtidak melakukan apa pun kecuali untuk menyertakan file, Anda memang seharusnya tidak melewati fungsi panggilan balik dan WordPress akan mencoba memuat halaman yang Anda lewati sebagai siput.
Jan Fabry
0

Saya memecahkan masalah ini dengan hanya menambahkan ID (atau data apa pun yang Anda perlukan) ke siput menu.

Sebagai contoh:

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

Ini kemudian akan membuat URL dengan 'my-plugin-settings-filename' (sebagai contoh), dan saya bisa mem-parsing bagian URL itu (dengan $ _GET atau filter_input).

Jeff Vdovjak
sumber
Anda juga bisa menggunakan parameter URL, tetapi Anda harus membuat item menu (dan kemudian Anda bisa menyembunyikannya jika Anda mau).
Jeff Vdovjak
Terima kasih telah memasukkan kode saya ke blok kode toscho. Ketika saya mengajukan pertanyaan ada tombol untuk itu, tapi saya tidak terbiasa dengan markup untuk melakukannya dalam sebuah jawaban.
Jeff Vdovjak
0

Berdasarkan jawaban user35752 , Anda bahkan dapat menggunakan metode objek dengan params sebagai panggilan balik.

$args = [ [new Foo(), 'bar'], [$param1, $param2, ...] ];

$callback = function () use ($args){
                call_user_func_array($args[0], $args[1]);
            };
add_menu_page( $page, $menu, $capability, $slug, $callback , $icon, $position)
Tuan Gretix
sumber