Kategorie: JavaScript

Add arrows to menus in WordPress

27. Juli 2011 - HTML, JavaScript, wordpress

Wenn ihr ein vorhandenes Menü mit Richtungspfeilen ergänzen möchtet:  hier ist ein kleines Plugin dafür.

English summary: If you have an existing menu on your WordPress blog or site and want to enhance it with arrows to indicate submenus: here is a proposal to do so.  But be aware, that the plugin isn’t out of the box and needs slight modifications to meet your special requirements.

Die Grundidee findet man  z.B. auch beim superfish Menu: per JavaScript/ jQuery werden dem Menü beim Laden der Seite kleine Pfeilchen hinzugefügt, wenn ein Menüpunkt Untermenüs besitzt.

Der js Code besteht nur aus wenigen Zeilen:

jQuery(document).ready( function()<
{
       jQuery(".vlist li:has(ul) > a").each(function() {
       jQuery(this).html(jQuery(this).text() + '<img src="' + pathtoimage.jsmenuImageUrl + 'arrow_down.png" width="20px" height="10px"/>');
});
       jQuery("#access > .menu > ul > li:has(ul) > a").each(function() {
       jQuery(this).html(jQuery(this).text() + '<img src="' + pathtoimage.jsmenuImageUrl + 'arrow_down.png" width="20px" height="10px"/>');
       });
       jQuery("#access > .menu > ul > li:not(ul) li:has(ul) > a").each(function() {
       jQuery(this).html(jQuery(this).text() + '<img src="' + pathtoimage.jsmenuImageUrl + 'arrow_right.png" width="20px" height="10px"/>');
        });

});

Die erste Funktion:

