Yönetici menüsü sayfası geri aramasına bağımsız değişken mi iletiliyor?


14

Durum: Bir eklenti üzerinde çalışıyorum ve bir sınıf olarak geliştiriyorum, bu duruma girene kadar her şey iyi çalıştı. İşleri biraz daha temiz hale getirmek istedim ve bunu denedim ..

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

Bir sürü farklı seçeneği denedim ama hiçbir şey işe yaramıyor, belki de önündeyim ama göremiyorum.

Tabii ki bu bir yeniden yaratım, tüm işlevlerimin önüne ekledim ve tam olarak burada yazdığım gibi değiller ama umarım istediğim fikri aldınız.

Şimdiden teşekkürler.

PD: Orijinal kaynak kodunu görmek istiyorsanız, yapıştırıp size bağlantıyı vermekten memnuniyet duyarım.

Yanıtlar:


8

Geri arama işlevine bağımsız değişken iletemezsiniz. add_menu_page()eylem eylemcisi olarak ekler ve herhangi bir argüman olmadan admin.phpeylemi başlatır.

Bu soruna iki basit çözüm görüyorum. Birincisi, tüm dosya adını, kanca adıyla dizine eklenmiş olarak sınıfınızdaki bir dizide saklamaktır. Daha sonra, yüklemeniz gereken dosyayı aramak için bunu kullanabilirsiniz (bu dizide ek veri de depolayabilirsiniz).

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

Diğeri geri arama argümanını atlamaktır, bu nedenle WordPress, Brady'nin cevabında önerdiği gibi slug adının kendisi tarafından belirtilen dosyayı içerecektir.


ah-ha neden böyle yapmayı düşünmedim :(
Brady

EVET!! bugün düzinelerce yavru kediyi kurtardın. Çok akıllıca bir çözüm. Yardımınız için çok teşekkürler @Brady @Jan Fabry
Luis

4

Her zaman anonim bir işlev (veya kapatma) kullanabilirsiniz. Etkisi olan bir şey:

add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position);

1
Bu benim için işe yaramıyor. WordPress 4.1 kullanıyorum (ve bugün 4.1.1 itibariyle)
Jeff Vdovjak

Zeki! Ve işe yarıyor. Daha eksiksiz bir örnek: hastebin.com/segibugice , example.com/wp-admin/admin.php?page=my-slug
Quinn Comendant

Değişkenleri anonim bir işlevin kapsamına aktarırken, "kullan" anahtar sözcüğünü kullanmanız gerekirdi. function() use ($my_var) { // now you can use $my_var }
user35752

0

load_view işlevi böyle mi olmalı ?:

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

ve içerme dosyanızda görüntülenen sayfa için herhangi bir içerik yankılanmalıdır.

DÜZENLE:

Kodeks konuyla ilgili şunları söylüyor:

$menu_slug (string) (required)Bu menüye başvuracak bilgi adı (bu menü için benzersiz olmalıdır). Sürüm 3.0'dan önce bu dosya (veya tanıtıcı) parametresi olarak adlandırıldı. Function parametresi atlanırsa, menu_slug, menü sayfası içeriğinin görüntülenmesini işleyen PHP dosyası olmalıdır. Varsayılan: Yok

$function Menü sayfası için sayfa içeriğini görüntüleyen işlev. Teknik olarak, function parametresi isteğe bağlıdır, ancak sağlanmazsa, WordPress temel olarak PHP dosyasını dahil etmenin bir işlev çağırmadan yönetim ekranını oluşturacağını varsayar. Çoğu eklenti yazarı, sayfa üreten kodu ana eklenti dosyasındaki bir işleve koymayı seçer .: function parametresinin belirtilmesi durumunda, file parametresi için herhangi bir dize kullanmak mümkündür. Bu,? Page = my-super-plugin / admin-options.php yerine? Page = my_super_plugin_page gibi sayfaların kullanılmasına izin verir.

Bu yüzden ne toplayabilir eğer fonksiyonu boş bırakırsanız, ne ayarladığınıza göre bir php dosyası dahil etmeye çalışır olmasıdır menu_slug.

DÜZENLEME 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 biliyorum, ve "load_view" fonksiyonu iyi çalışıyor ve statik bir değer kullanırken içeriği doğru çıktı. Örneğin: incl .... / views / my-panel.php ');
Luis

@Luis - O zaman sorun ne?
Brady

@Brady array (& $ this, 'load_view') // $ dosyaadı değerini nerede belirtebilirim ??. Dizi (& $ this, 'load_view ("my-value")') gibi bir şey yapamıyorum Aradığım işlevin parametrelerini iletmek için bir yol bulmak istiyorum
Luis

Ah şimdi anladım. Bir sınıf işlevini ancak bir parametreyle geçirmek istiyorsunuz. Baktım ve baktım ve nasıl yaptığını bulamıyorum. Ama dersi geçtiğiniz için EDIT 2'ye koyduğum şeyi yapamaz mısınız?
Brady

@Brady: İkinci düzenlemeniz pek yardımcı olmayacak, sadece filenamedeğişkeni geçersiz kılacaksınız, böylece her zaman olacak "somethingelse". İlk düzenlemeniz burada hile olabilir: load_viewdosyayı dahil etmek dışında hiçbir şey yapmazsanız , gerçekten bir geri arama işlevini geçmemelisiniz ve WordPress slug olarak geçtiğiniz sayfayı yüklemeye çalışacaktır.
Jan Fabry

0

Bu sorunu menü kimliğine sadece kimliği (veya ihtiyacınız olan verileri) ekleyerek çözdüm.

Örneğin:

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

Bu daha sonra 'my-plugin-settings-dosyaadı' ile bir URL oluşturur (örnek olarak) ve URL'nin bu kısmını ($ _GET veya filter_input ile) ayrıştırabilirim.


Bir URL parametresi de kullanabilirsiniz, ancak bir menü öğesi oluşturmanız gerekir (ve isterseniz bunu gizleyebilirsiniz).
Jeff Vdovjak

Kodumu toscho kod bloğuna koyduğunuz için teşekkürler. Bir soru sorduğumda bunun için bir düğme var, ancak bir cevapta yapmak için biçimlendirmeye aşina değilim.
Jeff Vdovjak

0

User35752 yanıtına dayanarak, geri arama olarak parametrelere sahip bir nesne yöntemi bile kullanabilirsiniz.

$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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.