Subcribe via RSS

Eclipse Autocomplete für CodeIgniter

Juli 24th, 2010 | No Comments | Posted in Coding

Ich verwende für so ziemlich alle meine Programmierarbeiten die Eclipse IDE. Leider hatte ich bisher noch keinen Weg gekannt das Autocomplete für CodeIgniter-Projekte zu aktivieren. Die Dokumentation von CodeIgniter ist zwar richtig gut, dennoch kostet das Nachschlagen seltener verwendeter Methoden doch immer recht viel Zeit. Ein Autocomplete ist für die CodeIgniter Methoden ist daher eine echte Erleichterung. Damian Gostomski erklärt in diesem Post wie es geht. Auch wenn man das Projekt cleanen muss und Eclipse neustarten muss – irgendwann funktioniert es. Also am besten einfach mal austesten:

1) In system/codeigniter/Base5.php (bzw. Base4.php) am Ende des Konstruktors den folgenden Code einbinden:


if(false) { // eclipse autocomplete
$agent = new CI_User_agent();
$benchmark = new CI_Benchmark();
$calendar = new CI_Calendar();
$cart = new CI_Cart();
$config = new CI_Config();
$db = new CI_DB_active_record();
$email = new CI_Email();
$encrypt = new CI_Encrypt();
$form_validation = new CI_Form_validation();
$ftp = new CI_FTP();
$image_lib = new CI_Image_lib();
$input = new CI_Input();
$lang = new CI_Language();
$output = new CI_Output();
$pagination = new CI_Pagination();
$parser = new CI_Parser();
$session = new CI_Session();
$table = new CI_Table();
$trackback = new CI_Trackback();
$typography = new CI_Typography();
$unit = new CI_Unit_test();
$upload = new CI_Upload();
$uri = new CI_URI();
$xmlrpc = new CI_Xmlrpc();
$xmlrpcs = new CI_Xmlrpcs();
$zip = new CI_Zip();
}

2) Project -> clean
3) Eclipse neu starten
4) falls das Autocomplete nicht erscheint den Shortcut Strg + Leer testen

Tags: ,

CodeIgniter Validation-Library Probleme mit PHP 4

Oktober 22nd, 2009 | No Comments | Posted in Coding

Die CodeIgniter-Validation-Library zum Überprüfen von Formularen hat mit PHP 4 ein Problem.

Wer die Fehlermeldung

Message: Undefined property: ...

in seiner View erhält kann sich mit

$data['this'] = $this;

im Controller behelfen. So wird das $this in der View erreichbar und somit sind auch die Validation-Values zugreifbar.

Tags: , ,

Mischen von Query-Strings und URL-Segmenten

Juli 21st, 2009 | No Comments | Posted in Coding

CodeIgniter ist auf saubere URLs ausgelegt. Das heißt, dass Daten entweder per post durch Formulare oder per URL-Segment übergeben werden. Ein Zugriff auf das $_GET-Array ist in der Standardkonfiguration nicht vorgesehen. Dennoch kann es nötig sein eben dieses $_GET-Array zu nutzen. Eine Suchfunktion kann zum Beispiel ein Grund dafür sein. Zwar könnte der Suchstring auch mit post aus dem Formular übergeben werden, jedoch gäbe es keine Ergebnis-URLs, die z.B. vom Benutzer kopiert werden könnten. Entweder man kodiert den Suchstring mit base64 und nutzt diesen dann als URL Segment, so dass eindeutige URLs entstehen für alle Suchanfragen, allerdings ist diese URL dann natürlich nicht mehr lesbar. Will man lesbare URLs, muss man zwangsläufig auf die Get-Methode zurückgreifen.

Dazu setzt man in system/application/config/config.php den Wert von uri_protocol von AUTO auf PATH_INFO.

$config['uri_protocol']	= "PATH_INFO";

In den Controllern, in denen nun das $_GET-Array genutzt werden soll muss folgende Zeile in den Konstruktor:

parse_str($_SERVER['QUERY_STRING'],$_GET);

