কোনও অ্যাডমিন মেনু পৃষ্ঠা কলব্যাকটিতে তর্ক বিতরণ করছেন?


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

অন্যটি কলব্যাক আর্গুমেন্টটি এড়িয়ে চলবে, সুতরাং ব্র্যাডি তার উত্তরটিতে যেমন স্লাগ নাম দ্বারা নির্দেশিত ফাইলটি অন্তর্ভুক্ত করবে।


আহ-হা কেন আমি সেভাবে এটি করার কথা ভাবিনি :(
ব্র্যাডি

হাঁ !! আপনি আজ কয়েক ডজন বিড়ালছানা সংরক্ষণ করেছেন .. 'কারেন্ট_ফিল্টার' হলেও এই ফাংশনটি কখনও শুনেনি। খুব চতুর সমাধান। আপনার ব্র্যাডি @ জন ফ্যাব্রি
লুইস

4

আপনি সর্বদা একটি বেনাম ফাংশন (বা বন্ধ) ব্যবহার করতে পারেন। এর প্রভাবকে কিছু:

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

1
এটি আমার পক্ষে কাজ করে না। আমি ওয়ার্ডপ্রেস ব্যবহার করছি 4.1 (এবং আজ
অবধি

চতুর! এবং এটি কাজ করে। এখানে আরো একটি সম্পূর্ণ উদাহরণ আছে: hastebin.com/segibugice যা মত একটি URL উৎপন্ন হবে example.com/wp-admin/admin.php?page=my-slug
কুইন Comendant

একটি বেনাম ফাংশনের সুযোগে ভেরিয়েবলগুলি পাস করার সময় আমার উল্লেখ করা উচিত ছিল, আপনাকে "ব্যবহার" কীওয়ার্ডটি ব্যবহার করতে হবে। function() use ($my_var) { // now you can use $my_var }
ব্যবহারকারী 35752

0

ফাংশন লোড_ভিউ এর মতো হওয়া উচিত ?:

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

এবং আপনার অন্তর্ভুক্ত ফাইলে এটি পৃষ্ঠাটি প্রদর্শিত হওয়ার জন্য যে কোনও সামগ্রী প্রতিধ্বনি করা উচিত।

সম্পাদনা করুন:

এই বিষয়ে কোডেক্স কী বলছেন তা এখানে:

$menu_slug (string) (required)এই মেনুটি দ্বারা উল্লেখ করার জন্য স্লাগ নামটি (এই মেনুটির জন্য অনন্য হওয়া উচিত)। সংস্করণ 3.0 এর আগে এটিকে ফাইল (বা হ্যান্ডেল) পরামিতি বলা হত। যদি ফাংশন প্যারামিটার বাদ দেওয়া হয়, মেনু_স্লাগটি পিএইচপি ফাইল হওয়া উচিত যা মেনু পৃষ্ঠার সামগ্রীর প্রদর্শন পরিচালনা করে। ডিফল্ট: কিছুই নয়

$function ফাংশন যা মেনু পৃষ্ঠার জন্য পৃষ্ঠা সামগ্রী প্রদর্শন করে। প্রযুক্তিগতভাবে, ফাংশন প্যারামিটারটি isচ্ছিক, তবে যদি এটি সরবরাহ না করা হয়, তবে ওয়ার্ডপ্রেস মূলত পিএইচপি ফাইল সহ কোনও ফাংশন না ডেকে প্রশাসনের স্ক্রিন তৈরি করবে বলে ধরে নেবে। বেশিরভাগ প্লাগইন লেখকরা তাদের প্রধান প্লাগইন ফাইলের মধ্যে একটি ফাংশনটিতে পৃষ্ঠা-উত্পন্ন কোড স্থাপন করা পছন্দ করেন :: ফাংশন প্যারামিটার নির্দিষ্ট করা ইভেন্টে ফাইল প্যারামিটারের জন্য কোনও স্ট্রিং ব্যবহার করা সম্ভব। এটি পৃষ্ঠার পরিবর্তে? পৃষ্ঠা = আমার_সুপার_প্লুগিন_পৃষ্ঠা = পৃষ্ঠায় = আমার-সুপার-প্লাগইন / অ্যাডমিন-অপশন.পিপি এর মতো পৃষ্ঠাগুলি ব্যবহারের অনুমতি দেয়।

সুতরাং আমি এর থেকে যা সংগ্রহ করতে পারি তা হ'ল যদি আপনি ফাংশনটি খালি ছেড়ে দেন তবে এটি আপনাকে কী সেট করেছেন তার উপর ভিত্তি করে কোনও পিএইচপি ফাইল অন্তর্ভুক্ত করার চেষ্টা 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')
                 );
}

