एक व्यवस्थापक मेनू पृष्ठ कॉलबैक में तर्क पारित करना?


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

मैंने विभिन्न विकल्पों का एक गुच्छा लेने की कोशिश की है, लेकिन कुछ भी काम नहीं करता है, शायद मैं इसके सामने हूं लेकिन मैं इसे नहीं देख सकता।

बेशक यह एक पुन: निर्माण है, मैंने अपने सभी कार्यों को उपसर्ग किया है और वे बिल्कुल वैसा नहीं हैं जैसा मैंने यहां लिखा था, लेकिन मुझे आशा है कि आपको यह विचार मिला होगा कि मैं पूछ रहा हूं।

अग्रिम में धन्यवाद।

पीडी: यदि आप मूल स्रोत कोड देखना चाहते हैं तो मुझे इसे चिपकाने और लिंक देने में खुशी होगी।

जवाबों:


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

दूसरा कॉलबैक तर्क को छोड़ना है, इसलिए वर्डप्रेस में स्लग नाम से संकेतित फ़ाइल शामिल होगी, जैसा कि ब्रैडी ने अपने उत्तर में बताया है।


आह-हा, मैंने ऐसा करने के बारे में क्यों नहीं सोचा :(
ब्रैडी

हाँ !! आपने आज दर्जनों बिल्ली के बच्चे बचाए .. उस समारोह के बारे में कभी नहीं सुना, हालांकि 'करंट_फिल्टर'। बहुत चालाक समाधान। आपकी मदद के लिए बहुत बहुत धन्यवाद @Brady @Jan Fabry
लुइस

4

आप हमेशा एक अनाम फ़ंक्शन (या बंद) का उपयोग कर सकते हैं। के प्रभाव के लिए कुछ:

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

1
यह मेरे लिए काम नहीं करता है। मैं वर्डप्रेस 4.1 (और आज के 4.1.1 के अनुसार) का उपयोग कर रहा हूं
जेफ वडोवजक

चतुर! और यह काम करता है। यहाँ एक और अधिक पूर्ण उदाहरण दिया गया है: hastebin.com/segibugice जो एक URL जनरेट करेगा जैसे example.com/wp-admin/admin.php?page=my-slug
Quinn Comenders

अनाम फ़ंक्शन के दायरे में चर पास करते समय मुझे उल्लेख करना चाहिए, आपको "उपयोग" कीवर्ड का उपयोग करना होगा। function() use ($my_var) { // now you can use $my_var }
user35752

0

फ़ंक्शन load_view इस तरह होना चाहिए ?:

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

और आपकी शामिल फ़ाइल में पृष्ठ प्रदर्शित होने के लिए किसी भी सामग्री को प्रतिध्वनित करना चाहिए।

संपादित करें:

यहाँ कोडेक्स इस मामले पर क्या कहता है:

$menu_slug (string) (required)इस मेनू को इस मेनू से संदर्भित करने के लिए स्लग नाम (इस मेनू के लिए अद्वितीय होना चाहिए)। संस्करण 3.0 से पहले इसे फ़ाइल (या हैंडल) पैरामीटर कहा जाता था। यदि फ़ंक्शन पैरामीटर छोड़ा जाता है, तो menu_slug PHP फ़ाइल होनी चाहिए जो मेनू पृष्ठ सामग्री के प्रदर्शन को संभालती है। डिफ़ॉल्ट: कोई नहीं

$function वह फ़ंक्शन जो मेनू पृष्ठ के लिए पृष्ठ सामग्री प्रदर्शित करता है। तकनीकी रूप से, फ़ंक्शन पैरामीटर वैकल्पिक है, लेकिन यदि इसकी आपूर्ति नहीं की जाती है, तो वर्डप्रेस मूल रूप से यह मान लेगा कि PHP फ़ाइल सहित एक फ़ंक्शन को कॉल किए बिना, प्रशासन स्क्रीन उत्पन्न करेगा। अधिकांश प्लगइन लेखक अपनी मेन प्लगइन फाइल के भीतर एक फंक्शन में पेज-जनरेटिंग कोड डालने का विकल्प चुनते हैं ।: जिस फंक्शन पैरामीटर को निर्दिष्ट किया जाता है, उसमें फाइल पैरामीटर के लिए किसी भी स्ट्रिंग का उपयोग करना संभव है। इससे पेज के बजाय पेज = my_super_plugin_page? पेज = my-super-plugin / admin-options.php जैसे पेजों का उपयोग किया जा सकता है।

तो मैं इससे क्या इकट्ठा कर सकता हूं कि यदि आप फ़ंक्शन को खाली छोड़ देते हैं, तो आपने जो भी सेट किया है, उसके आधार पर एक php फ़ाइल शामिल करने की कोशिश करता 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')
                 );
}