Damit kann dann in diesen Controllern ganz normal auf $_GET zugegriffen werden. Dennoch bleiben auch die URL-Segmente aktiviert und können weiter genutzt werden.

Tags: , ,

CodeIgniter error reporting / logging

Juli 20th, 2009 | No Comments | Posted in Coding

CodeIgniter wurde so entwickelt, dass es auf möglichst vielen Servern ohne Probleme läuft. Daher wird die Serverumgebung als unbekannt vorausgesetzt. Einstellungen wie display_error werden daher nicht beachtet. Vielmehr wird bei jedem Seitenaufruf die PHP-Funktion error_reporting aufgerufen. Wer die Einstellungen von error_reporting aber in der config.php sucht, wird vergeblich suchen. Eingestellt wird das error_reporting in der index.php im root-Verzeichnis.

Für den Test- und Entwicklungsbetrieb eignet sich

error_reporting(E_ALL);

Für den Produktivbetrieb, sollte diese Einstellung aber auf jeden Fall in

error_reporting(0);

geändert werden. Generell sollten zwar so wenig Fehler wie möglich auftreten, leider gibt es aber doch immer wieder Unvorhersehbarkeiten, die durch das Error Reporting sensible Daten aufdecken könnten.

Allerdings ist es allein mit dem Error Reporting noch nicht getan, denn Datenbankfehler werden dennoch angezeigt. Um auch diese im Produktivbetrieb auszuschalten muss in system/application/database.php

$db['default']['db_debug'] = TRUE;

in

$db['default']['db_debug'] = FALSE;

geändert werden.

Zwei einfache Handgriffe, die in jedem Fall zur Sicherheit der Applikation und des Servers beitragen und niemals vergessen werden sollten. Am besten aktiviert man, wenn man schon dabei ist in system/application/config.php das Fehler Logging. Dazu wird

$config['log_threshold'] = 0;

auf

$config['log_threshold'] = 1;

gesetzt. So werden alle aufgetretenen PHP-Fehler in system/logs/ geloggt.

Tags: , , ,

Codeigniter imagettftext() Problem – Could not read font

Juni 23rd, 2009 | No Comments | Posted in Coding

Wer mit Codeigniter (1.7.1) und der PHP-Funktion imagettftext() versucht Text in ein Bild zu schreiben wird – zumindest wenn er eine XAMPP Umgebung unter Windows nutzt – auf seltsame Probleme stoßen.

Trotz korrektem Pfad zur integrierten Schrift, der texb.ttf, tritt nämlich die Fehlermeldung imagettftext: Could not read font auf. Da hilft kein experimentieren oder ändern des Pfades, es hilft nur eine neue Schriftart, denn offensichtlich ist diese Schriftart defekt oder funktioniert unter Windows nicht korrekt (unter Linux habe ich es noch nicht getestet). Massig coole Schriftarten gibt’s übrigens bei dafont. Die neue Schriftart sollte dann im dafür vorgesehenen Ordner system/fonts/ gespeichert werden.

Und hier nochmal ein kleines Snippet, das zeigt wie man dann mit der neuen Schriftart Texte in Bilder schreibt:

// Bild erzeugen, Farbe allokieren
$width = 400;
$height = 100;
$im = imagecreate($width, $height);
$background_color = ImageColorAllocate ($im, 255, 255, 255);
$text_color = ImageColorAllocate ($im, 0,0,0);
 
// schreiben
$text = 'TEXT';
$font_size=60;
$angle=0;
$x=30;
$y=80;
$font_path     = './system/fonts/neue_schriftart.ttf';
imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, $text);
 
// Bild ausgeben
header("Content-type: image/png");
ImagePNG ($im);
ImageDestroy($im);

Ich habe in diesem Fall ein png erstellt. Den Code umzubauen, so dass ein gif oder jpeg erzeugt wird, sollte aber kein Problem sein.

Tags: , , , ,

Umlaute (und Pluszeichen +) in CodeIgniter URLs

Juni 8th, 2009 | No Comments | Posted in Coding

