Archiv für den Monat: Februar 2008

T3: ml_links

Die TYPO3-Extension ml_links ermöglicht es, vor bzw. nach einem Link ein spezielles Symbol darzustellen. So habe ich auf einer Webpräsenz eingestellt, dass vor jedem externen Link eine kleine Weltkugel, vor jedem mailto-Link ein Brief und vor jedem PDF-Download das PDF-Symbol dargestellt wird. Weitere Informationen sind auf der Beschreibung der Extension: hier

Etwas habe ich jedoch vermisst: das mitgeben zusätzlicher Attribute für das img-Tag dieses Symbols. Die Extension wurde so umgebaut, dass man mit TSConfig den Wert image.params setzen kann. In der Datei class.tx_mllinks_pi1.php (im Ornder /ext/ml_links/p1/) wurde die erste Funktion insertImage wie folgt angepasst:

/**
* add image
*/
function insertImage ($data, $linkTag) {
$img = „“;
if (file_exists($data[‚image‘])) {
// start img tag
$img .= ‚<img src=“‚ . $data[‚image‘].'“‚;
if (isset($data[‚image.‘][‚alt‘])) {
$img .= ‚ alt=“‚ . $data[‚image.‘][‚alt‘].'“‚;
}
if (isset($data[‚image.‘][‚params‘])) {
$img .= $data[‚image.‘][‚params‘];
}
// end img tag
$img .= ‚/>‘;
// surround img-tag with a link?
if (isset($data[‚image.‘][‚link‘]) && $data[‚image.‘][‚link‘] == 1) {
$img = $linkTag . $img . ‚</a>‘;
}
if (!empty($this->tag)) {
if (isset($data[’separator‘])) {
$img = $data[’separator‘] . $img;
}
else {
$img = $this->separator . $img;
}
}
$this->buildLink = true;
}
return ($img);
}

Die Funktion main(…) wurde im case URL ebenfalls geändert:

//add image
if (isset($data[‚image.‘][$ext]) && file_exists($data[‚image.‘][$ext])) {
$imageTag = ‚<img src=“‚ . $data[‚image.‘][$ext].'“‚;
if (isset($data[‚image.‘][$ext][‚alt‘])) {
$imageTag .= ‚ alt=“‚ . $data[‚image.‘][$ext][‚alt‘] . ‚“‚;
}
if (isset($data[‚image.‘][$ext][‚params‘])) {
$imageTag .= $data[‚image.‘][$ext][‚params‘];
}
$imageTag .= ‚/>‘;
}
elseif (file_exists($data[‚image‘])) {
$imageTag = ‚<img src=“‚ . $data[‚image‘].'“‚;
if (isset($data[‚image.‘][‚alt‘])) {
$imageTag .= ‚ alt=“‚ . $data[‚image.‘][‚alt‘] . ‚“‚;
}
if (isset($data[‚image.‘][‚params‘])) {
$imageTag .= $data[‚image.‘][‚params‘];
}
$imageTag .= ‚/>‘;
}

Meine Konfiguration ( TSConfig) lautet nun (Vorlage von hier):

lib.ml_links_conf {
seperator = „“
external {
10.image = typo3conf/ext/ml_links/icon_globe.gif
10.image.alt = Externer Link
10.image.params = class=“mllinkimg“
10.image.link = 1
20.linkTag = 1
}
mailto {
10.image = typo3conf/ext/ml_links/icon_mailto.gif
10.image.alt = Mail Link
10.image.params = class=“mllinkimg“
10.image.link = 1
20.linkTag = 1
}
pdf {
10.image = typo3conf/ext/ml_links/icon_pdf.gif
10.image.alt = PDF
10.image.params = class=“mllinkimg“
10.image.link = 1
20.linkTag = 1
30.filesize = 1
}

}

# Links im normalen Text
# Text und Text m/Bild – RTE – normaler Textlink
tt_content.text.20.parseFunc.tags.link.postUserFunc = tx_mllinks_pi1->main
tt_content.text.20.parseFunc.tags.link.postUserFunc < lib.ml_links_conf

