Dump der Umgebungsvariablen im console.log anzeigen

In der Entwicklungsphase werden gerne alle relevanten superglobalen Variablen angezeigt, um deren Inhalt zu prüfen. Jeder PHP-Entwickler nutz dazu print_r($_GET); oder ähnliches. Leider wird hier durch die Ausgabe das Design über den berühmten Haufen geworfen. Das ist in der Entwicklung nicht wirklich schlimm, muss aber nicht sein. Javascript bietet hier Abhilfe: Ab mit der Variablenausgabe in den console.log

echo '<script>console.log("'.str_replace( "\n", "", var_export($_REQUEST, TRUE)).'");</script>';

Da die Funktion console.log mit Umbrüchen nicht klar kommt müssen diese herausgedoktort werden und die Funktion var_export mit einem TRUE versehen wandelt die Ausgabe in einen string, sie wird also nicht standardgemäß ausgeben.

Firebug bietet alles an, um die Ausgabe anzuschauen.

URL-Parameter mit Javascript auslesen

Unter bestimmten Voraussetzungen ist es sehr leicht einen Parameter bzw. dessen Inhalt aus einer URL mittels Javascript auszulesen.

Gegeben sei eine beliebige URL mit einem Parameter ganz am Ende:
http://www.meineurl.de?term=suche

 var myurl = document.URL;
 var position_term = myurl.search(/term/);
 var term = myurl.substr(position_term + 5);
 console.log(term);

Wie gesagt, dies funktioniert nur, wenn der Parameter tatsächlich ganz am Ende der URL ist, weil kein Limit bei substr gegeben wird. Kann es in dem Fall natürlich auch nicht, weil man ja nicht weiß, wie lange der Inhalt von term sein wird.

term kann nun weiter verwendet werden. Beispielsweiseum via jQuery just diesen Inhalt zu selektieren:

jQuery("p:contains(term)").css({backgroundColor: 'yellow'});

Zu beachten ist, das die jQuery-Methode :contains case-sensitive selektiert, es also durchaus auf Groß- und Kleinschreibung ankommt. Ein Workaround dazu gibt es hier: http://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

jQuery-UI Tabs dynamisch mit Ajax nachladen

Die Tabs von jQuery-UI sind ein wunderbares Beispiel dafür, wie einfach es ist mit praktische und gleichzeitig noch schöne Tabulatoren für die Website zu erstellen. Wenn das ganze dann auch noch pro Tab dynamisch nachgeladen werden kann, ist die Sache nahezu perfekt, denn außer einem Gewinn bei der Ladezeit wird der ganze Quelltext auch noch wunderbar modular: Für jedes Tab eine eigene Datei. So mag ichs.

Gegeben sei folgender Html-Code:

<div id="tabs">
<ul>
   <li><a href="#tab-1">Vorgaben</a></li>
   <li><a href="ajax/datei02.php">Datei 02</a></li>
   <li><a href="ajax/datei03.php">Dateo 03</a></li>
  </ul>
  <div id="tabs-1">
    <?="inhalt 1" ?>
 </div>
</div>

und dieses JavaScript/jQuery-Snippet:

<script>
  $(function() {
    $( "#tabs" ).tabs();
  });
</script>

Die Dateien datei02.php und datei03.php stehen im Unterverzeichnis ./ajax und holen sich ihren Inhalt von sonstwo: Datenbank, arrays usw.

 

HTML-Formulare einfach, schnell und ordentlich formatiert mit Definitionslisten.

Eine intuitive Eingabe in Webformulare hängt einerseits von der logischen Reihenfolge und andererseits vom Aufbau ab. Hier bieten sich Definitionslisten an: <dl>, <dt> und <dd>. Im Screenshot ist ein Beispiel zu sehen.

Die Grundformatierung sieht folgendermaßen aus:

<dl>
    <dt><label for="name">Name:</label></dt>
    <dd><input type="text" name="name" size="40" /></dd>
</dl>

Der Label des Eingabefeldes steht im <dt>-Tag. Alles was im <dd>-Tag steht wird etwas eingerückt dargestellt und das ist in diesem Fall das <input>-Tag.

