2010-01-02 17 views
1

J'utilise markItUp pour une zone de texte dans un widget WP (c'est-à-dire sur la page widgets.php, lors de la création et de la modification d'un widget). La zone de texte est markItUp lorsque j'ouvre le widget pour la première fois, mais après avoir cliqué sur Enregistrer, la fonctionnalité est perdue et je suis de retour à une zone de texte régulière.markItUp pour le widget Wordpress

J'ai comparé le code source des versions avant-sauvegarde et après-sauvegarde de la page et il n'y a pas de différence - évidemment, car la page n'est pas rechargée. Est-ce que jQuery doit être appelé pour chaque appel ajax?

J'ai essayé d'ajouter

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

à l'intérieur de la fonction de gestion des formulaires du widget, mais cela n'a pas aidé. J'ai essayé d'apporter des modifications en reliant cet événement au bouton de sauvegarde, mais cela n'a pas semblé faire de différence (il y a de fortes chances que je me suis trompé).

+0

J'ai favorisé ceci afin que je puisse répondre demain. Son 2:30 AM ici ... La réponse courte est, oui, vous devez rappeler la fonction 'markItUp' après chaque widget AJAX demande que WP met à jour le contenu du widget après enregistrer. Je peux vous montrer comment demain ... –

+0

Merci Doug. J'attends cela avec impatience. Pour l'instant cependant, j'ai réussi à trouver une solution de contournement. J'avais l'habitude de charger le fichier js qui a activé markitup à admin_head. Au lieu de cela, j'ai déplacé le code de jQuery à l'intérieur du formulaire de widget. La page Widget semble se charger un peu plus lentement avec plusieurs zones markItUp activées cependant. – Necati

Répondre

3

Le jQuery

Ainsi, la première chose que vous devez faire est de crochet dans l'appel AJAX afin que vous êtes averti lorsque les widgets ont été enregistrés. Pour ce faire, nous utiliserons la fonction jQuery ajaxSuccess. Mettez cela dans son propre fichier 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); 

Le PHP/WordPress

Enfin, dites-WP pour inclure votre nouveau fichier js uniquement sur la page des widgets. Vous aurez besoin d'intégrer ce soit dans functions.php ou si vous construisez un widget, dans le fichier PHP widgets:

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

Modifier J'ai eu un crochet add_action incorrect quand je posté. Il avait besoin du .php que je viens d'ajouter. Le code est correct maintenant.

+0

Merci pour ça. Quand je l'ai implémenté tel quel, j'ai rencontré un problème où le widget sur lequel je travaillais retrouvait avec succès sa marque (markitupidity?), Tandis que les autres widgets du même type (actifs ou non) recevaient une zone markitup supplémentaire dans les originaux marqués (comme les fenêtres en cascade). Donc, j'ai dû faire un changement à la fonction ajax que vous avez ci-dessus. [Je n'arrive pas à coller le code ici ...] – Necati

+0

@Necati veuillez coller le code de travail sur http://pastie.org/ et collez le lien dans les commentaires pour pouvoir mettre à jour le répondez en conséquence. –

+0

Je l'avais mis dans un nœud de réponse dans le ci-dessous. Vous pouvez le prendre à partir de là.S'il vous plaît allez-y et changez le code jQuery aussi si vous pensez qu'il peut être amélioré. Merci encore. – Necati

1

La solution de Doug a bien fonctionné. J'ai seulement dû changer la fonction de window.setTimeout comme suit:

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

Vous devriez pouvoir remplacer l'intérieur de la fonction 'setTimeout' par ceci:' $ ("textarea.markItUp: not (.markItUpEditor)"). MarkItUp (mySettings); 'Puisque c'est ce que vous faites. Mon code d'origine a probablement échoué car '.markItUp' était trop ambigu et nécessitait le' textarea.markItUp'. –

+0

Hmmm, je pourrais jurer que c'était ma première tentative d'essayer de faire fonctionner votre code original ... Je pense, ce qui m'a fait chercher une alternative était qu'une ou plusieurs des instances de widget que j'avais déjà sur mon La page des widgets était déjà foirée à cause des changements apportés par le code précédent. Ou peut-être ai-je oublié de changer les noms de classe de 'markitup' en 'markItUp' (sans la connaissance de ces langages, je me trouve frénétiquement en train de faire des changements et de les appliquer jusqu'à ce que quelque chose fonctionne). est en ordre. Merci beaucoup pour votre temps, Doug. – Necati

+0

@Necati Joyeux d'aider. J'ai mis à jour mon autre réponse pour refléter le code de travail. Merci d'avoir pris le temps de m'aider à corriger ma réponse pour que ça marche pour les autres chercheurs. Bienvenue sur Stack Overflow et j'espère vous voir autour du site! –