관리자 메뉴 페이지 콜백에 인수를 전달 하시겠습니까?


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

다른 하나는 콜백 인수를 건너 뛰는 것이므로 Brady가 그의 대답에서 제안한 것처럼 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
이것은 나를 위해 작동하지 않습니다. 나는 워드 프레스 4.1을 사용하여 (오늘 4.1.1의 같은과) 해요
제프 Vdovjak

영리한! 그리고 그것은 작동합니다. 다음은보다 완벽한 예입니다 hastebin.com/segibugice 같은 URL 생성 할 example.com/wp-admin/admin.php?page=my-slug
퀸 Comendant

변수를 익명 함수의 범위로 전달할 때는 "use"키워드를 사용해야합니다. 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 이전에는이를 파일 (또는 핸들) 매개 변수라고했습니다. function 매개 변수를 생략하면 menu_slug는 메뉴 페이지 컨텐츠의 표시를 처리하는 PHP 파일이어야합니다. 기본값 : 없음

$function 메뉴 페이지의 페이지 내용을 표시하는 기능입니다. 기술적으로 함수 매개 변수는 선택 사항이지만, 제공되지 않은 경우 WordPress는 기본적으로 PHP 파일을 포함하면 함수를 호출하지 않고 관리 화면을 생성한다고 가정합니다. 대부분의 플러그인 작성자는 페이지 생성 코드를 기본 플러그인 파일 내의 함수에 넣습니다. 함수 매개 변수가 지정된 경우 파일 매개 변수에 문자열을 사용할 수 있습니다. 이를 통해? page = my-super-plugin / admin-options.php 대신? page = my_super_plugin_page와 같은 페이지를 사용할 수 있습니다.

그래서 내가 이것에서 수집 할 수있는 것은 함수를 비워두면 설정 한 내용에 따라 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"가 올바르게 작동하고 정적 값을 사용할 때 내용을 올바르게 출력합니다. 예 : incl .... / views / my-panel.php ');
Luis

@Luis-그렇다면 무엇이 문제입니까?
Brady

@Brady array (& $ this, 'load_view') // $ filename의 값을 어디에서 지정합니까 ??. array (& $ this, 'load_view ( "my-value")')와 같은 작업을 수행 할 수 없습니다. 호출하는 함수에 매개 변수를 전달하는 방법을 찾고 싶습니다
Luis

아, 이제 알겠다 클래스 함수를 전달하지만 매개 변수를 사용하려고합니다. 글쎄, 나는 보았고 보았고 어떻게하는지 찾을 수 없었습니다. 그러나 수업을 통과했기 때문에 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'
                     );

그런 다음 'my-plugin-settings-filename'(예 :)으로 URL을 만들고 URL의 해당 부분을 $ _GET 또는 filter_input으로 구문 분석 할 수 있습니다.


URL 매개 변수를 사용할 수도 있지만 메뉴 항목을 만들어야합니다 (원하는 경우 숨길 수 있음).
Jeff Vdovjak

코드를 toscho 코드 블록에 넣어 주셔서 감사합니다. 질문을 할 때 버튼이 있지만 답변에서 마크 업에 익숙하지 않습니다.
Jeff Vdovjak

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.