Zusammengehörende Eingabefelder werden mit <fieldset> und dazugehörend mit <legend> formatiert. Hier ist das obige Beispiel erweitert:

<fieldset id="basisdaten">
  <legend>Basisdaten</legend>
  <dl>
    <dt><label for="name">Name:</label></dt>
    <dd><input type="text" name="name" size="40" /></dd>
  </dl>
</fieldset>
Zu beachten ist, dass die <dl>-Tags innerhalb der <fieldset>-Tags stehen müssen, aber nicht vor dem <legend>-Tag, sonst ist das HTML nicht valide.
Der Vollständigkeit halber hier noch der ganze Quelltext zu obigem Screenshotbeispiel:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <style type="text/css">
 #basisdaten, #sonstiges{
 width:35%;
 }
 </style>
</head>
<body>
  <h3>Dateneingabe</h3>
  <form action="auswertung.php" methode="post">
    <fieldset id="basisdaten">
      <legend>Basisdaten</legend>
      <dl>
        <dt><label for="name">Name:</label></dt>
        <dd><input type="text" name="name" size="40" /></dd>
        <dt><label for="vorname">Vorname:</label></dt>
        <dd><input type="text" name="vorname" size="40" /></dd>
        <dt><label for="strasse">Straße:</label></dt>
        <dd><input type="text" name="strasse" size="40"/></dd>
        <dt><label for="plz">PLZ:</label>-<label for="ort">Ort</label></dt>
        <dd><input type="text" name="plz" size="4" />- <input type="text" name="ort" size="29" /></dd>
      </dl>
    </fieldset>
    <fieldset id="sonstiges">
      <legend>Sonstiges</legend>
      <dl>
        <dt><label for="alter">Alter:</label></dt>
        <dd><input type="text" name="alter" size="40" /></dd>
        <dt><label for="groesse">Größe:</label></dt>
        <dd><input type="text" name="groesse" size="40" /></dd>
      </dl>
    </fieldset>
  <input type="submit" value="senden" />
  <input type="reset" value="cancel" />
 </form>
</body>

Prüfen, ob die Checkbox aktiviert war oder nicht

Wenn zwei verschiedene Funktionalitäten gewünscht sind, je nachdem, ob die checkbox von checked nach unchecked oder umgekehrt geschaltet wurde, bietet sich folgendes Snippet an:

HTML:

<form><input type="checkbox" /></form>

Javascript/jQuery:

$('input:checkbox').change(function(){
  if($(this).is(':checked')){
    //unchecked->checked
  }else{
    //checked->unchecked
  }
});

jQuery: Ajax mit Variablenübergabe

jQuery ermöglicht es auf einfache Art und Weise Ajaxanfragen zu gestalten. Variablen mitzugeben ist dabei eine der leichtesten Übungen. Gegeben sei folgendes html-Formularfeld

<form><input type="text" /></form>

und dieser Schnipsel Javascript/jQuery

$('input:text').change(function(){
    var text = $(this).val();
    $.post('ajax/do_something.php', {
        get_text: text
    },function(data){
        alert(data);
    });
});

Wird nun der Inhalt des Textfeldes #textfeld verändert, so registriert der Eventhandler change() die Veränderung. Der neue Inhalt wird in der Variablen text gespeichert und als POST-Variable an das PHP-Script do_something.php übergeben. Dies hat diese Form:

<?php
   print_r($_POST);
?>

Die anschließende Callbackfunktion des Javascripts gibt den Output des php-Scripts als einfaches alert aus.
Das ist das Grundprinzip. Denkbar ist im php-Script natürlich eine Datenbankanfrage oder sonst etwas.

Feinere Einstellmöglichkeiten für Fotos und Videos bei Facebook

www.ImageBanana.com - screenshot_055.jpegFacebook hat mich beim heutigen Login dezent darauf hingewiesen, dass die Möglichkeiten, der Privacy-Einstellungen verändert wurden. Das stimmt so zwar nicht, aber die Usability, sprich, die Handhabung wurde tatsächlich verändert und: Es gefällt mir gut!

