Martin Lantzsch
Software Entwickler
16. Dezember 2010

JSON Nodes zählen mit jQuery

16. Dezember 2010 - Geschrieben von Martin - Keine Kommentare

Wenn man wissen will, wie viele Nodes ein JSON Objekt hat, kann man diese mit jQuery ganz leicht auslesen:

myJsonObject.length

Allerdings wird hier nicht rekursiv gezält, sondern nur die Nodes auf der aktuellen „Ebene“.

9. Dezember 2010

SVN Repo bei Commit nach htdocs kopieren

9. Dezember 2010 - Geschrieben von Martin - Keine Kommentare

Oft arbeitet man im Team an einer Webanwendung und würde gerne Testern den aktuellen Stand der Entwicklung geben. Um das nicht allzu umständlich zu machen, ist es hilfreich immer das aktuelle SVN Repo im WebRoot des Server abzulegen.

Hier kommt uns die Hook Schnittstelle von Subversion entgegen, welche erlaubt an bestimmten Events eigene Shell Scripte ausführen kann (wie z.B. nach dem Commiten).

Zu finden sind diese unter

/[SVNREPO]/hooks/

Wir öffnen nun den Hook, der nach dem Commiten ausgeführt wird:

cd /[SVNREPO]/hooks/
nano post-commit.tmpl

in dieser Datei bewegen wir uns nun mit dem Zeiger ganz runter und fügen folgenden Code ein:

svn checkout file:///[SVNREPO]/[DIRNAME] /var/www/[DIRNAME]
cd /var/www/[DIRNAME]
svn update

also z.B.

svn checkout file:///svnrepos/resigame /var/www/resigame
cd /var/www/resigame
svn update

Nun speichern wir es mittels [STRG] + [O] ab und benennen die Datei um (damit sie vom SVN erkannt wird):

cp post-commit.tmpl post-commit

und nun noch ausführbar machen (ist ja ein Shell Script ;))

chmod +x post-commit
1. Oktober 2010

MonoDevelop auf Ubuntu – GTK# fehlt

1. Oktober 2010 - Geschrieben von Martin - Keine Kommentare

Gerade habe ich auf meinem Frischen Ubuntu MonoDevelop installiert und musste Feststellen das beim erstellen eines Projekts, bzw in den Projekt Einstellungen keine GTK# Version gewählt werden kann.

Folgende Fehlermeldung wurde beim Kompilieren eines Projekts ausgegeben:

The type or namespace name ‚Gtk‘ could not be found. Are you missing a using directive or an assembly reference? (CS0246)

Über apt hab ich festgestellt, das ich gar keine Gtk# Lib installiert hatte also habe ich geschwind folgendes Paket installiert und die Sache war gegessen:

sudo apt-get install gtk-sharp2

Nach einem Neustart der MonoDevelop IDE sollte alles wie gewohnt funktionieren.

26. September 2010

WordPress Sidebar temporär ausblenden

26. September 2010 - Geschrieben von Martin - Keine Kommentare

WordPress, die meist genutzte Blogsoftware ist oft sehr eigenwillig und widerspenstig. Aber wenn man weiß wo man anpacken muss, ich das alles kein Problem.

Das Problem ist oft, das die Sidebar z.B. auf einer Formularseite oder neben einer Galerie sehr viel Platz einnimmt, welchen man mit dem Inhalt viel besser nutzen könnte.

Nun wollen wir die Sidebar z.B. für das Foto Album Modul ausblenden, hierzu öffnen wir mit dem Plugin Editor das Plugin Template (das ist das mit dem HTML Code) und fügen ganz oben folgenden Code ein:

<style type="text/css">
#sidebar { display: none; }
#content { width: 850px; }
</style>

Dieses Snippet müssen wir natürlich noch anpassen, aber nun erst mal die Erklärung was passiert. Sobald das Template nun von WordPress geladen wird, erkennt der Browser, das der Container mit der ID sidebar nicht dargestellt werden soll (display:none). Nun verschwindet zwar die Sidebar aber der Platz ist noch immer ungenutzt, dies ändern wir mittels der 2. Anweisung, der Content Container soll eine Breite von 850 Pixeln bekommen (das Entspricht beim Linux Doku Template Content- + Sidebar- Container). Diese Breite kann man über diverse Browser Erweiterungen (Stichwort Lineal) auslesen oder man nimmt sich die CSS Datei vor und rechnet selbst.

Allerdings funktioniert diese Lösung nicht bei allen Templates. Mit den gängigsten bei denen Inhalt und Sidebar nebeneinander stehen und kein fixed Hintergrundbild haben, dürfte es keine Probleme geben.

18. August 2010

einfaches PHP Plugin System

