Cum implementez un dialog modal jQuery UI într-un plugin WordPress?

18 ian. 2012, 14:00:52
Vizualizări: 16.4K
Voturi: 4

Am un plugin WordPress creat care adaugă un meniu principal personalizat și submeniuri. Submeniul apelează acest cod (vezi mai jos), formularul PHP BranchMaintenance, care afișează filiale într-un tabel din baza de date (folosind $wpdb).

Problema apare la afișarea corectă a formularului modal jQuery UI. Codul meu este probabil responsabil... sunt confuz în legătură cu aspecte precum variabilele fără nume sau funcțiile globale precum în codul de mai jos, de exemplu $(function() {

Încerc să încarc scripturile necesare pentru: a) ascunderea inițială a formularului dialog (apare deasupra tabelului cu datele filialelor)... probabil am greșit aici b) afișarea lui la apelare (aici încă folosesc codul original din demo)

<div class="wrap" id="main">
<form name="Sandwich Baron Branch Maintenance" method="post" action="<?php echo str_replace( '%   7E', '~', $_SERVER['REQUEST_URI']); ?>">  

<!-- Acest cod era plasat în head-ul unui formular HTML normal în Demo 'http://jqueryui.com/demos/dialog/modal-form.html'... validarea câmpurilor este eliminată momentan -->
<script>
$(function() {
    // o soluție pentru o eroare în sistemul demo (http://dev.jqueryui.com/ticket/4375), ignoră!
    //$( "#dialog:ui-dialog" ).dialog( "destroy" );

    $( "#dialog-form" ).dialog({
        autoOpen: false,
        height: 300,
        width: 350,
        modal: true,
        buttons: {
            "Create an account": function() {
                var bValid = true;
                allFields.removeClass( "ui-state-error" );

                if ( bValid ) {
                    //Adaugă datele capturate în tabelul de pe pagina principală
                    //$( "#users tbody" ).append( "<tr>" +
                    //  "<td>" + txtBrname.val() + "</td>" + 
                    //  "<td>" + txtStrAddress.val() + "</td>" + 
                    //  "<td>" + txtManager.val() + "</td>" +
                    //"</tr>" ); 
                    $( this ).dialog( "close" );
                }
            },
            Cancel: function() {
                $( this ).dialog( "close" );
            }
        },
        close: function() {
            allFields.val( "" ).removeClass( "ui-state-error" );
        }
    });

    $( "#create-branch" )
        .button()
        .click(function() {
            $( "#dialog-form" ).dialog( "open" );
        });
});
</script>

<?php
function fn_DeleteBranch(Id)
{
   //$wpdb->   etc etc ; //șterge această filială (după Id) din baza de date
}
?>

<style>    
 body { font-size: 62.5%; }     
 label, input { display:block; }    
 input.text { margin-bottom:12px; width:95%; padding: .4em; }     
 fieldset { padding:0; border:0; margin-top:25px; }     
 h1 { font-size: 1.2em; margin: .6em 0; }     
 div#users-contain { width: 350px; margin: 20px 0; }     
 div#users-contain table { margin: 1em 0; border-collapse: collapse; width: 100%; }    
 div#users-contain table td, div#users-contain table th { border: 1px solid #eee; padding: .6em 10px; text-align: left; }     
 .ui-dialog .ui-state-error { padding: .3em; }     
 .validateTips { border: 1px solid transparent; padding: 0.3em; } 
</style>

<?php
// Hook pentru adăugarea formularului dialog SPERÂM
add_action('admin_init', "#dialog-form" );
add_action( 'admin_init', 'my_Deregister_scripts' ); 
add_action( 'admin_enqueue_scripts-options_page-{page}', 'myplugin_admin_scripts' ); 

function my_Deregister_scripts() {        
   wp_deregister_script( 'jquery-ui' );  //Anulează înregistrarea versiunii WP    
}  

function myplugin_admin_scripts(){
   // sintaxa   wp_enqueue_script( $handle,$src,$deps,$ver,$in_footer );
   // $src = URL-ul unde sunt stocate scripturile
   // $in_footer În mod normal scripturile sunt plasate în <head>, deci implicit este false

   //wp_register_script( 'jquery-ui', plugins_url( 'js/jquery-ui.js', __FILE__ ), array( 'jquery' ) );
     wp_enqueue_script('jquery');
     wp_enqueue_script('jquery-ui-core');
     wp_enqueue_script('jquery-ui-dialog');
     wp_enqueue_script('jquery-ui-1.8.17.custom.min' );
     wp_enqueue_script('jquery-bgiframe-2.1.2' );
     wp_enqueue_script('jquery-ui-mouse' );
     wp_enqueue_script('jquery-ui-button' );
     wp_enqueue_script('jquery-ui-draggable' );
     wp_enqueue_script('jquery-ui-position' );
     wp_enqueue_script('jquery-ui-resizable' );
     wp_enqueue_script('jquery-effects-core' );  
     wp_enqueue_script('jquery-ui-widget' );

     wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css');
}
?>