Von Hause aus ist CodeIgniter so konfiguriert, dass keine Umlaute und auch kein Pluszeichen in der URL erlaubt sind. Allerdings lässt sich das in system/application/config/config.php ändern.

Dazu ersatz man die Zeile mit permitted_uri_chars durch das folgende Snippet:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+\-äöüß-';

Das erlaubt dann URLs auch in einem Format wie controller/methode/ö+ä/. Die Verwendung von Umlauten ist allerdings nicht unbedingt zu empfehlen. Manche Foren und Blogs enkodieren die Umlaute anders, genauso wie manche Browser. Man sollte bei der Verwendung also zumindest darauf achten auch die URLs, die mit UTF-8 enkodiert wurden (z.B. %C3%B6 für ö), entsprechend umzuleiten.

Ganz zufrieden bin ich mit dieser Lösung noch nicht, wer also bessere Ideen für eine Lösung des CodeIgniter-Umlaut-URL-Problem hat, darf diese natürlich gerne hier posten!

Tags: , , , ,

CodeIgniter Suchmaschine mit Lucene aus dem Zend-Framework

Juni 1st, 2009 | No Comments | Posted in Coding

Um eine ordentliche Suchfunktion in das eigene Web-Projekt zu integrieren bedarf es entweder einer Menge Arbeit oder der Nutzung von Lucene. Bei Lucene handelt es sich um eine plattformunabhängige Such- und Index-Programmierschnittstelle der Apache Software Foundation. Die Wikipedia setzt beispielsweise Lucene zur Volltextsuche ein.

Der einfachste Weg Lucene in CodeIgniter zu integrieren ist die Verwendung der Zend-Lucene-Bibliothek. Dazu gibt es ein gutes Tutorial von Fred Wu, das ich hier kurz zusammenfassen und um die Suchfunktionalität erweitern werde.

Zend-Bibliotheken in CodeIgniter integrieren

  1. Aktuelle Version des Zend-Frameworks hier herunterladen
  2. Paket entpacken und den Ordner Zend (unter Library) in das CodeIgniter-Verzeichnis application/libraries/ kopieren
  3. Das unten angegebene Script in das gleiche Verzeichnis kopieren(application/libraries/)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
* Zend Framework Loader
*
* Put the 'Zend' folder (unpacked from the Zend Framework package, under 'Library')
* in CI installation's 'application/libraries' folder
* You can put it elsewhere but remember to alter the script accordingly
*
* Usage:
*   1) $this->load->library('zend', 'Zend/Package/Name');
*   or
*   2) $this->load->library('zend');
*      then $this->zend->load('Zend/Package/Name');
*
* * the second usage is useful for autoloading the Zend Framework library
* * Zend/Package/Name does not need the '.php' at the end
*/
class CI_Zend
{
/**
* Constructor
*
* @param	string $class class name
*/
function __construct($class = NULL)
{
// include path for Zend Framework
// alter it accordingly if you have put the 'Zend' folder elsewhere
ini_set('include_path',
ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries');</code>
 
<code>if ($class)
{
require_once (string) $class . EXT;
log_message('debug', "Zend Class $class Loaded");
}
else
{
log_message('debug', "Zend Class Initialized");
}
}
 
/**
* Zend Class Loader
*
* @param	string $class class name
*/
function load($class)
{
require_once (string) $class . EXT;
log_message('debug', "Zend Class $class Loaded");
}
}
?&gt;

Das war’s schon! Damit können jetzt die Bibliotheken des Zend-Frameworks in CodeIgniter genutzt werden. Man lädt die Bibliotheken folgendermaßen:

1
2
$this->load->library('zend');
$this->zend->load('Zend/Name_der_Bibliothek');

Die Endung .php wird bei der Angabe des Bibliotheksnamen nicht benötigt.

Suchfunktionalität mittels Lucene in Codeiginter integrieren

Da jetzt die Zend-Bibliotheken in CodeIgniter nutzbar sind, steht einer Nutzung von Lucene ebenfalls nicht mehr im Weg. Schauen wir uns einmal den dazu benötigten Controller an (suche.php):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
class Suche extends Controller {
 
