2010-01-02 4 views
1

Я использую markItUp для текстового поля в виджетах WP (то есть на странице widgets.php при создании и редактировании виджета).markItUp для виджета Wordpress

Textarea is markItUp'ed при первом открытии виджета, но после того, как я нажал кнопку «Сохранить», функциональность потеряна, и я вернусь к обычной текстовой области.

Я сравнивал исходный код для версий с сохранением и после сохранения страницы, и нет никакой разницы - очевидно, так как страница не перезагружается. Нужно ли запускать jQuery для каждого вызова ajax?

Я попытался добавить

jQuery(".markitup").markItUp(mySettings); 

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

+0

Я предпочел это, поэтому я могу ответить завтра. Его 2:30 здесь ... Короткий ответ: да, вам нужно повторно вызвать функцию «markItUp» после каждого запроса AJAX виджета, поскольку WP обновляет содержимое виджета после сохранения. Я могу показать вам, как завтра ... –

+0

Спасибо Doug. Я с нетерпением жду этого. На данный момент мне удалось найти обходное решение. Я использовал для загрузки js-файла, который активировал markitup для admin_head. Вместо этого я переместил код jQuery внутри формы виджетов. Страница Виджета, кажется, загружается немного медленнее с несколькими включенными областями markItUp. – Necati

ответ

3

JQuery

Итак, первое, что вам нужно сделать, это подключить в вызов AJAX, так что вы будете уведомлены, когда виджеты были сохранены. Для этого мы будем использовать функцию jQuery ajaxSuccess. Поместите это в своем собственном js файле:

// Use a self executing function so we can safely use 
// $ inside and know it = jQuery 
(function($){ 

    // Tie into all jQuery AJAX requests 
    $(document).ajaxSuccess(function(e, x, o){ 

     // Make sure our widget is the one being saved 
     // id_base will equal whatever is set in the PHP for the widget 
     // In this example, we target the text widget 
     if(o.data && o.data.indexOf('id_base=text') > -1){ 

      // Now, lets quickly find all the right elements 
      // and filter out the ones already set up, and finally 
      // apply the `markItUp` call, but we will delay just to give 
      // WP a chance to update the widget 
      window.setTimeout(function(){ 
       $("textareas.markItUp:not(.markItUpEditor)").markItUp(mySettings); 
      }, 200); 
     } 
    }); 

})(jQuery); 

The PHP/WordPress

Наконец, скажите WP включить новые JS файл только на странице виджетов. Вам нужно будет включить это либо в functions.php или если вы создаете виджет, в файл виджеты PHP:

function register_markitup(){ 
    wp_enqueue_script('markitup-widgets', WP_PLUGIN_URL . '/your-plugin/js/markitup-ajax.js'); 
} 

add_action("admin_print_scripts-widgets.php", 'register_markitup'); 

Edit я имел неправильный add_action крючок, когда я отправил. Ему нужен был .php, который я только что добавил. Теперь код верен.

+0

Спасибо за это. Когда я это реализовал, я столкнулся с проблемой, когда виджет, над которым я работал, успешно восстановил свою марксизуемость (markitupidity?), В то время как другие виджеты того же типа (активные или нет) получат дополнительную область маркировки внутри оригинальные markituped (например, каскадные окна.) Итак, мне пришлось внести изменения в функцию ajax, которая у вас выше. [Я, похоже, не могу вставить здесь код ...] – Necati

+0

@Necati, пожалуйста, вставьте рабочий код на http://pastie.org/ и вставьте ссылку в комментарии, чтобы я мог обновить ответьте соответственно. –

+0

Я положил его в узел ответа ниже. Вы можете взять его оттуда.Пожалуйста, продолжайте и измените код jQuery, если вы считаете, что его можно улучшить. Еще раз спасибо. – Necati

1

Решение Doug отлично работало. Мне только пришлось изменить функцию window.setTimeout следующим образом:

window.setTimeout(function(){ 
    $("textarea.markItUp").each(function() { 
     if (!($(this).hasClass('markItUpEditor'))) { 
      $(this).markItUp(mySettings); 
     } 
    });          
}, 200); 
+1

Вы должны иметь возможность заменить внутренности функции setTimeout следующим образом: '$ (" textarea.markItUp: not (.markItUpEditor) "). MarkItUp (mySettings);' Поскольку это то, что вы делаете. Мой исходный код, вероятно, не удался, потому что '.markItUp' был слишком неоднозначным, и ему нужен' textarea.markItUp'. –

+0

Хммм, я мог бы поклясться, что это была моя первая попытка попытаться заставить ваш исходный код работать ... Я думаю, что заставило меня искать альтернативу, так это то, что один или более экземпляров виджета, которые у меня уже были на моем страница виджетов была перепутана из-за изменений, внесенных более ранним кодом. Или, возможно, я забыл изменить имена классов от «markitup» до «markItUp» (без надлежащего знания этих языков я нахожу себя отчаянно вносить изменения и применять их, пока что-то не работает.) Вы правы, теперь, когда я делаю это небольшое изменение, все в порядке. Большое спасибо за ваше время, Дуг. – Necati

+0

@ Necati Счастливые помочь. Я обновил свой другой ответ, чтобы отразить рабочий код. Спасибо, что нашли время, чтобы помочь мне исправить свой ответ, чтобы он работал для других поисковиков. Добро пожаловать в Stack Overflow, и я надеюсь увидеть вас вокруг сайта! –

Смежные вопросы