Cum implementez un dialog modal jQuery UI într-un plugin WordPress?
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>

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

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.

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.

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.

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.

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

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

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?

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.

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.

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.

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

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