Как реализовать модальное окно jQuery UI Dialog в плагине WordPress?

18 янв. 2012 г., 14:00:52
Просмотры: 16.4K
Голосов: 4

Я создал плагин для WordPress, который успешно создает кастомное верхнее меню и подменю. Подменю вызывает эту форму (см. код ниже) BranchMaintenance PHP, которая отображает филиалы в таблице из базы данных (используя $wpdb).

Проблема в том, чтобы заставить модальное окно jQuery UI Dialog появляться. Вероятно, проблема в моем коде... не понимаю такие вещи, как отсутствие именованных внешних/верхнеуровневых функций в коде, например $(function() {

Я пытаюсь правильно подключить скрипты чтобы: a) изначально скрыть диалоговую форму (она появляется над таблицей с данными филиалов)..вероятно сделал это неправильно b) отображать ее при вызове (пока оставил как в оригинальном демо-коде)

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

<!-- Этот скрипт был размещен в head обычной HTML формы в демо 'http://jqueryui.com/demos/dialog/modal-form.html'...валидация полей временно удалена -->
<script>
$(function() {
    // обходной путь для бага в демо-системе (http://dev.jqueryui.com/ticket/4375), можно игнорировать!
    //$( "#dialog:ui-dialog" ).dialog( "destroy" );

    $( "#dialog-form" ).dialog({
        autoOpen: false,
        height: 300,
        width: 350,
        modal: true,
        buttons: {
            "Создать аккаунт": function() {
                var bValid = true;
                allFields.removeClass( "ui-state-error" );

                if ( bValid ) {
                    // Добавляем захваченные данные в таблицу на главной странице
                    //$( "#users tbody" ).append( "<tr>" +
                    //  "<td>" + txtBrname.val() + "</td>" + 
                    //  "<td>" + txtStrAddress.val() + "</td>" + 
                    //  "<td>" + txtManager.val() + "</td>" +
                    //"</tr>" ); 
                    $( this ).dialog( "close" );
                }
            },
            Отмена: 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->   и т.д. ; //удаляет этот филиал (по Id) из базы данных
}
?>

<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
// Хук для добавления диалоговой формы НАДЕЮСЬ
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' );  //Отменяем регистрацию версии WP    
}  

function myplugin_admin_scripts(){
   //  синтаксис   wp_enqueue_script( $handle,$src,$deps,$ver,$in_footer );
   //  $src  = URL где хранятся скрипты
   //  $in_footer Обычно скрипты помещаются в <head>, поэтому по умолчанию 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="Редактирование филиала">
<p class="validateTips">Все поля формы обязательны для заполнения.</p>

<form>
<fieldset>
    <label for="BrName">Название филиала</label>
    <input type="text" name="txtBrname" id="txtBrName" class="text ui-widget-content ui-corner-all" />
    <label for="Tel">Телефон</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>Название филиала</th> 
    <th>Экспресс?</th> 
    <th>Адрес</th> 
    <th>Район</th>
    <th>Менеджер</th>
    <th>Владелец</th>
    <th>Телефон</th>
    <th>Мобильный</th>
    <th>Email</th>
    <th>Редактировать</th>
    <th>Удалить</th>
  </tr>"; 

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

    // перебираем результаты запроса к БД, отображая их в таблице      
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>";  
    }  
    // закрываем таблицу
    echo "</table>";
?> 
<button id="create-branch(' 0 ')" >Создать новый филиал</button>
</div>
0
Все ответы на вопрос 2
13

Хотя я не совсем уверен, что именно вам нужно, возможно, я могу дать несколько подсказок.

Во-первых, документация на различных сайтах содержит все необходимое, поэтому вам стоит посетить WordPress Codex и примеры jQuery UI.

Хуки

admin_init: Здесь вы можете отменить регистрацию/зарегистрировать скрипты. Например, если вы хотите использовать собственный скрипт jquery ui:

 function my_register_scripts()
 {
      wp_deregister_script( 'jquery-ui' ); //Отменяем версию WordPress
      wp_register_script( 'jquery-ui', plugins_url( 'js/jquery-ui.js', __FILE__ ), array( 'jquery' ) ); //Регистрируем свою
 }
 add_action( 'admin_init', 'my_register_scripts' );

admin_menu: добавляем страницу плагина, также подключаем скрипты для конкретной страницы

 function my_menu()
 {
      $admin_page = add_menu_page(/*Аргументы смотрите в codex, ссылка ниже*/); //Добавляем свою страницу

      //используем переменную $admin_page для целевой загрузки скриптов

      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

РЕДАКТИРОВАНИЕ: Пример диалога

Вот простой пример модального диалога, открывающего форму:

 $(document).ready(function(){
      $('#form-wrap').dialog({
           autoOpen: true, //FALSE, если вы хотите открывать диалог, например, по клику кнопки
           title: 'Моя форма',
           modal: true
      });
 });

Код выше предполагает, что у вас есть тег div или другой с id 'form-wrap'. Внутрь вы помещаете свою форму.

Структура папок

Возможно, я ошибаюсь, но не думаю, что это имеет большое значение. Я просто размещаю .js файлы в папке /js, css в /css и т.д.

Используйте plugins_url() при подключении файлов из директории вашего плагина.

На странице jQuery UI Dialog вы найдете все необходимые примеры.

Когда я использую такие диалоги, я обычно генерирую html на странице (display:none) и использую его для всплывающего окна.

Надеюсь, это было полезно.

РЕДАКТИРОВАНИЕ

Также, я думаю, что кастомизация вашего собственного скрипта jQuery UI на сайте jQuery UI даст меньше файлов для подключения.

РЕДАКТИРОВАНИЕ 2

У вас есть ошибки в add_actions, если вы используете код выше.

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

Второй аргумент должен быть PHP функцией, а это похоже на ID вашего HTML div.

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

Я почти уверен, что {page} нужно заменить на конкретную страницу, на которой вы хотите вызывать скрипты.

Если jQuery — ваша основная проблема, я предлагаю сначала добиться работоспособности на простой html странице, не связанной с вашим сайтом, а затем правильно настроить хуки.

18 янв. 2012 г. 18:36:19
Комментарии

Спасибо, сейчас я в основном сделал это... потребовалось время, чтобы собрать все части воедино. У меня работает мой плагин Admin TopLevel с подменю, одно из которых управляет упомянутой формой BranchMaint... которая должна иметь всплывающее окно / диалог для обработки редактирования и/или добавления новой ветки, используя $wpdb для вставки или обновления данных. Однако функциональность всплывающего окна до сих пор не работает. Я обновил свой код выше, добавив хуки действий в my-functions, если это поможет.

Neal Neal
19 янв. 2012 г. 13:01:08

Я изучаю ваше предложение (Shane), исследую теги и т.д. 2 недели работы с php и WordPress. (11 лет опыта с c# Asp.net). Также изучаю автоматическое обновление родительской формы.

Neal Neal
19 янв. 2012 г. 15:40:20

Смотрите мою вторую правку - Также обязательно проверьте исходный код на отображаемой странице, чтобы убедиться, что скрипты вызываются, а такие инструменты, как Firebug для Firefox, могут помочь с ошибками javascript.

Shane Shane
19 янв. 2012 г. 15:50:28

Ваш файл плагина выглядит в точности как код выше? Было бы полезно, если бы вы могли показать мне ваш файл плагина.

Shane Shane
19 янв. 2012 г. 16:18:34

Да, моя ошибка,... это должен быть вызов php-функции.

Neal Neal
20 янв. 2012 г. 09:31:38

и {page} тоже да. Заменил его на add_action( 'admin_init', 'myplugin_admin_scripts' ); Затем всё заработало нормально на стандартной html-странице (просто копия их демо с моими собственными папками и вуаля - без проблем) JQuery это... проверил свои темы 2011 и 2012 годов, отредактировал файл Header.php, добавил Enque к jquery в него перед функцией wp_head. Это свежая установка WP 3.3.1 на моём WAMPserver WinPC. НО на моей странице инициализации jQuery пропускаются,... т.е. не вызываются. Поэтому моя 'форма' с полями, которая должна всплывать, видна сразу вместе с остальной таблицей и полями.

Neal Neal
20 янв. 2012 г. 09:48:27

и кнопка всплывающего окна 'AddBranch' вообще ничего не делает... Думаю, мне придется пока последовать вашему совету / использовать модальную форму (время на исходе) и продолжить разбираться с этим JQuery позже

Neal Neal
20 янв. 2012 г. 09:48:40

Если я использую мой fieldset в его тегах формы и ваш пример диалога.. Полагаю, это будет хорошим началом?

Neal Neal
20 янв. 2012 г. 09:50:33

Один вопрос по вашему всплывающему окну - как его вызвать по клику на кнопку? Я не вижу связанного с ним события для кнопки или ID функции, на которую можно сослаться в обработчике on-click кнопки.

Neal Neal
20 янв. 2012 г. 10:13:32

Я переделал форму, убрав все элементы JQueryUI, оставил только таблицу и fieldset, а также ваш код всплывающего диалога (ссылался на div #form-wrap при клике на кнопку), но div + fieldset все равно отображаются на странице и не всплывают.

Neal Neal
20 янв. 2012 г. 10:21:37

Я добавил alert в функцию document.ready, но он тоже не срабатывает. Похоже, мой плагин WordPress не реагирует на JQuery... Придется снова заняться исследованиями. Но все равно спасибо за помощь, ценю это.

Neal Neal
20 янв. 2012 г. 10:23:39

Чтобы открыть диалог по клику на кнопку, нужно настроить диалог с параметром "autoOpen: false", затем при клике на кнопку выполнить $('#the_dialog_you_setup').dialog('open');

Shane Shane
20 янв. 2012 г. 15:40:11

Диалоговое окно можно открыть при любом клике. Простая ссылка на странице может справиться с этой задачей:

<a href="#" id="open-form">Открыть форму</a>

И в вашем JavaScript:

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

Shane Shane
20 янв. 2012 г. 15:43:34
Показать остальные 8 комментариев
0

Вам следует выполнить следующее:

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

затем используйте:

jQuery('<div> Привет! <div>').dialog({ modal:true, width:600 }); 
15 янв. 2018 г. 14:20:00