<div id="dialog-form" title="Editare Filială">
<p class="validateTips">Toate câmpurile sunt obligatorii.</p>

<form>
<fieldset>
    <label for="BrName">Nume Filială</label>
    <input type="text" name="txtBrname" id="txtBrName" class="text ui-widget-content ui-corner-all" />
    <label for="Tel">Telefon</label>
    <input type="text" name="txtTel" id="txtTel" value="" class="text ui-widget-content ui-corner-all" />
</fieldset>
</form>
</div>

<div id="users-contain" class="ui-widget">
<?php             
    echo "<table border='1' cellpadding='0' width='100%'>"; 
    echo "<tr> 
    <th>ID</th> 
    <th>Nume Filială</th> 
    <th>Express?</th> 
    <th>Adresă</th> 
    <th>Zonă</th>
    <th>Manager</th>
    <th>Proprietar</th>
    <th>Telefon</th>
    <th>Mobil</th>
    <th>Email</th>
    <th>Editare</th>
    <th>Ștergere</th>
  </tr>"; 

global $wpdb;
$myrows = $wpdb->get_results("SELECT * FROM wp_sbbranches");

    // parcurge rezultatele interogării bazei de date, afișându-le în tabel      
foreach ($myrows as $row) {               
            echo "<tr>"; 
            echo '<td style="border:none;">' .$row->BrId. '</td>'; 
            echo '<td style="border:none;">' .$row->BrName. '</td>'; 
            echo '<td style="border:none;">' .$row->BrTel. '</td>';

    echo '<td style="border:none;"><button onclick="create-branch(' . $row->Id. ')"></td>';
            echo '<td style="border:none;"><button onclick="fn_DeleteBranch(' . $row->Id. ')"></td>'; 

            echo "</tr>";  
    }  
    // închide tabelul
    echo "</table>";
?> 
<button id="create-branch(' 0 ')" >Crează filială nouă</button>
</div>
0
Toate răspunsurile la întrebare 2
13

Deși nu sunt sigur exact de ce ai nevoie, poate aș putea oferi câteva indicii.

În primul rând, documentația de pe diferite site-uri conține tot ce ai nevoie, așa că ar trebui să vizitezi WordPress Codex, și exemple jQuery UI.

Hook-uri

admin_init: Poți deregistra/registra scripturi aici. Dacă intenționezi să folosești un script jquery ui personalizat, de exemplu:

 function my_register_scripts()
 {
      wp_deregister_script( 'jquery-ui' ); //Deregistrează versiunea WP
      wp_register_script( 'jquery-ui', plugins_url( 'js/jquery-ui.js', __FILE__ ), array( 'jquery' ) ); //Înregistrează propria versiune
 }
 add_action( 'admin_init', 'my_register_scripts' );

admin_menu: adaugă pagina ta de plugin, atașează scripturile la o pagină specifică

 function my_menu()
 {
      $admin_page = add_menu_page(/*Verifică codex pentru argumente, link mai jos*/); //Adaugă pagina ta

      //folosește variabila $admin_page pentru încărcarea țintită a scripturilor

      add_action( 'admin_print_styles-' . $admin_page, 'function_that_enqueues_css_here' );
      add_action( 'admin_print_scripts-' . $admin_page, 'function_that_enqueues_js_here' );

 }
 add_action( 'admin_menu', 'my_menu' );

add_menu_page

EDIT: Exemplu Dialog

Iată un exemplu simplu de dialog modal care deschide un formular:

 $(document).ready(function(){
      $('#form-wrap').dialog({
           autoOpen: true, //FALSE dacă deschizi dialogul cu, de exemplu, un click pe buton
           title: 'Formularul meu',
           modal: true
      });
 });

Codul de mai sus presupune că ai un tag sau alt tag cu id-ul 'form-wrap'. În interior poți pune formularul tău.

Structura dosarelor

S-ar putea să mă înșel, dar nu cred că contează prea mult, eu pun fișierele .js într-un dosar /js, css într-un dosar /css, etc...

Folosește plugins_url() când încarci fișiere din directorul pluginului tău.

Pagina jQuery UI Dialog ar trebui să aibă toate exemplele de care ai nevoie.

Când folosesc acele dialoguri, de obicei genereaz HTML pe pagină (display:none), și îl folosesc pentru popup-ul de dialog.

Sper că unele dintre acestea te-au ajutat.

EDIT

De asemenea, cred că personalizând propriul tău script jQuery UI pe site-ul jQuery UI vei avea mai puține fișiere de încărcat.

EDIT 2

Ai erori în add_actions dacă codul de mai sus este ceea ce folosești.

 add_action('admin_init', "#dialog-form" );

Al doilea argument ar trebui să fie o funcție PHP, nu ID-ul div-ului tău HTML.

 add_action( 'admin_enqueue_scripts-options_page-{page}', 'myplugin_admin_scripts' ); 

Sunt destul de sigur că {page} trebuie înlocuit cu pagina specifică pe care vrei să apelezi scripturile.