# Text und Text m/Bild – Link auf dem Bild
tt_content.text.20.parseFunc.tags.link.typolink.userFunc = tx_mllinks_pi1->getFiletype
tt_content.text.20.parseFunc.tags.link.typolink.userFunc < lib.ml_links_conf

# Links in Listen – GEHT NET ???
# Inhaltselemente Text und Text m/bild – RTE – Links in Listen
tt_content.text.20.parseFunc.tags.typolist.default.parseFunc.tags.link.postUserFunc = tx_mllinks_pi1->main
tt_content.text.20.parseFunc.tags.typolist.default.parseFunc.tags.link.postUserFunc < lib.ml_links_conf

tt_content.text.20.parseFunc.tags.typolist.default.parseFunc.tags.link.typolink.userFunc = tx_mllinks_pi1->getFiletype
tt_content.text.20.parseFunc.tags.typolist.default.parseFunc.tags.link.typolink.userFunc < lib.ml_links_conf

So weit so gut. Nur etwas funktioniert noch nicht wie gewünscht: Links, die in Listen (li) erscheinen, werden nicht geparst. Vielleicht finden wir auch da noch eine Lösung.

CPU versus Anwälte

Im Unterricht lesen wir das Buch „Operation System Concepts with Java“ von Silberschatz. Ein interessantes Werk über Betriebssysteme und was dazu gehört. Beim Thema multiprogramming steht folgender Vergleich zwischen der CPU und Anwälten:

„This idea is common in other life situations. A lawyer does not work for only one client at a time, for example. While one case is waiting to go to trial, or have papers typed, the lawyer can work on another case. If he has enough clients, the lawyer will never be idle for lack of work. (Idle lawyers tend to become politians, so there is a certain social value in keeping lawyers busy.)

Kein Kommentar 😉

Pagination mit CodeIgniter

Seit einiger Zeit verwende ich das PHP-Framework CodeIgniter zur Erstellung einer Web-Applikation. CodeIgniter bringt für das sog. Pagination (zeigt sowas ähnliches wie

« First < 1 2 3 4 5 > Last »

zum Darstellen grosser Listen auf mehrern Seiten) eine coole Library mit.

Kurzes Tutorial zur Verwendung der Pagination-Library mit zusätzlichen Argumenten (sort order, sort direction):

1. Erstellen der Links:

$this->load->library(‚pagination‘);
$config[‚base_url‘] = base_url().’/controller/index/‘.$data[’sortCol‘].’/‘.$data[’sortDir‘].’/‘;
$config[‚uri_segment‘] = 5;
$config[‚total_rows‘] = $this->model->getNofRecords($id);
$config[‚per_page‘] = $this->config->item(‚itemsPerPage‘);
$this->pagination->initialize($config);
$data[‚links‘] = $this->pagination->create_links();

Damit wird in $data [‚links‘] die Links für das Navigieren gespeichert. In base_url wird die URL angegeben, an die anschliessend das Pagination-Argument (=start index) angehängt wird. Nach der Variable sortCol und sortDir wird eine Zahl angehängt, welche den Startindex darstellt. uri_segment muss in diesem Fall 5 sein, da dieser Startindex das 5. Segment sein wird (controller ist 1.). total_rows wird aus der Datenbank gelesen (insgesamte Anzahl Datensätze), per_page wird aus der Konfiguration gelesen.

2. Konstruktor des Controllers

Der Konstruktor des Controllers nimmt 3 Argumente auf: sortCol, sortDir und startIndex. Alle drei haben Default-Werte, müssen also nicht zwingend mitgegeben werden. Insebesondere das letzte Argument (startIndex) sollte einen Default-Wert haben, da auf der 1. Seite die Pagination-Library keinen Wert mitgibt:

function index($sortCol=’vehicle.carNumber‘,$sortDir=’ASC‘, $startInd=0){…

Die Parameter werden in internen Variablen gespeichert bis zur Verwendung.

3. Verwendung:

Dem Model werden die obigen drei Parameter mitgegeben. Der Aufruf sieht folgendermassen aus:

$data[‚data‘] = $this->model->getList($id, $this->sortColumn, $this->sortDirection, $this->startIndex);

4. Das Model

Im Model wird die Query mit dem Limit-Operator angereichert:

$this->db->select(‚field‘)->from(‚table‘)->Where(‚user_id‘, $user_id)->order_by($sortColumn, $sortDirection)->limit($this->config->item(‚itemsPerPage‘), $startIndex);

Linuxtreff: Basket und UML-Modeling

Die Themen am gestrigen Linuxtreff in Kreuzlingen waren wie immer sehr breit:

  • Basket: zurzeit verwende ich unter Ubuntu TomBoy, um meine Notizen zu verwalten. Ein wirklich tolle Alternative ist Basket. Dieses kleine Tool hat viele weitere Möglichkeiten wie z.B. passwortgeschützte Seiten. Auch können verschiedene Textblöcke auf einer Seite erstellt werden, die dann per Drag and Drop bequem hin und her geschoben werden können. Und das labeling/taggen ist natürlich auch möglich. Die Features sind sehr zahlreich. Einziger Nachteil: es ist eine KDE-Applikation 😉
  • UML-Modeling/Business Prozesse abbilden: wir haben über UML-Modeling-Tools gesprochen, am besten inkl. Code-Erzeugung. Revo hat sich stark damit beschäftigt und evaluiert zurzeit verschiedene Tools. Wie ich es verstanden habe, stellt er sich etwas ähnliches wie unter http://ejohn.org/apps/dmodeler/ gezeigt vor (nur mit Abspeichern und Export in andere Formate). Das Tool Dia war erstaunlicherweise weitgehend unbekannt.
  • LUG St. Gallen: es ist geplant, in St. Gallen einen Ableger der LUG Kreuzlingen zu bilden. Paul ist am suchen eines Lokals. Bin gespannt, ob und wann sich da etwas entwickelt.
  • etc. 😉

PHP Frameworks

Kürzlich wurde ein neues PHP-Framework vorgestellt, auf dem TYPO3 5.0 basieren wird. Es hat den Namen flow3.

Persönlich habe ich meinen Entscheid bereits vor einigen Wochen getroffen. Die Wahl ist auf CodeIgniter gefallen. Die durchgehend vorhandene MVC-Architektur gefällt mir sehr. Meine erste grössere Webapplikation damit ist in Arbeit. Einige Tipps und Anfangs-Hürden werde ich in einem späteren Post beschreiben.

Hinter CodeIgniter steht die Firma  EllisLab Inc.. Doch die Software ist OpenSource und wird auch weiterentwickelt. Erst gerade (Ende Januar) wurde die neue Version 1.6 des Frameworks veröffentlicht. Von CodeIgniter gibt es jedoch auch einen Fork. Das Framework heisst kohanaPHP und ist noch ziemlich ähnlich wie CodeIgniter. Grosse Unterschiede sehe ich auf den ersten Blick nicht. Zurzeit ist CodeIgniter noch besser dokumentiert. Als Grund für die Abspaltung wird übrigens die Schirmherrschaft von EllisLab angegeben. kohanaPHP soll ein „echtes“, von der Community entwickeltes Framework werden. Ich finde: Konkurrenz hat noch nie geschadet. Und diese Entwicklung zeigt gerade das Potential und Anhängerschaft, die hinter diesen beiden Frameworks stehen.

Ich werde die Entwicklung der PHP-Frameworks interessiert weiterverfolgen. Und ich kann mir auch jederzeit vorstellen, für neue Projekte andere Frameworks einzusetzen, wenn es die Anforderungen verlangen. Für die „grossen“ (symfony und cakePHP) habe ich zurzeit noch keinen Bedarf, da CodeIgniter meine Bedürfnisse gut abdeckt.

Wer übrigens eine Übersicht von PHP-Frameworks sucht, dem sei folgender Link empfohlen: http://www.masterbootrecord.de/blog/… Wenn man CodeIgniter noch hinzunimmt, ist die Auflistung beinahe komplett 😉