jQuery(".vlist li:has(ul) > a").each(function() {.....

findet alle li- Listpunkte nach dem div mit der Klasse vlist, die Untermenüs besitzen und fügt einen arrow-down an.
Ich benutze dies für ein Menü in der Sidebar, das Untermenüs durch Einrückung anzeigt und nicht „aufklappt“.

Die zweite Funktion:

jQuery("#access > .menu > ul > li:has(ul) > a").each(function() {...

findet alle li-Listpunkte mit Untermenüs auf der ersten Ebene und fügt ebenfalls einen arrow-down an.
Dass benutze ich für das Hauptmenü, das die zweite Ebene nach unten aufklappt.

Die dritte Funktion

jQuery("#access > .menu > ul > li:not(ul) li:has(ul) > a").each(function() {...

findet alle li-Listpunkte mit Untermenüs nach der ersten Ebene und fügt einen arrow-right an. Dies benutze ich im Hauptmenü für alle folgenden Untermenüs.

Mit

jQuery(this).html(jQuery(this).text() + ....

wird der angezeigte Menüname  gefunden und um das entsprechende Bild erweitert.

Damit das Plugin funktioniert, müsst ihr für jQuery den Suchpfad (z.B („.vlist li…“ oder „#access > .menu > ul > li…“ modifizieren, damit die richtigen li-Listpunkte gefunden werden.

 

Hier könnt ihr das Plugin downloaden: jsmenu. Denkt aber daran, dass ihr es anpassen müsst

RIP RichText Widget

9. Juni 2011 - JavaScript, tinymce, wordpress

Seit ein paar Tagen habe ich mein Rich Text Widget Problem vom Hals. Der Kunde hat eine einfachere Lösung akzeptiert.

English Summary: Rest In Peace, Rich Text Widget… What to do, when a customer who runs a page-based site has fallen in love with his easy-to-use Text Widget and now asks for a better one with color and images and videos and …

I tried very hard to overcome the existing problems (see…) but without thorough help from WordPress all solutions only work with considerable compromises. Now I could talk the customer into a “loop”-based approach:  he writes a post with a special category (“sidebar, “teaser”, etc) which then is displayed  in the desired part of his webpage.

Die Probleme bei der Realisierung solch eines Widgets habe ich schon früher beschrieben ()

Sie betreffen nicht nur Widgets, die tinyMCE enthalten, sondern alle Javascript basierenden Widgets.

Die Hoffnung auf Hilfe von WordPress musste ich bald aufgeben. Auf meine Fehlermeldung im Forum kam nie eine Antwort und schon allein anzusehen, wie dort die Anfragen aus aller Welt fast im Sekundenbereich einlaufen ist deprimierend. Wer soll das alles lesen? Schon nach einem Tag ist die eigene Anfrage ein paar Hundert Plätze weiter nach unten gerutscht.

Ok, jetzt kurz die wohlbekannte „Loop“-Lösung: der Kunde schreibt einen Artikel mit seinem Standard-Editor und vergibt dabei eine Kategorie „sidebar“ oder „teaser“ oder …  und die paar Zeilen


<span style="font-family: courier new,courier;"><?php query_posts('category_name=sidebar');</span><span style="font-family: courier new,courier;">
 if (have_posts()) : while (have_posts()) : the_post();?>
 <div id="sidebar_info"><?php the_content();?>
 </div></span><span style="font-family: courier new,courier;"><?php endwhile; else : ?>
 <?php endif; ?></span>

erledigen den Job.

NextGEN Gallery von Alex Rabe

9. Juni 2011 - JavaScript, wordpress

Seit ein paar Wochen setze ich hier auf dem Blog die NextGEN Gallery von Alex Rabe ein.

NextGen Gallery ( man muss bei dem Namen immer an Steve Jobs Next Cube denken) installiert ein aufwändiges aber intuitives Menüpaket im Admin. Zum Konfigurieren und Starten der Gallerie werden Shortcodes verwendet.

Für die Bilder verwendet NextGen Gallery eine eigene Datenverwaltung. Das hat Vor- und Nachteile.Wird die Galerie gelöscht, verschwinden automatisch auch alle Bilder vom Server.Für Kunden, die Bilder in Galerien und im Content ihrer Seiten verwenden, wird die Sache unübersichtlicher. Sie müssen zweimal uploaden. Für sie wäre es praktikabler, wenn sie die Galerie aus der Mediathek als einheitliche Medienquelle füttern könnten.

Immerhin kann man im Standarddialog zum Hinzufügen der Bilder zu Posts und Seiten zusätzlich jetzt auch die NextGen Galerien als Quelle auswählen.Vielen Dank an Alex Rabe für die gewaltige und gute Arbeit, die er in sein Projekt hineingesteckt hat.

Norbel

WordPress media uploader in admin

30. März 2011 - JavaScript, wordpress

(Anmerkung 1/2013: Für WordPress > 3.4  siehe http://www.it-in-a-box.com/2013/01/wordpress-3-5-neuer-media-uploader-in-admin/)

(Anmerkung 11/2012: wenn ihr zu diesem Thema dazu Fragen habt und mehr (oder bessere) Informationen braucht, schreibt mir einen Kommentar)

Per heute (WordPress 3.4) gibt es leider immer noch kein offizielles Interface  für den WordPress Media Uploader, mit dem der tinyMCE Editor „angereichert“  ist. Wenn man eine ähnliche Funktionalität (die vorgestellte Lösung gilt nur für Bilder)  im admin einsetzen will, muss man etwas hacken. Dazu benötigt man ein paar Zeilen Javascript.

English Summary: As of today (WordPress 3.4), there is no WordPress supported interface to the WordPress media uploader (supplement to tinyMCE). To use it anyway in your admin pages (this solution only works for images), you need to write a few lines of Javascript.

Der erste Ansatz für den Hack stand bei Matt. Leider funktionierte dort das Rückschalten nicht: wenn man den neuen zusätzlichen uploader verwendet hatte, konnte man in tinyMCE keine Bilder mehr laden.

Ein verbessertes Script ist dieses:

jQuery(document).ready(function() {

window.original_send_to_editor = window.send_to_editor;
 window.send_to_editor_clone1 = function(html){  // ohne html bekommt die Funktion den falschen frame
 jQuery('#bild_link').val(jQuery('img',html).attr('src'));
 tb_remove();
 };
 window.send_to_editor_clone2 = function(html){
 jQuery('#hintergrund_bild_link').val(jQuery('img',html).attr('src'));
 tb_remove();
 };

 jQuery('#content-add_media').click(function() {
/*jQuery('#add_image').click(function() { wordpress bis 3.2 */
 window.send_to_editor=window.original_send_to_editor;
 tb_show('', 'media-upload.php?type=image&TB_iframe=true');
 return false;
 });

jQuery('#bild_link_button').click(function() {
 window.send_to_editor=window.send_to_editor_clone1;
 tb_show('', 'media-upload.php?type=image&TB_iframe=true');
 return false;
 });
 jQuery('#hintergrund_bild_link_button').click(function() {
 window.send_to_editor=window.send_to_editor_clone2;
 tb_show('', 'media-upload.php?type=image&TB_iframe=true');
 return false;
 });
 });

Und so sieht es aus:

 

Die WP- Funktion „window.send_to_editor“ wird gespeichert und beim Klick auf einen der Upload-Buttons (IDs #bild_link_button bzw. #hintergrund_bild_link_button) durch eine neue Funktion ersetzt. In der neuen Funktion wird die Thickbox  mit dem bekannten Upload-Dialog aufgerufen. Anschließend holt man aus dem iframe der Thickbox den Namen des Bildes und trägt ihn in das Textfeld ein.

Wenn man den Uploader im tinyMCE nutzen will, wird die alte „window.send_to_editor“ Funktion wieder hergestellt (Click-Event auf #content-add_media)

Nachteil: es ist ein Hack und kann bei der nächsten WP Version nicht mehr funktionieren. Inklusive WP 3.4 ist aber alles ok.

Für jeden Uploader musste ich oben im Script eine neue Funktion definieren . JS Gurus werden das sicherlich verbessern können 🙂

Noch mal zur Übersicht:

#bild_link_button und #hintergrund_bild_link_button  sind die IDs der „Upload“ Buttons
#bild_link und #hintergrund_bild_link sind die IDs der Textfelder darüber , in die der Link  hineingeschrieben wird

#content-add_media ist die ID des WordPress Upload Buttons über dem Editor

bis Version 3.2 hiess diese ID #add_image

 

Mehr Kontrolle über eine Select-Schaltfläche mit JavaScript

18. März 2011 - HTML, JavaScript

Wenn man ein Select in einem Formular verwendet, kann es hilfreich sein, wenn man den Status des Selects überwachen kann – besonders dann, wenn durch die Änderung der Select-Auswahl ein neuer Datensatz aktiviert wird. Möglich ist dies mit Javascript.

English Summary: select controls in forms may be used for convenience to input text. If a select control is bound to a dataset, it may be necessary to monitor it’s behaviour with JavaScript.

In einem Projekt wird über ein Select gesteuert, welcher Datensatz behandelt werden soll. Der Benutzer kann den Datensatz ändern oder löschen. Ändert er die Daten, muss man den Zustand des Selects bis zum Speichern der Daten überwachen, damit der Datensatz nicht falsch zugeordnet wird.

Hier ist ein Javascript dazu:

jQuery(document).ready(function() {
var capt=jQuery('select.critical_click_select').val();
var cnpt;
 
jQuery('select.critical_click_select').change(function() {
cnpt=jQuery('select.critical_click_select').val();});

if (cnpt == capt) { // passiert beim Rücksetzen der selektion; mach nix
} else {
  if (.. der Benutzer hat die Daten verändert..) {
  var jj=confirm("Wenn Du jetzt einen neuen Datensatz wählst und dann die Änderungen speicherst, werden sie\n zum neuen Datensatz hinzugefügt.\n Fortsetzen?");
  if (jj) {
   capt=cnpt;
  } else {jQuery('select.critical_click_select').val(capt);}
 } else { capt=cnpt; // normale Änderung, mach nix
 }
}  

 });

Das Select hat die Klasse .critical_click_select. Zunächst wird der aktuelle Zustand in capt gespeichert. Wenn das Select verändert wird, speichert man den neuen Zustand in der Variablen cnpt. Dann muss man feststellen, ob Änderungen an den Daten vorgenommen wurden. In dem Confirm-Dialog fragt man den Benutzer, ob er den Datensatz wechseln möchte. Wenn nein, stellt man den ursprünglichen Status wieder her.

Wenn keine Änderung erfolgt ist, kann man die Select-Änderung „durchgehen“ lassen.