    function Suche() {
		parent::Controller();
 
		// Zends Lucene-Bibliothek laden
		$this->load->library('zend');
		$this->zend->load('Zend/Search/Lucene');
 
		// Suchindex festelegen
		$this->search_index = APPPATH . 'search/index';
	}
 
	function index(){
		$this->load->view('search_view');
	}
 
	function index_it() {
		// Index erstellen (bisheriger Index wird gelöscht)
		$index = Zend_Search_Lucene::create($this->search_index);
 
		// Content, der indexiert werden soll aus DB auslesen
		$query = $this->db->get('brand_content');
 
		// Alle Content-Instanzen zum Index hinzufügen
		foreach ($query->result() as $item) {
			// Lucene Document für diese Content-Instanz erstellen
			$doc = new Zend_Search_Lucene_Document();
 
			// dieser Titel wird in den Suchergebnissen angezeigt
			$doc->addField(Zend_Search_Lucene_Field::Text('title', $item->title));
			// mit diesem Pfad werden die Suchergebnisse verknüpft
			$doc->addField(Zend_Search_Lucene_Field::Text('path', '/brand/'.$item->parent.'/' . $item->slug.'/'));
			// dieser Inhalt wird neben dem Titel indexiert
			$doc->addField(Zend_Search_Lucene_Field::UnStored('content', $item->content));
 
			// zum Index hinzufügen
			$index->addDocument($doc);
 
			echo 'Added ' . $article->title . ' to index.<br />';
		}
 
		$index->optimize();
	}
 
	function result() {
		$data['results'] = array();
 
		// falls der "search_query"-Parameter übergeben wurde Suche ausführen
		if ($this->input->post('search_query')) {
			// Index analysieren; Suchergebnisse auslesen
			$index = Zend_Search_Lucene::open($this->search_index);
			$data['results'] = $index->find($this->input->post('search_query'));
		}
		// View mit Suchergebnissen anzeigen
		$this->load->view('search_view', $data);
	}
}

Im Konstruktor wird die Lucene-Bibliothek wie bereits gezeigt geladen und der Ort des Suchindexes festegelegt. Mit der Funktion index_it wird der Index aufgebaut. Diese Funktion hat natürlich nichts in einem öffentlich zugänglichen Controller verloren und ist hier nur aus Gründen der Einfachheit im Controller enthalten.

Die View, die von diesem Controller aufgerufen wird enthält ein Formular mit einem Feld Namens search_query. Dieses muss wie bei CodeIgniter üblich per POST an suche/result/ übergeben werden, wo die Auswertung des Indexes stattfindet. Die View folgt hier noch einmal kurz im Überblick (search_view.php).

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<html>
<head>
	<title>Suche</title>
</head>
<body>
 
<h1>Suche</h1>
 
<?php if (empty($_POST['search_query'])):?>
 
<p>Bitte Suchbegriff eingeben!</p>
<form method="post" action="<?=base_url()?>suche/result/">
  <input type="text" name="search_query" value="" size="40" maxlength="40"/>
  <input type="submit" name="submit" value="suchen"/>
</form>
 
<?php else:?>
	<?php if (count($results)):?>
<p><?php echo count($results) ?> Ergebnis(se) f&uuml;r die Suchanfrage <b><?php echo $_POST['search_query'];?></b></p>
<ul>
	<?php foreach($results as $result):?>
	<li><?=anchor(site_url($result->path), $result->title);?> (<?php echo round($result->score, 2) * 100;?>%)</li>
	<?php endforeach;?>
</ul>
	<?php else:?>
<p>Keine Ergebnisse f&uuml;r die Suchanfrage <b><?php echo $_POST['search_query'];?></b></p>
	<?php endif;?>
<?php endif;?>
 
</body>
</html>

 

Fragen und Anregungen oder Verbesserungsvorschläge zu diesem Code können natürlich gerne in den Kommentaren abgegeben werden.

Sollten Sie einen CodeIgniter-Entwickler für eines Ihrer Projekte suchen, dürfen Sie mich gerne kontaktieren!

Tags: , , , , ,