Dacă jQuery este principala ta problemă, sugerez să încerci să-l faci să funcționeze pe o pagină HTML simplă, separat de site-ul tău, până când funcționează, apoi să te ocupi de hook-uri.

18 ian. 2012 18:36:19
Comentarii

Mulțumesc, am făcut cam asta acum... a durat ceva să pun piesele laolaltă. Am pluginul meu Admin TopLevel funcțional cu submeniurile sale, unul dintre acestea controlează formularul BranchMaint menționat,... care trebuie să aibă popup / dialog pentru a gestiona Editările și/sau Inserarea unei noi sucursale, și să folosească $wpdb pentru inserare sau actualizare în consecință. Totuși, funcționalitatea popup încă nu funcționează. Am actualizat codul meu mai sus, cu action hooks către my-functions, dacă asta ajută cu ceva.

Neal Neal
19 ian. 2012 13:01:08

Mă uit acum la sugestia ta (Shane), cercetând tag-uri etc. 2 săptămâni de php și wpress. (11 ani de c# Asp.net). De asemenea, cercetez actualizarea automată a formularului părinte.

Neal Neal
19 ian. 2012 15:40:20

Vezi și a doua mea Editare - De asemenea, verifică sursa pe pagina randată să vezi dacă scripturile sunt încărcate, și orice plugin precum Firebug pentru Firefox poate ajuta cu erorile de javascript.

Shane Shane
19 ian. 2012 15:50:28

Arată fișierul tău de plugin exact ca codul de mai sus? Ar putea fi util dacă mi-ai putea arăta fișierul tău de plugin.

Shane Shane
19 ian. 2012 16:18:34

Da, greșeala mea,...ar trebui să fie un apel către o funcție PHP.

Neal Neal
20 ian. 2012 09:31:38

și {page} de asemenea, da. Am înlocuit-o cu add_action( 'admin_init', 'myplugin_admin_scripts' ); Apoi a funcționat bine pe o pagină HTML standard (doar o copie a demo-ului lor cu folderele mele și et voila, nicio problemă) JQuery este... am verificat temele mele din 2011 și 2012 și am editat fișierul Header.php adăugând Enqueue pentru jquery înainte de funcția wp_head. Este o instalare proaspătă de WP 3.3.1 pe serverul meu WAMP pe PC cu Windows. DAR pe pagina mea inițializările jquery sunt trecute pe lângă,...adică nu sunt invocate. Așa că 'formularul' meu cu câmpurile în el care ar trebui să apară este vizibil imediat împreună cu restul tabelului și câmpurilor.

Neal Neal
20 ian. 2012 09:48:27

iar butonul popup 'AddBranch' nu face absolut nimic....Cred că trebuie să merg pe sugestia ta / formular modal popup deocamdată (timpul expiră) și să continui să experimentez/cercetez chestia asta cu JQuery mai târziu

Neal Neal
20 ian. 2012 09:48:40

Dacă aș folosi 'fieldset-ul meu în tag-urile sale de formular și exemplul tău de dialog... cred că aș fi pe drumul cel bun?

Neal Neal
20 ian. 2012 09:50:33

O întrebare legată de popup-ul tău, cum îl apelezi de la un click pe buton? Nu văd niciun eveniment asociat cu el pentru un buton, sau un ID de funcție, pe care onclick-ul butonului să-l poată referenția.

Neal Neal
20 ian. 2012 10:13:32

Tocmai am refăcut formularul fără elemente JQueryUI în el, doar tabelul și fieldset-ul, plus codul tău pentru fereastra popup (am referențiat div-ul #form-wrap la click pe buton), dar div-ul + fieldset-ul încă se afișează pe pagină și nu apar ca popup.

Neal Neal
20 ian. 2012 10:21:37

Am pus un alert în funcția document.ready, dar nici acesta nu apare. Presupun că plugin-ul meu WordPress nu răspunde la JQuery... Înapoi la planșeta de cercetare și dezvoltare. Oricum, mulțumesc pentru ajutor, apreciez.

Neal Neal
20 ian. 2012 10:23:39

Pentru a deschide o fereastră dialog la click pe buton, configurezi dialogul cu parametrul "autoOpen: false", apoi la click pe buton, folosești $('#dialogul_tau_configurat').dialog('open');

Shane Shane
20 ian. 2012 15:40:11

Dialogul poate fi deschis cu orice eveniment de click. Un simplu anchor pe pagină ar putea face treaba:

<a href="#" id="open-form">Deschide formular</a>

iar în javascript:

$('#open-form').click(function(){ $('#the_form_you_setup').dialog( 'open' ); });

Shane Shane
20 ian. 2012 15:43:34
Arată celelalte 8 comentarii
0

Ar trebui să faci următoarele:

add_action( 'admin_enqueue_scripts',     'admin_scripts' ); 
function admin_scripts(){
    wp_enqueue_script( 'jquery-ui-dialog' ); 
    wp_enqueue_style( 'wp-jquery-ui-dialog' );
}

apoi ar trebui să folosești:

jQuery('<div> Salut! <div>').dialog({ modal:true, width:600 }); 
15 ian. 2018 14:20:00