www.ImageBanana.com - screenshot_056.jpeg Durch einen Klick auf den Link «deine Einstellungen» im Hinweistext oder aber via «Konto-Privatsphäre-Einstellungen» und dann unten auf «Benutzerdefinierte Einstellungen» kommt man zu diesen Menü. Hier wurde ganz unten eine Option hinzugefügt: «Privatsphäre-Einstellungen für bestehende Fotoalben und Videos bearbeiten.» Wie gewohnt gut versteckt, aber wenn mans einmal gefunden hat, ist das Wiederfinden eigentlich kein Problem.

www.ImageBanana.com - screenshot_057.jpegDa nun folgende Admin-Menü ist genau das, welches neu und von mir gut befunden wurde. Hier lassen sich die eigenen Alben mit den Privatsphären-Einstellungen versehen, die man selbst auch möchte. Ich selbst habe mir eine «Freundesgruppe» dieHeiklen angelegt. Das sind Leute, denen ich die Freundschaftsanfrage schlecht verwehren konnte, ich aber nicht möchte, dass sie alles sehen. Lange Rede… diese Gruppe findet hier relativ oft Verwenung :)

Gut finde ich auch, dass das Album «Profilbilder», welches ja standardmäßig jedem facebook-Account zu eigen ist, einstellbar ist. Nicht jeder muss schließlich meine Fotos sehen.

Eine letzte Anmerkung noch: Die Leute von Facebook sehen alles, ganz unabhängig von den Privatsphären-Einstellungen. Und machen dürfen Sie ja auch alles damit: https://www.facebook.com/help/?faq=12008 aber, das wäre ja im Grunde mal ein ganz eigener Blogpost.

Vom Finden im Web

Im Herbst  vergangenen Jahres wurde ich vom Institut für Jugendarbeit in Gauting gefragt, ob ich ein Seminar zum Thema „Besser suchen im Internet“ halten könnte. Nach einigem Hin und Her sagte ich zu und machte mich ans Recherchieren. Das Thema Suchen im Web ist auf den ersten Blick undankbar, ist es doch eine Tätigkeit, die jeder von uns zigfach am Tag durchführt. Im Zuge meiner Seminarvorbereitung bin ich aber immer tiefer in die Materie eingedrungen und habe mich zudem noch mit dem Thema Validieren von Suchergebnissen vertraut gemacht.

Vergangene Woche hatte ich den Termin und was soll ich sagen, ich hatte Stoff für drei Seminare (meines ging über vier Stunden). Die Rechercheergebnisse sind derart vielfältig geworden, dass ich mir dachte, das wäre doch Stoff, um meinem verwaisten Blog hier etwas Leben einzuhauchen. Nun, dieser Artikel ist die Ankündigung dessen.

-Fortsetzung folgt-

WordPressposts mit GoogleDocs erstellen

Der originale Editor im Backend von wordpress ist an sich nicht schlecht, um seine Posts zu entwerfen, doch geht es noch besser und vor allem noch einfacher. GoogleDocs, zu deutsch „Google text & tabellen“ ist ein feiner WYSIWYG-HTML-Editor, der einiges an Codebearbeitung erlaubt, aber in erster Linie dem Blogger gute Dienste leistet, um seine Texte online zu bringen. Schreiben muss man den Post nach wie vor selbst, aber die Veröffentlichung wird doch sehr erleichtert.

Ist der Text fertig erstellt und formatiert, sind Grafiken eingefügt und macht alles einen zufriedenstellenden Eindruck, so erlaubt der Button „Freigeben“ in der rechten oberen Ecke die einfach veröffentlichen. In nebenstehendem Menü ist der Punkt „Als Website veröffentlichen…“ zu wählen.

Das Fenster danach erlaubt es, den Text mit einem Klick zu veröffentlichen. Vorher muss jedoch alles richtig eingestellt sein.  Dazu muss natürlich „die Einstellung“ der Blog-Site geändert werden. Ein Klick darauf und das nächste Widget erscheint, um die Einstellungen vornehmen zu können.