@ ব্র্যাডি আমি জানি যে, এবং একটি স্ট্যাটিক মান ব্যবহার করার সময় "লোডভিউ" ফাংশনটি ভালভাবে কাজ করছে এবং সামগ্রীটি সঠিকভাবে আউটপুট করছে। উদাহরণস্বরূপ: Incl .... / ভিউ / আমার-প্যানেল.এফপি ');
লুইস

@ লুইস - তাহলে সমস্যা কি?
ব্র্যাডি

@ ব্র্যাডি অ্যারে (& $ এটি, 'লোড_ভিউ') // আমি $ ফাইলনামের মান কোথায় নির্দিষ্ট করব ?? আমি অ্যারের মতো কিছু করতে পারি না (এবং $ এটি, 'লোড_ভিউ ("আমার-মান")')) আমি যে ফাংশনটি কল করছি তার পরামিতিগুলি পাস করার একটি উপায় খুঁজে পেতে চাই
লুইস

ওহ আমি এখন এটি পেতে। আপনি একটি ক্লাস ফাংশন পাস করতে চান তবে একটি পরামিতি সহ। আচ্ছা আমি তাকিয়ে দেখেছি এবং আপনি এটি কীভাবে খুঁজে পান তা খুঁজে পাচ্ছেন না। আপনি যেহেতু ক্লাসে পাশ করছেন তাই আপনি যেটা এডিআইটি 2 তে রেখেছি তা কি পারবেন না?
ব্র্যাডি

@ ব্র্যাডি: আপনার দ্বিতীয় সম্পাদনাটি খুব বেশি কাজে আসবে না, আপনি কেবল filenameপরিবর্তনশীলকে ওভাররাইড করবেন যাতে এটি সর্বদা থাকবে "somethingelse"। আপনার প্রথম সম্পাদনাটি এখানে কৌতুক হতে পারে: যদি load_viewফাইলটি অন্তর্ভুক্ত করা ব্যতীত অন্য কিছু না করে তবে আপনার কলব্যাক ফাংশনটি পাস করা উচিত নয় এবং ওয়ার্ডপ্রেস আপনার স্লাগ হিসাবে পাস করা পৃষ্ঠাটি লোড করার চেষ্টা করবে।
জান ফ্যাব্রি

0

আমি কেবল আইডি (বা আপনার যে কোনও ডেটা প্রয়োজন) মেনু স্লাগে যুক্ত করে এই সমস্যার সমাধান করেছি।

উদাহরণ স্বরূপ:

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

এরপরে এটি 'মাই-প্লাগ-ইন-সেটিংস-ফাইল নাম' (উদাহরণ হিসাবে) দিয়ে একটি ইউআরএল তৈরি করবে এবং আমি ইউআরএলের সেই অংশটি (ars _GET বা ফিল্টার_ইনপুট দিয়ে) পার্স করতে পারি।


আপনি একটি ইউআরএল প্যারামিটারও ব্যবহার করতে পারেন তবে আপনাকে একটি মেনু আইটেম তৈরি করতে হবে (এবং তারপরে আপনি চাইলে এটি আড়াল করতে পারেন)।
জেফ ভদভজাক

আমার কোডটি একটি কোড ব্লক টসচোতে রাখার জন্য ধন্যবাদ। আমি যখন কোন প্রশ্ন জিজ্ঞাসা করি তখন এর জন্য একটি বোতাম আছে, তবে আমি উত্তরটিতে এটি করার জন্য মার্কআপের সাথে পরিচিত নই।
জেফ ভদভজাক

0

ব্যবহারকারীর 35752 উত্তরের ভিত্তিতে , আপনি এমনকি কলব্যাক হিসাবে প্যারামগুলির সাথে কোনও অবজেক্ট পদ্ধতি ব্যবহার করতে পারেন।

$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.