18. August 2010 - Geschrieben von Martin - 6 Kommentare

Plugin Systeme, sie sind viel gefragt in der heutigen Zeit, jeder will seinen Code schön erweiterbar haben, doch viele haben entweder gar keinen Schimmer wie sie das am besten machen oder sie setzten es teils auf unglaubliche Weise um. Ich habe schon die verrücktesten Kostruktionen gesehen, die Code aus Datenbanken lesen oder wie die phpBB Jungs, die einen ganzen Parser geschrieben haben, der Core Dateien Modifiziert, um an bestimmten Stellen eigenen Code ausführen zu können. Für mich ist das alles Humbug, ein Plugin System muss flexibel und performant sein und nicht zuletzt sollte das ganze so umgesetzt werden, dass vom Benutzer selbst keinerlei Änderung am Code durchgeführt werden muss um ein Plugin einzubauen/zu laden.

Dem habe ich mir angenomen, und zwar habe ein an meinem SimpleLD Framework angelehntes Plugin System (bzw. eine Klasse) geschrieben, die alle aufgezählten Punkte vereint. Folgende Funktionen hat das ganze:

  • Überall einsetzbar – Es ist lediglich eine Klasse, welche in jedem PHP Projekt verwendet werde kann
  • Sie erlaubt es Code an vorher definierten Stellen im eigenem Programm einzuhängen und auszuführen. (mittels Hooks dt. Haken)
  • Die Plugins können ohne Programmier Kentnisse vom Benutzer einfach „installiert“ werden. Denn dazu muss lediglich eine Klasse in ein vordefiniertes Verzeichnis kopiert werden.

(Für die Ungeduldigen, hier gehts zum Github Repo: PHP-Plugin-System @ Github)
Durch die geringe Anzahl an Code Zeilen (rund 100 mit Kommentaren) arbeitet das ganze System Performant. Allerdings wird es je nach Anzahl installierter Plugins langsamer, das kann aber durch einen Cache (siehe SimpleLD Framework) umgangen werden.

Wie funktioniert das ganze?
Die Funktionsweise ist ganz simpel. Plugins bestehen aus ganz normalen Klassen mit public Methoden, welche sich alle in einem von ihnen bestimmten Verzeichnis befinden. Von dort liest das Plugin System alle Klassen ein und speichert Methoden als sogenannte Hooks (dt. Haken) in einem Array. Falls im Code ein solcher Hook aufgerufen wird, werden alle Plugins mit einer passenden Methode herausgesucht und aufgerufen.

Praktisches Beispiel
Plugin Klasse (sample.php)

class sample {
  public function helloWorld() {
    echo "Hello World!";
  }
}

Wichtig: Die Klasse muss exakt so wie die Datei benannt werden! Alle Methoden ohne beginnendes _ werden als Hooks verwendet!

Datei in der das Plugin verwendet wird (index.php)

// laden des Plugin Systems
include('plugins.class.php');
// starten des Systems mit Übergabe des Plugin Verzeichnisses
plugins::start('plugin/ordner/');
// nun können wir einen Hook aufrufen
plugins::call('helloWorld');
// dann noch einen anderen 
plugins::call('foo');

Mit Parametern
Natürlich kann an Hooks auch Parameter übergeben werden. Dies geschieht in Form eines Arrays:

plugins::call('foo', array('Parameter 1', 'Parameter 2', 'Parameter 3'));

Die Methode des Plugin sieht dann folgendermaßen aus:

public function foo($parameter1, $parameter2, $parameter3) {
  // was auch immer wir tun möchten ...
}

Dabei muss allerdings beachtet werden, dass die übergeben Parameter alle von der Methode entgegen genommen werden müssen, ansonsten bricht PHP mit einem Fehler ab.

Nimmt man Änderungen an der Parametern innerhalb des Hooks vor und will diese an den Orginal Code wieder „zurückgeben“, bzw mitteilen, setzt man einfach & vor die Variable:

$var = "foo";
plugins::call('foo', array(&$var));
// Inhalt nach Änderung durch den Hook foo
echo $var;

Die Methode des Plugin sieht dann folgendermaßen aus:

public function foo(&$blub) {
  // hier können wir nun $blub ändern
}

Source Code beziehen
Der Code kann hier mit Beispielen in meinem Git Repo heruntergeladen werden:
http://github.com/LinuxDoku/PHP-Plugin-System/
oder für die faulen unter uns der Direktlink
… ich bin der Direktlink zur Zip Datei …

