Google Wave Einladung
Update 20.12.09: Wieder neue Invites verfügbar!
Ich hätte da noch ein paar Invites zu Google Wave zu vergeben. Wer Interesse hat möge einen Kommentar hinterlassen.
Die Welt aus den Augen eines Webmuckel
Update 20.12.09: Wieder neue Invites verfügbar!
Ich hätte da noch ein paar Invites zu Google Wave zu vergeben. Wer Interesse hat möge einen Kommentar hinterlassen.
Bei t3n.de läuft eine schöne Aktion. Die eigenen Blog-Top5. Hier also ohne große Worte:
Das jqGrid toll ist habe ich ja bereits erwähnt. Nun soll es ja vorkommen, das man nicht immer die gleichen Daten präsentieren will, sondern der User durch Auswahl von bestimmten Suchkriterien Einfluss nimmt. Die Daten die dann typischerweise von einem INPUT-Feld ausgelesen werden, müssen dann mit an das jqGrid-Plugin übergeben werden.
Das ist ganz einfach möglich, indem wir vor dem Request die Daten an das Plugin übergeben:
$(’#ajax_table’).jqGrid( {
beforeRequest:function (){
modal_working(’show’);
// get form-data
var $cfleet = $(’#cfleet’).val();
var $doc_edition = $(’#doc_edition’).val();
var $doc_sub_edition = $(’#doc_sub_edition’).val();
// append data to ajax-url
jQuery.extend(this.postData, {cfleet:$cfleet,doc_edition:$doc_edition,doc_sub_edition:$doc_sub_edition});
},gridComplete: function (){modal_working(’hide’)},
[...]
loadui: false,
[...]
Wie wir sehen werden zunächst die gewünschten Werte via $(’selector’).val(); ausgelesen und in eine Variable gespeichert. Man könnte das natürlich auch direkt in den Aufruf packen. Das eigentliche Anhängen der Daten geschieht mit dem jQuery.extend-Aufruf. Nun werden die Daten aus dem Input gelesen und mit übergeben. Hier muss natürlich ggf. noch entsprechend validiert werden. Die Übergabe erfolgt immer als Wertepaar mit Name:Wert.
Desweiteren habe ich hier noch mein eigenes “Loading-Modal-Window” mit eingebaut. Durch den jqGrid-Parameter loadui:false wird der Standard ausgeschaltet. Vor dem Request und nachdem das Grid komplett ist wird dieses über die Funktion modal_working(action) ein- bzw. ausgeschaltet.
Für ein Projekt habe ich gerade mit dem tollen jqgrid-Plugin für jQuery gearbeitet. Damit lassen sich recht schnell und einfach Tabellendaten dynamisch darstellen. Das Plugin ist sehr gut dokumentiert und es gibt viele Beispiele. Diese beziehen sich aber i.d.R. auf MySQL. Nun habe ich hier aber eine Oracle Datenbank aus der ich die Daten beziehe.
jqGrid zeigt die Daten standardmässig “gepaged” an, d.h. nur eine bestimmte Anzahl Datensätze pro Seite. Diese werden dynamisch via Ajax-Request neu gelesen. Da wir aber selbstverständlich nicht immer alle Sätze aus der Datenbank lesen wollen und anschliessend filtern, soll das Query nur die nötigen Sätze zurückliefern.
In MySQL ist das einfach mit der Limit-Funktion möglich. Diese Funktion gibt es so leider in Oracle nicht, weshalb man etwas umständlicher zum Ziel kommen muss. Dazu umfassen wir uns eigentlichs SQL (hier ###select###) zusätzlich.
SELECT * FROM
(
SELECT
r.*, ROWNUM as row_number
FROM
( ###select### ORDER BY ###sidx### ###sord###) r
WHERE
ROWNUM <= :end_row
)
WHERE :start_row <= row_number
Da ich meine SQL in diesem Projekt als TXT-Datei einlese habe ich hier 3 Marker die ich anschliessend mit den entsprechenden Werten ersetze um mein tatsächliches Statement zu bekommen.
$sql = file_get_contents(’modules/reports/sql/oracle_limit-wrap.sql’);
$sql = str_replace(’###select###’,$select,$sql);
$sql = str_replace(’###sidx###’,$sidx,$sql);
$sql = str_replace(’###sord###’,$sord,$sql);
###select### / $select ist das SQL mit dem ich die eigentlich gewollten Daten aus der Datenbank ziehe.
###sidx### und ###sord### sind die Parameter die von jqGrid beim Update der Ansicht übergeben werden (Sort-Index und Sort-Order).
Bevor wir nun unser neues SQL abschicken müssen wir noch :start_row und :end_row ermitteln. Diese sind abhängig von den von jqGrid übergebenen Parametern ($limit und $start). Sie kommen aus der Berechnung der Gesamtsätze wie es im jqGrid-Beispiel zu sehen ist. $count ist hierbei die Gesamtzahl aller Sätze die wir via “select count(*) …” ermittelt haben.
if( $count > 0 ) {
$total_pages = ceil($count/$limit);
} else {
$total_pages = 0;
}if ($page > $total_pages) $page=$total_pages;
$start = $limit*$page – $limit+1;
$end = $start + $limit-1;
if($start <0) $start = 0;
Nun aber endlich das Query ausführen:
$stmt = oci_parse($conn,$sql);
oci_bind_by_name($stmt, ‘:start_row’, $start);
oci_bind_by_name($stmt, ‘:end_row’, $end);
oci_execute($stmt);
$rows_per_page = $limit;
ocisetprefetch($stmt, $rows_per_page);// build result-array
while ($row = oci_fetch_array($stmt, OCI_ASSOC+OCI_RETURN_NULLS)) {
$rows[] = $row;
}
Zu beachten ist noch, dass wir in unserem Result-Array pro Datensatz jetzt noch eine zusätzliches Feld ROW_NUM haben, das wir in PHP oder im jqGrid noch rausfiltern können.
Zusammenfassung in einfachen Worten:
Anstelle der LIMIT-Funktion umfassen wir unser SELECT nochmals mit einem zusätzlichen SQL und übergeben diese die Limit-Parameter.
OFFTOPIC: Wie bringe ich Wordpress bei Quellcode schön darzustellen?
Um ein PHP-Script zeitgesteuert auszuführen nimmt man unter Linux am besten einen Cronjob. Nun gibt es viele Möglichkeiten das PHP aufzurufen. Als Kommandozeile etwa. Hier ist es aber nicht immer ganz einfach, das auch zum Laufen zu bekommen. Was liegt also näher als das Script als “Webseite” aufzurufen. Alles was man dazu braucht ist der Lynx-Browser. Dieser textbasierte Browser ist z.B. unter Debian mit einem einfachen “apt-get install lynx” schnell installiert.
Nun braucht man nur noch die URL unter der das Script normalerweise via Web aufrubar ist. Mit dem Befehl “crontab -e” editieren wir unsere Cronjobs. So sieht dann der Eintrag aus um unser Script jede Minute laufen zu lassen:
* * * * * lynx -dump http://fladi.de/wp-content/upload/scheduler.php >/dev/null 2>&1
Erklärung:
* * * * * - Zeitsteuerung, wann der Job laufen soll (siehe Wikipedia)
lynx -dump <adresse> – der Aufruf der URL im Browser
>/dev/null 2>&1 – verhindern, dass bei jedem Cron-Aufruf eine Mail gesendet wird
Mein liebster Micha hat mich auf “Bodo Wartke” gestoßen. Schöne Lieder und tolle Texte wie ich finde. Für die MAC-User kann ich natürlich “Lebensqualität” (ausser die letzten Worte) und den “PCDenzenfall” empfehlen. Für alle unterjochten Ehemänner gits “Ja Schatz“. Bei youtube gibts noch viel mehr. Aber auch die offizielle Homepage von Bodo Wartke kann man uneingeschränkt empfehlen. Hier sei besonders der Liebesliedgenerator zu nennen.
Freue mich schon auf einen Liveauftritt in der Nähe…..
Ja sicher mich gibt es noch. Sehr ruhig hier im Blog zur Zeit. Aber immerhin habe ich es jetzt mal geschafft ein paar Updates zu machen. Nicht nur hier im Blog. Die Spielwiese wurde auf eine neuere TYPO3 Version gehoben, das Blog auf die aktuelle Wordpress, mein MAC auf Snow Leopard 10.6 und das Auto war auch vor nicht allzu langer Zeit in der Inspektion. Es ist also alles frisch und der Herbst kommt. Das ist dann auch die Zeit in der vielleicht hier wieder mehr Artikel erscheinen. Bei nassem kalten Wetter besteht nämlich keine Gefahr, dass man sich bei einem Gläschen Wein am Abend auf die Terasse setzt. Auch Gartenarbeit wird irgendwie weniger, weil es nix umzusetzen oder zu pflanzen gibt.
Seit kurzem beschäftige ich mich mal wieder etwas intensiver mit PHP. Dann gibt es sicher auch mal hier wieder öfter ein Update, als das in letzter Zeit der Fall war.
Als erstes möchte ich Dir die Seite phphatesme.com ans Herz legen. Seitdem ich etwas tiefer in die Materie einsteige ist das eine der Seiten die ich quasi täglich besuche. Nebenbei hatte die Seite vor kurzem ihren noch jungen ersten Geburtstag. Trotzdem erfreut sie sich großer stetig wachsender Beliebtheit, was wohl auf die durchweg gute Qualität der Artikel zurückzuführen ist. Bei den rund 400 Artikeln dürfte für jeden etwas dabei sein.
Wer TinyRTE in TYPO3 als Editor einsetzt, und auf Version 1.8.1 geupdatet hat, wird u.U. bemerkt haben, das gesetzte Links auf eine interne Seite nicht mehr so recht funktionieren. Bei mir in Verbindung mit RealURL, bzw. SimulateStatic aufgetreten.
Ursache dafür ist ein kleines Häkchen in der Extension-Konfiguration. Einfach den Haken bei “Store link attributes” entfernen und schon sollte alles wieder so sein wie gewohnt.