Hier sind die Einstellungen zu meinem Blog hier bei wordpress.com zu sehen. Anders als vielleicht erwartet wähle ich den linken Radiobutton: „Mein eigener Server/benutzerdefiniert“ ganz einfach deshalb, weil die linke Option nicht funktioniert hat, auch wenn wordpress.com angeboten wird.
API wie oben übernehmen und unter URL die Url des Blogs und nach einem Schrähstrich xmlrpc.php anfügen.
Nutzername, Passwort und Blog-Titel sind klar.

Der Testen-Button checkt, ob alles korrekt eingegeben wurde. Wenn dem so ist, mit OK die Einstellungen speichern.

Im Nachfolgenden Widget kann nun der Button Post neu veröffentlichen geklickt werden und schon ist der Post im Netz. Ich prüfe dann natürlich sofort, wie er aussieht, und ob nach gebessert werden muss.
Bei WordPress ist er auch gleich online, wobei nichts dagegen spricht, den Post im Dashboard des WordPressadminmenüs erst einmal offline zu stellen, um den nötigen Feinschliff zu verpassen. Das ist natürlich jedem selbst überlassen.

Selbstverständlich habe ich diesen Post via GoogleDocs verfasst. Und eigentlich lief es ganz flüssig.

FireQuery – Nie mehr ohne.

Wenn man sich einmal an ihn gewöhnt hat, dann will man ihn nicht mehr missen. Die Rede ist von  Firequery (firequery.binaryage.com) einer Erweiterung des bei allen Webdisigner und -programmieren allseits beliebten Firefox Addons Firebug (getfirebug.com). Über Firebug will ich hier erstmal kein Wort verlieren, was aber nicht heißt, dass nicht irgendwann mal noch was kommt.

Firequery erlaubt es, einerseits Websites, die jQuery nutzen zu analysieren und andererseits bestehende Sites, egal ob eigende oder fremde, mit jQuery zu ‚versorgen‘, im Fachjargon jQuerifying.

Die Installation ist üblich, wie bei allen Firefox Addons und braucht hier wohl nicht weiter erklärt zu werden.

Nun aber zut Tat. Ist das Firebugfenster geöffnet klickt man im Menü auf Konsole und dananach auf den Befehl jQuerify. In jedem Fall erscheint ein gelber Hinweis, dass nun jQuery zur Verfügnung steht und gecodet werden kann.

Gibt man unten beispielsweise den jQuery Selector für <div>-Tags, also $(‚div‘), ein, so werden darüber alle Tags angezeigt, die durch den Selektor gefunden werden können. Das wollen wir ausnutzen. Die Beispielseite hat einen div-Container der Class ’navigation‘. Diesen wollen wir ausblenden. Der Befehl ist einfach.

Also einfach nach gewohnter jQuerymanier Selektor und Methode eingeben, hier .fadeOut(’slow‘), und das Ergebnis bewundern.

Was im Screenshot nicht animiert ist blendet sich tatsächlich langsam aus, bis es ganz weg ist.

Die anderen, noch sichtbaren div-Container sind unverändert, weil das ausgeblendete div natürlich nur ausgeblendet sind.

Natürlich wäre auch die jQuery Methode .remove() möglich, dann wäre das div aus dem DOM entfernt und, je nach Positionierungsart der benachbarten divs, würden diese ihre Stelle verändern.

Das Einblenden ist in unserem Falle natürlich kein Thema: $(‚div.navigation‘).show() in die Konsole eingeben und schon erscheint die Navigation wieder, wo sie war und wo sie nach Meinung des Designers auch hin gehört.

Ein gutes Stichwort: Ein Nutzen der Sache ist es beispielsweise, Dom-Elemente bei der Entwicklung zu verändern, egal ob Größe, Aussehen oder Position und dies Erkenntnisse in den Code für das Endprodukt einfließen zu lassen.

Außerdem lassen sich damit auch auf fremden Seiten verwendete jQuery Methoden wunderbar inspiziert, ein Umstand, den der ganze Firebug auf wunderbare Weise zur Verfügung steht.

Ich bin ein großer Nutzer von jQueryfying, in der letzten Zeit vor allem aus dem zweitletzten Grund. Auch lassen sich neue jQuery Methoden sehr schön ausprobieren. Nie mehr ohne.