Tipps’n Tricks

  • Der Verzeichnis Parser liest die Plugins nach altbekannten Regeln des Alphabets (dem ABC ;-)) ein, demzufolge werden Hooks, deren Plugin Namen z.B. mit A beginnen vor Hooks, deren Plugin Namen mit M beginnen ausgeführt. Sollte dies nicht gewünscht sein, kann man sich an der Methode „load“ des System zu schaffen gemacht werden.
  • Beim Starten des System muss dem Plugin Ordnername immer ein Endendes / (Slash) mitgegeben werden!
  • Es empfiehlt sich das System in einer Global verwendeten Datei zu Starten, da ansonsten ziemlich viele Ressourcen benötigt werden. Und ein mehrfacher Start unnötig ist.
15. August 2010

PHP Timestamp heute?

15. August 2010 - Geschrieben von Martin - Keine Kommentare

Eben habe ich eine kleine Funktion geschrieben um zu Prüfen ob ein gegebener Timestamp heute ist, nichts gewaltiges aber nützlich.

function isToday($time)
{
  $begin = mktime(0, 0, 0);
  $end = mktime(23, 59, 59);
  // check if given time is between begin and end
  if($time >= $begin && $time <= $end)
  {
    return true;
  } else {
    return false;
  }
}

Falls ab 23 Uhr Abends false zurückgegeben wird, sollten Sie mal nach ihrer Server Uhr schauen (Zeitzonen oder Sommer-/Winter- Zeit).

So wird unter anderem in Resigame eine Anzeige gesteuert, die Signalisiert ob ein User heute bereits Online war.

4. August 2010

jQuery idTabs bei Seitenwechsel speichern

4. August 2010 - Geschrieben von Martin - 2 Kommentare

In letzter Zeit beschäftige ich mich wieder verstärkt mit JavaScript, bzw. jQuery. Heute habe ich auf Basis von idTabs (@BissyDesign – Danke für den Tipp ;-)) ein Horizontales Menü beflügelt, dessen Untermenüpunkte nun bei klick auf einen Obermenüpunkt ohne Seitenreload wechseln. Lange Rede kurzer Sinn:

und so sieht es nach dem klick auf „Nachrichten“ aus:

Leider hat die Sache mit idTabs einen Haken, und zwar springt das Menü nach einem Seitenreload wieder zum ersten Tab zurück und bleibt nicht beim gewählten. Doch dafür habe ich eine ganz einfache Lösung gefunden.

Als erstes müssen wir das jQuery Cookie Plugin einbinden: http://plugins.jquery.com/project/cookie
Nächster Schritt ist die Modifikation des idTabs Plugins, man suche folgende Stelle im Code (im Unkomprimierten Zeile 95):

$(id).show();
return s.change; //Option for changing url

und ändere dies zu:

$(id).show();
// write to cookie
$.cookie('PAGENAME_menu', id.split('#')[1], { expires: 1 });
return s.change; //Option for changing url

(PAGENAME_menu ist der Cookie Name, welcher an die Gegebenheiten angepasst werden muss).

Anschließend muss noch der Funktionsaufruf von idTabs Modifiziert werden:

$("#menu ul").idTabs();

zu

id = $.cookie("PAGENAME_menu");
if(id == null) { id = 0; } // failback if no cookie is availible
$("#menu ul").idTabs(id);

Nun wird bei jedem Tabwelchsel der aktuelle Tab in einen Cookie geschrieben. Beim neu laden der Seite wird dieser ausgelesen und dessen Wert (der letzte Tab) an idTabs als default Tab übergeben. Es muss lediglich beachtet werden, das keiner der Tabs das Attribut „class=’selected'“ hat, da unser Hack Trick sonst nicht funktioniert.

3. August 2010

jQuery Element Blinken lassen

3. August 2010 - Geschrieben von Martin - 4 Kommentare

Blinkende Gifs, man sieht sie nicht mehr allzu oft, aber dennoch sind sie manchmal brauchbar, um dem Benutzer etwas zu signalisieren. Leider kann man diese schlecht handhaben, denn ein mal erstellt, müsste man bei einer Änderung wieder von vorne beginnen.

Warum also nicht JavaScript dazu verwenden? Mit dieser kleinen Funktion kann man ein Element blinken lassen. Und zwar wird es erst versteckt und dann wieder eingeblendet (jQuery muss natürlich vorhanden sein):

function blink(elm, msec, speed) {
  $(elm).hide();
  $(elm).fadeIn(speed);
  window.setTimeout("blink('" + elm + "', " + msec + ", '" + speed + "')", msec);
}

elm – sagt welches Element blinken soll, z.B. „#messageIcon“
msec – die Anzahl der Milisekunden, bis die Funktion erneut aufgerufen wird. Hier sollte allerdings beachtet werden, das der Effekt auch eine gewisse Zeit benötigt, und der Nutzer durch schnelle Zeiten gestört werden könnte.
speed – gibt die Geschwindigkeit an, entweder „fast“ oder „slow“.