กำลังส่งอาร์กิวเมนต์ไปยังการเรียกกลับหน้าเมนูผู้ดูแลระบบหรือไม่


14

สถานการณ์:ฉันทำงานกับปลั๊กอินและฉันพัฒนามันเป็นคลาสทุกอย่างทำงานได้ดีจนกระทั่งเจอสถานการณ์นี้ ฉันต้องการทำให้สิ่งต่าง ๆ สะอาดและลองสิ่งนี้ ..

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

ฉันได้ลองใช้ตัวเลือกที่แตกต่างกัน แต่ไม่มีอะไรทำงานบางทีฉันอยู่ข้างหน้ามัน แต่ฉันมองไม่เห็น

แน่นอนว่านี่คือการสร้างใหม่ฉันได้นำหน้าฟังก์ชั่นทั้งหมดของฉันและมันก็ไม่เหมือนกับที่ฉันเขียนที่นี่ แต่ฉันหวังว่าคุณจะมีความคิดว่าฉันจะขอ

ขอบคุณล่วงหน้า.

PD: ถ้าคุณต้องการดูซอร์สโค้ดต้นฉบับฉันยินดีที่จะวางและให้ลิงก์แก่คุณ

คำตอบ:


8

คุณไม่สามารถส่งอาร์กิวเมนต์ไปยังฟังก์ชันการเรียกกลับ add_menu_page()เพิ่มมันเป็นตัวจัดการการกระทำและadmin.phpไฟกระทำโดยไม่มีข้อโต้แย้งใด ๆ

ฉันเห็นวิธีแก้ไขปัญหาง่ายๆสองวิธีนี้ หนึ่งคือการจัดเก็บชื่อไฟล์ทั้งหมดในอาร์เรย์ในชั้นเรียนของคุณจัดทำดัชนีโดยใช้ชื่อเบ็ด จากนั้นคุณสามารถใช้สิ่งนี้เพื่อค้นหาไฟล์ที่คุณต้องการโหลด (คุณสามารถจัดเก็บข้อมูลเพิ่มเติมในอาร์เรย์นี้)

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

อีกอันคือข้ามอาร์กิวเมนต์โทรกลับดังนั้น WordPress จะรวมไฟล์ที่ระบุด้วยชื่อตัวบุ้งในขณะที่เบรดี้แนะนำในคำตอบของเขา


