it-swarm.com.ru

Передача аргументов в обратный вызов страницы меню администратора?

Ситуация: Я работаю над плагином и разрабатываю его как класс, все работало нормально, пока я не столкнулся с этой ситуацией. Я хотел сделать вещи немного чище и попробовал это ..

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

Я пробовал кучу разных вариантов, но ничего не работает, может быть, я перед этим, но я не вижу его.

Конечно, это воссоздание, я поставил перед всеми своими функциями префиксы, и они не совсем такие, как я написал здесь, но я надеюсь, что вы поняли, о чем я прошу.

Заранее спасибо.

П.Д .: Если вы хотите увидеть оригинальный исходный код, я буду рад вставить его и дать ссылку.

12
Luis

Вы не можете передать аргумент в функцию обратного вызова. 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 будет включать файл, указанный самим именем слага, как предполагает Брейди в своем ответе.

7
Jan Fabry

Вы всегда можете просто использовать анонимную функцию (или замыкание). Что-то на эффект:

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

функция load_view должна быть такой?

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

и в вашем включаемом файле он должен отображать любой контент для отображаемой страницы.

Правка:

Вот что говорит Кодекс по этому вопросу:

$menu_slug (string) (required) Имя пули, к которому относится это меню (должно быть уникальным для этого меню). До версии 3.0 это называлось параметром файла (или дескриптора). Если параметр функции опущен, то 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')
                 );
}
0
Brady

Я решил эту проблему, просто добавив идентификатор (или любые другие данные, которые вам нужны) в слаг меню.

Например:

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

0
Jeff