Funcționează admin_print_scripts-$hook_suffix pentru căi imbricate către fișiere individuale?

11 feb. 2011, 12:32:55
Vizualizări: 869
Voturi: 0

Poate fi folosit hook-ul admin_print_scripts-$hook_suffix pentru un hook creat astfel: $hookname = get_plugin_page_hookname("my-quiz/lib/admin/$code_page", '' );?

.. unde $code_page este somefilename.php.

Am încercat și nu pare să funcționeze. Cred că este din cauza căii fișierului?

ACTUALIZARE

Ceea ce este înregistrat de codul de mai sus este 'admin_page_my-quiz/lib/admin/question_form' dar acesta funcționează doar într-o pagină dacă faci:

<a href="<?php echo admin_url('admin.php?page=my-quiz/lib/admin/question_form.php&question=edit&question='.$question->ID); ?>" class='edit'>
        <?php _e('Editează', 'my-locale'); ?>
        </a>

Trebuie să adaug sufixul .php pentru ca link-ul să funcționeze, altfel primesc eroarea 'nu ai permisiunea'.

Funcția @t31os afișează 'nmsi-quiz/lib/admin/question_form.php' și astfel nu se potrivește cu 'admin_page_my-quiz/lib/admin/question_form'

acesta funcționează - add_action( 'admin_print_scripts-'.'my-quiz/lib/admin/question_form.php', array($this,'enqueue_my_js'));

Codul solicitat:

$plugin_scripts = array('question_form.php', 'manage_questions.php');

foreach($plugin_scripts as $code_page) {
    $hookname = get_plugin_page_hookname("my-quiz/lib/admin/$code_page", '' );
    $_registered_pages[$hookname] = true;
    //fb($hookname);

}
4
Comentarii

Pot să văd codul pe care îl folosești pentru a înregistra paginile pluginului, adică apelurile add_menu_page și add_submenu_page (sau echivalentele)..

t31os t31os
12 feb. 2011 11:05:54

Am adăugat. Îmi dau seama că acesta este un mod nestandard de a face lucrurile și că nu folosesc add_menu_page(). Asta pentru că nu vreau aceste pagini în meniu. Sunt conștient de problemele legate de acest lucru. http://wordpress.stackexchange.com/questions/7812/what-is-the-recommended-way-to-create-plugin-administration-forms

codecowboy codecowboy
12 feb. 2011 13:56:06

Problema este că nu poți avea pagini înregistrate care să nu existe în meniu, în orice caz vei pierde o parte din funcționalitate dacă doar adaugi paginile în array-urile corespunzătoare, deoarece codul de bază are așteptări ca paginile înregistrate să existe într-o oarecare măsură atât în array-ul $menu cât și în $submenu.. Aș putea sugera să arunci o privire la funcțiile add_menu_page și add_submenu_page pentru a vedea ce fac cu datele primite (asta îți va oferi o idee despre ce face WordPress cu paginile înregistrate folosind aceste funcții - adică în ce array-uri le adaugă, etc..)

t31os t31os
14 feb. 2011 17:03:37

Am adăugat niște cod exemplu și comentarii suplimentare la răspunsul meu.

t31os t31os
14 feb. 2011 18:22:07
Toate răspunsurile la întrebare 1
0

Cred că este într-adevăr o întrebare dacă acel cod furnizează numele corect al hook-ului pentru pagina respectivă.

Iată o funcție simplă pe care o poți folosi pentru a afișa hook suffix pe fiecare pagină de administrare, va apărea într-o casetă de eroare roșie (astfel va fi ușor de observat) doar pentru administratori.

add_action( 'admin_notices', 'print_admin_pagehook' );
function print_admin_pagehook() {
    global $hook_suffix;
    if( !current_user_can( 'manage_options') )
        return;
    ?>
    <div class="error"><p><?php echo $hook_suffix; ?></p></div>
    <?php 
}

Încarcă pagina cu care ai probleme și compară valoarea pe care o vezi în casetă cu ceea ce obții din codul pe care l-ai postat.

Adăugare
Continuând din ultimul meu comentariu, poți face de fapt ceva de genul acesta..

add_action( 'admin_menu', 'testing_registered_pages', 100 );
function testing_registered_pages() {
    global $_registered_pages, $submenu;
    $plugin_scripts = array( 
        'Formular Întrebări' => array( 'page' => 'question_form', 'callback' => 'my_callback_1' ), 
        'Gestionează Întrebări' => array( 'page' => 'manage_questions', 'callback' => 'my_callback_2' ) 
    );
    foreach( $plugin_scripts as $title => $my_pages ) {
        $hookname = get_plugin_page_hookname("my-quiz/lib/admin/$my_pages[page]", 'my-quiz' );
        $_registered_pages[$hookname] = true;
        $submenu['my-quiz'][] = array( $title, 'manage_options', "my-quiz/lib/admin/$my_pages[page]", $title );
        add_action( $hookname, $my_pages['callback'] );
    }
}

// Elimină add_action pentru a referenția fișiere reale, lasă-l dacă vrei să folosești o funcție callback

...există o singură problemă cu această abordare, și anume posibilitatea de a înfrânge cerințele de capabilitate ale paginilor.

Uită-te la acest URL.

example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions

Putem înfrânge verificarea de capabilitate prin interogarea pentru..

example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions.php

Dacă modificăm codul de mai devreme să folosească extensia de fișier, de ex..

    $plugin_scripts = array( 
        'Formular Întrebări' => array( 'page' => 'question_form.php', 'callback' => 'my_callback_1' ), 
        'Gestionează Întrebări' => array( 'page' => 'manage_questions.php', 'callback' => 'my_callback_2' ) 
    );

..și opțional dezactivăm callback-urile, adică să folosim un fișier real..

// add_action( $hookname, $my_pages['callback'] ); 

..atunci obținem..

example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions.php

..este totuși posibil să înfrângi cerințele de capabilitate folosind..

example.com/wp-admin/admin.php?page=my-quiz/lib/admin/manage_questions

Indiferent dacă folosești un fișier real sau o funcție callback, în ambele cazuri cerințele de capabilitate (ca mai sus) pot fi ocolite (evident, acesta nu este un comportament dorit).

11 feb. 2011 12:50:24