@ ब्रैडी मुझे पता है कि, और फ़ंक्शन "load_view" अच्छी तरह से काम कर रहा है और स्थिर मूल्य का उपयोग करते समय सामग्री को सही ढंग से आउटपुट कर रहा है। उदाहरण के लिए: incl .... / views / my-panel.php ');
लुइस

@ उपर - फिर क्या मुद्दा?
ब्रैडी

@ ब्रैडी सरणी (& $ यह, 'load_view') // मैं $ फ़ाइल नाम का मूल्य कहां निर्दिष्ट करूं ??। मैं ऐरे जैसा कुछ नहीं कर सकता (और यह $, 'load_view ("my-value")') मैं उस फ़ंक्शन को पैरामीटर पास करने का एक तरीका खोजना चाहता हूं जिसे मैं कॉल कर रहा हूं
लुइस

ओह, अब मुझे समझ में आ गया। आप एक क्लास फंक्शन पास करना चाहते हैं लेकिन एक पैरामीटर के साथ। खैर Ive ने देखा और देखा और यह नहीं पाया कि आप इसे कैसे करते हैं। लेकिन जब से आप क्लास पास कर रहे हैं तो क्या आप ऐसा नहीं कर सकते जो मैंने EDIT 2 में रखा है?
ब्रैडी

@ ब्रैडी: आपका दूसरा एडिट ज्यादा मदद नहीं करेगा, आप सिर्फ filenameवैरिएबल को ओवरराइड करें तो यह हमेशा रहेगा "somethingelse"। आपका पहला संपादन यहां ट्रिक हो सकता है: यदि load_viewफ़ाइल को शामिल करने के अलावा कुछ भी नहीं है, तो आपको वास्तव में कॉलबैक फ़ंक्शन पास नहीं करना चाहिए और वर्डप्रेस आपके द्वारा स्लग के रूप में पारित पृष्ठ को लोड करने का प्रयास करेगा।
जान फेब्री

0

मैंने मेनू स्लग में सिर्फ आईडी (या जो भी डेटा आपको चाहिए) को जोड़कर इस समस्या को हल किया।

उदाहरण के लिए:

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

इसके बाद 'my-plugin-settings-filename' (उदाहरण के रूप में) के साथ एक URL बनाया जाएगा, और मैं सिर्फ URL के उस हिस्से ($ _GET या filter_input के साथ) को पार्स कर सकता हूं।


आप एक URL पैरामीटर का भी उपयोग कर सकते हैं, लेकिन आपको एक मेनू आइटम बनाना होगा (और फिर आप चाहें तो इसे छिपा सकते हैं)।
जेफ वडोवजक

एक कोड ब्लॉक toscho में अपना कोड डालने के लिए धन्यवाद। जब मैं एक प्रश्न पूछता हूं तो इसके लिए एक बटन होता है, लेकिन मैं एक उत्तर में इसे करने के लिए मार्कअप से परिचित नहीं हूं।
जेफ वडोवजक

0

User35752 उत्तर के आधार पर , आप कॉलबैक के रूप में परमेस के साथ ऑब्जेक्ट विधि का उपयोग भी कर सकते हैं।

$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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.