Come implementare un dialog modale jQuery UI in un plugin WordPress?

18 gen 2012, 14:00:52
Visualizzazioni: 16.4K
Voti: 4

Ho creato un plugin WordPress che genera un menu principale personalizzato e sottomenu correttamente. Il sottomenu chiama il form PHP BranchMaintenance (vedi codice sotto), che mostra le filiali in una tabella, recuperate dal database (usando $wpdb).

Il problema è far comparire correttamente il form modale jQuery UI. Probabilmente il mio codice è la causa, soprattutto per aspetti come le funzioni senza nome a livello globale come nel codice (es. $(function() {).

Sto cercando di gestire gli script necessari per: a) nascondere inizialmente il form dialog (attualmente appare sopra la tabella dei dati) b) visualizzarlo quando richiamato (questo parte è ancora come nel codice demo originale)

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

<!-- Questo era posizionato nell'head di un normale form HTML nel Demo 'http://jqueryui.com/demos/dialog/modal-form.html'...la validazione dei campi è stata rimossa per ora -->
<script>
$(function() {
    // una soluzione alternativa per un difetto nel sistema demo (http://dev.jqueryui.com/ticket/4375), ignorare!
    //$( "#dialog:ui-dialog" ).dialog( "destroy" );

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

                if ( bValid ) {
                    //Aggiunge i dati catturati alla tabella nella pagina principale
                    //$( "#users tbody" ).append( "<tr>" +
                    //  "<td>" + txtBrname.val() + "</td>" + 
                    //  "<td>" + txtStrAddress.val() + "</td>" + 
                    //  "<td>" + txtManager.val() + "</td>" +
                    //"</tr>" ); 
                    $( this ).dialog( "close" );
                }
            },
            Annulla: 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->   ecc ecc ; //elimina questa filiale (tramite Id) dal database
}
?>

<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 per aggiungere il form Dialog SPERANDO
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' );  //Deregistra la versione di WP    
}  

function myplugin_admin_scripts(){
   //  sintassi   wp_enqueue_script( $handle,$src,$deps,$ver,$in_footer );
   //  $src  = l'URL dove sono memorizzati gli script
   //  $in_footer Normalmente gli script sono posizionati nella sezione <head>, quindi il default è 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="Modifica Filiale">
<p class="validateTips">Tutti i campi del form sono obbligatori.</p>

<form>
<fieldset>
    <label for="BrName">Nome Filiale</label>
    <input type="text" name="txtBrname" id="txtBrName" class="text ui-widget-content ui-corner-all" />
    <label for="Tel">Telefono</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>Nome Filiale</th> 
    <th>Express?</th> 
    <th>Indirizzo</th> 
    <th>Area</th>
    <th>Manager</th>
    <th>Proprietario</th>
    <th>Tel</th>
    <th>Cell</th>
    <th>Email</th>
    <th>Modifica</th>
    <th>Elimina</th>
  </tr>"; 

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

    // ciclo attraverso i risultati della query del database, mostrandoli nella tabella      
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>";  
    }  
    // chiude la tabella
    echo "</table>";
?> 
<button id="create-branch(' 0 ')" >Crea nuova filiale</button>
</div>
0
Tutte le risposte alla domanda 2
13

Anche se non sono sicuro di cosa esattamente ti serva, forse potrei darti qualche indicazione.

Prima di tutto, la documentazione sui vari siti ha tutto ciò di cui hai bisogno, quindi dovresti visitare il WordPress Codex e gli esempi di jQuery UI.

Hook

admin_init: Qui puoi deregistrare/registrare script. Se intendi usare uno script jquery ui personalizzato, ad esempio:

 function my_register_scripts()
 {
      wp_deregister_script( 'jquery-ui' ); //Deregistra la versione di WP
      wp_register_script( 'jquery-ui', plugins_url( 'js/jquery-ui.js', __FILE__ ), array( 'jquery' ) ); //Registra la tua versione
 }
 add_action( 'admin_init', 'my_register_scripts' );