อ๋อทำไมไม่ได้ผมคิดว่าการทำมันเป็นอย่างนั้น :(
เบรดี้

ใช่!! คุณบันทึกลูกแมวหลายสิบตัวในวันนี้ .. ไม่เคยได้ยินถึงฟังก์ชั่นนั้นแม้ว่า 'current_filter' ทางออกที่ฉลาดมาก ขอบคุณมากสำหรับความช่วยเหลือของคุณ @Brady @Jan Fabry
Luis

4

คุณสามารถใช้ฟังก์ชันที่ไม่ระบุชื่อ (หรือปิด) ได้ตลอดเวลา บางสิ่งที่ส่งผลกระทบต่อ:

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

1
มันไม่ได้ผลสำหรับฉัน ฉันใช้ WordPress 4.1 (และ ณ วันนี้ 4.1.1)
Jeff Vdovjak

ฉลาด! และมันก็ใช้งานได้ ต่อไปนี้เป็นตัวอย่างที่สมบูรณ์มากขึ้น: hastebin.com/segibugiceซึ่งจะสร้าง URL เช่นexample.com/wp-admin/admin.php?page=my-slug
ควินน์

ฉันควรจะกล่าวถึงเมื่อส่งตัวแปรเข้าไปในขอบเขตของฟังก์ชั่นที่ไม่ระบุชื่อคุณต้องใช้คำหลัก "ใช้" function() use ($my_var) { // now you can use $my_var }
user35752

0

ฟังก์ชั่น load_view ควรเป็นเช่นนี้หรือไม่:

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

และในไฟล์รวมของคุณมันควรจะสะท้อนเนื้อหาใด ๆ สำหรับหน้าเว็บที่กำลังแสดง

แก้ไข:

นี่คือสิ่งที่ codex พูดในเรื่อง:

$menu_slug (string) (required)ชื่อกระสุนที่อ้างถึงเมนูนี้โดย (ควรไม่ซ้ำกันสำหรับเมนูนี้) ก่อนหน้าเวอร์ชัน 3.0 นี่เรียกว่าพารามิเตอร์ file (หรือ handle) หากไม่ได้ระบุพารามิเตอร์ฟังก์ชันไว้ menu_slug ควรเป็นไฟล์ PHP ที่จัดการการแสดงเนื้อหาของหน้าเมนู เริ่มต้น: ไม่มี

$function ฟังก์ชั่นที่แสดงเนื้อหาของหน้าสำหรับหน้าเมนู ในทางเทคนิคแล้วพารามิเตอร์ฟังก์ชั่นเป็นทางเลือก แต่ถ้าไม่ได้ระบุไว้ WordPress จะถือว่าโดยทั่วไปว่าการรวมไฟล์ PHP จะสร้างหน้าจอการดูแลระบบโดยไม่ต้องเรียกใช้ฟังก์ชัน ผู้สร้างปลั๊กอินส่วนใหญ่เลือกที่จะใส่รหัสการสร้างหน้าในฟังก์ชั่นภายในไฟล์ปลั๊กอินหลักของพวกเขา: ในกรณีที่มีการระบุพารามิเตอร์ฟังก์ชั่นมันเป็นไปได้ที่จะใช้สตริงใด ๆ สำหรับพารามิเตอร์ไฟล์ สิ่งนี้อนุญาตให้ใช้หน้าเช่น? page = my_super_plugin_page แทนที่จะเป็น? page = my-super-plugin / admin-options.php

ดังนั้นสิ่งที่ฉันสามารถรวบรวมจากนี้ก็คือว่าถ้าคุณออกจากฟังก์ชั่นที่ว่างเปล่าก็พยายามที่จะรวมไฟล์ PHP ที่ขึ้นอยู่กับสิ่งที่คุณได้ตั้งค่าmenu_slugการ

แก้ไข 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 ฉันรู้ว่าและฟังก์ชั่น "load_view" ทำงานได้ดีและส่งออกเนื้อหาอย่างถูกต้องเมื่อใช้ค่าคงที่ ตัวอย่างเช่น: รวม .... / views / my-panel.php ');
Luis

@Luis - แล้วปัญหาคืออะไร?
เบรดี้

อาร์เรย์ @Brady (& $ this, 'load_view') // ฉันจะระบุค่าของ $ filename ได้ที่ไหน? ฉันไม่สามารถทำอะไรเช่น array (& $ this, 'load_view ("my-value")') ฉันต้องการหาวิธีส่งพารามิเตอร์ไปยังฟังก์ชั่นที่ฉันโทรหา
ลูอิส

โอ้ฉันเข้าใจแล้ว คุณต้องการที่จะผ่านฟังก์ชั่นชั้นเรียน แต่มีพารามิเตอร์ ฉันเคยดูและมองและไม่สามารถหาวิธีที่คุณทำได้ แต่เมื่อคุณผ่านชั้นเรียนแล้วคุณไม่สามารถทำสิ่งที่ฉันใส่ไว้ใน EDIT 2 ได้หรือไม่?
เบรดี้

@Brady: แก้ไขที่สองของคุณจะไม่ช่วยมากคุณก็แทนที่ตัวแปรดังนั้นมันจะเป็นfilename "somethingelse"การแก้ไขครั้งแรกของคุณอาจเป็นกลอุบายที่นี่: หากload_viewไม่ทำอะไรเลยนอกจากการรวมไฟล์ไว้ด้วยคุณไม่ควรผ่านฟังก์ชั่นการโทรกลับและ WordPress จะพยายามโหลดหน้าเว็บที่คุณส่งผ่านเป็นกระสุน
Jan Fabry

0

ฉันแก้ไขปัญหานี้โดยเพียงต่อท้าย ID (หรือข้อมูลใด ๆ ที่คุณต้องการ) ไปที่เมนูกระสุน

ตัวอย่างเช่น:

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

สิ่งนี้จะสร้าง URL ด้วย 'my-plugin-settings-filename' (เป็นตัวอย่าง) และฉันสามารถแยกวิเคราะห์ส่วนนั้นของ URL (ด้วย $ _GET หรือ filter_input)


คุณสามารถใช้พารามิเตอร์ URL ได้ แต่คุณต้องสร้างรายการเมนู (จากนั้นคุณสามารถซ่อนได้หากต้องการ)
Jeff Vdovjak

ขอบคุณที่ใส่รหัสของฉันลงในบล็อครหัสเพื่อสลับ เมื่อฉันถามคำถามมีปุ่มสำหรับมัน แต่ฉันไม่คุ้นเคยกับมาร์กอัปที่จะทำมันในคำตอบ
Jeff Vdovjak

0

จากคำตอบของผู้ใช้35752คุณสามารถใช้วิธีการวัตถุกับ params เป็นการโทรกลับ

$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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.