admin_menu: aggiungi la pagina del tuo plugin, aggancia anche script specifici per la pagina

 function my_menu()
 {
      $admin_page = add_menu_page(/*Guarda il codex per gli argomenti, link sotto*/); //Aggiungi la tua pagina

      //usa la variabile $admin_page per il caricamento mirato degli script

      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: Esempio di Dialog

Ecco un semplice esempio di finestra modale che apre un form:

 $(document).ready(function(){
      $('#form-wrap').dialog({
           autoOpen: true, //FALSE se apri la finestra con, ad esempio, un click su un pulsante
           title: 'My Form',
           modal: true
      });
 });

Il codice sopra presuppone che tu abbia un tag div o altro con l'id 'form-wrap'. All'interno inserisci il tuo form.

Struttura delle Cartelle

Potrei sbagliarmi, ma non credo che questo sia molto importante, io metto semplicemente i file .js in una cartella /js, i css in una cartella /css, ecc...

Usa plugins_url() quando inserisci file dalla directory del tuo plugin.

La pagina di jQuery UI Dialog dovrebbe avere tutti gli esempi di cui hai bisogno.

Quando uso quelle finestre, generalmente genero html nella pagina (display:none) e lo uso per il popup della finestra.

Spero che qualcosa di tutto questo ti sia stato utile.

EDIT

Inoltre, penso che personalizzare il tuo script jQuery UI sul sito jQuery UI ti darà meno file da inserire.

EDIT 2

Hai errori nei tuoi add_actions se il codice sopra è quello che stai usando.

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

Il secondo argomento dovrebbe essere una funzione PHP, quello sembra l'ID del tuo div HTML.

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

Sono abbastanza sicuro che {page} debba essere sostituito con la pagina specifica su cui vuoi chiamare gli script.

Se jQuery è il tuo problema principale, suggerisco di farlo funzionare prima su una semplice pagina html scollegata dal tuo sito fino a quando non funziona, poi sistemare gli hook.

18 gen 2012 18:36:19
Commenti

Grazie, ho praticamente fatto così ora... ci ho messo un po' a mettere insieme i pezzi. Ho il mio plugin Admin TopLevel funzionante con i suoi sottomenu, uno dei quali gestisce il form BranchMaint menzionato,... che dovrebbe avere il popup / dialog per gestire le modifiche e/o l'inserimento di un nuovo Branch, e usare $wpdb per inserire o aggiornare di conseguenza. Tuttavia la funzionalità del popup ancora non funziona. Ho aggiornato il mio codice sopra, con gli action hook verso my-functions, se può essere d'aiuto.

Neal Neal
19 gen 2012 13:01:08

Sto esaminando il tuo suggerimento (Shane), ricercando tag ecc. 2 settimane di php e wpress. (11 anni di c# Asp.net). sto anche ricercando l'auto-aggiornamento del form genitore.

Neal Neal
19 gen 2012 15:40:20

Vedi la mia seconda modifica - Inoltre, assicurati di controllare il sorgente sulla pagina renderizzata per vedere se gli script sono chiamati, e qualsiasi plugin come Firebug per Firefox può aiutare con gli errori javascript.

Shane Shane
19 gen 2012 15:50:28

Il tuo file del plugin è esattamente come il codice sopra? Potrebbe essere utile se potessi mostrarmi il tuo file del plugin.

Shane Shane
19 gen 2012 16:18:34

Già, errore mio,...dovrebbe essere una chiamata a una funzione php.

Neal Neal
20 gen 2012 09:31:38

e {page} anche sì. L'ho sostituito con add_action( 'admin_init', 'myplugin_admin_scripts' ); Poi ho fatto funzionare tutto bene su una pagina html standard (solo una copia del loro demo con le mie cartelle e et voilà nessun problema) JQuery è... ho controllato i miei temi 2011 & 2012 e modificato il file Header.php aggiungendo l'Enque a jquery prima della funzione wp_head. È un'installazione fresca di WP 3.3.1 sul mio WAMPserver WinPC. MA nella mia pagina le inizializzazioni jquery vengono saltate,...cioè non invocate. QUINDI il mio 'form' con i campi che dovrebbe apparire è visibile insieme al resto della tabella e dei campi immediatamente.

Neal Neal
20 gen 2012 09:48:27

e il pulsante popup 'AddBranch' non fa assolutamente nulla....Penso che per ora (il tempo sta per scadere) dovrò seguire il tuo suggerimento/usare il form modale popup e continuare a sperimentare/studiare questa cosa di JQuery più avanti

Neal Neal
20 gen 2012 09:48:40

Se utilizzassi il mio 'fieldset' con i suoi tag form e il tuo esempio di dialog... immagino che sarei già a buon punto?

Neal Neal
20 gen 2012 09:50:33

Una domanda riguardo il tuo popup, come lo richiami dal click di un pulsante? Non vedo alcun evento associato ad esso per un pulsante, o un ID funzione a cui il pulsante possa fare riferimento con l'on-click.

Neal Neal
20 gen 2012 10:13:32

Ho appena riprogettato il form senza elementi JQueryUI, solo la tabella e il fieldset insieme al tuo codice per il popup dialog (ho riferito al div #form-wrap al click del mio pulsante), ma il div + fieldset vengono ancora visualizzati nella pagina e non compaiono come popup.

Neal Neal
20 gen 2012 10:21:37

Ho inserito un alert nella funzione document.ready, ma nemmeno quello viene mostrato. Immagino che il mio plugin WP non stia rispondendo a JQuery... Torno al tavolo di ricerca e sviluppo. Grazie comunque per il tuo aiuto, è molto apprezzato.

Neal Neal
20 gen 2012 10:23:39

Per aprire un dialog al click di un pulsante, devi impostare il dialog con il parametro "autoOpen: false", poi al click del pulsante fai $('#the_dialog_you_setup').dialog( 'open' );

Shane Shane
20 gen 2012 15:40:11

Il dialogo può essere aperto con qualsiasi evento di click. Un semplice ancoraggio nella pagina potrebbe fare al caso nostro:

<a href="#" id="open-form">Apri modulo</a>

e nel tuo javascript:

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

Shane Shane
20 gen 2012 15:43:34
Mostra i restanti 8 commenti
0

Dovresti fare queste operazioni:

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

poi dovresti utilizzare:

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