Archives for category: 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!

Wer mit CodeIgniter programmiert kommt früher oder später an einen Punkt, an dem er eine Benutzer-Authentifizierung (User-Authentication) bzw Benutzer-Autorisierung (User-Authorization), also ein System zum Registrieren und Anmelden von Benutzern in das eigene Projekt integrieren will oder muss.

In CodeIgniter selbst ist ein solches System nicht integriert. Allerdings stehen etliche Bibliotheken und Plugins zur Verfügung. Ich will hier kein Tutorial schreiben wie man ein bestimmtes Plugin einbindet und verwendet, ich will den interessierten Leser mit Links und Tipps versorgen, die bei der Wahl der besten Möglichkeit hilft eine User Authentication in das eigene CodeIgniter-Projekt zu integrieren. Daher werde ich diesen Artikel auch immer mal wieder ausbauen oder ändern, weil doch immer mal wieder neue Bibliotheken und Plugins auftauchen.

Einen guten Überblick über bestehende Möglichkeiten zur Benutzer-Authentifizierung mit CodeIgniter liefert dieser Thread auf Stackoverlow.

Auch ein Blick ins offizielle Wiki von CodeIgniter auf den Seiten Authorization und Authentication hilft.

Mein persönlicher Favorit ist zur Zeit Redux. Das System ist nicht aufgebläht und verspricht in der Beta der Version 2 einige gute Sicherheitsaspekte.


Sie suchen einen CodeIgniter Entwickler, der ein Benutzer-Management in Ihre bestehende Web-Applikation integriert oder eine Online-Applikation nach Ihren Wünschen erstellt? Kontaktieren Sie mich!

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!

Zur JavaScript-Entwicklung benutze ich, wie wahrscheinlich gut 90% aller JS-Entwickler, Firefox mit Firebug. Doch leider entwickelt man eben nicht nur für den Firefox, sondern für alle Browser, so dass man den Code zumindest in den gängigsten Browsern testen muss. (Danke übrigens an Black Blog Christoph, für den Fehlerhinweis im IE.)

debuggerDie Fehlersuche im Internet Explorer gestaltet sich mit den internen Möglichkeiten aber alles andere als einfach. Zum Glück gibt es aber auch da Abhilfe: Companion.JS. Companion.JS ist ein Tool in der Version 0.5, das einen Großteil der Firebug-Konsolen-API übernommen hat. Log-Ausgaben und Debugger-Meldungen können also direkt übernommen werden. Das Tool gibt’s kostenlos, genauso wie den Microsoft Script Debugger, der zur Nutzung von Companion.JS ebenfalls benötigt wird.

Die folgenden Einstellungen und Internetoptionen->Erweitert sind ebenfalls nötig:
Scriptdebugging deaktivieren (Andere) und
Scriptdebugging deaktivieren (Internet Explorer)
dürfen nicht ausgewählt sein.
Scriptfehler anzeigen hingegen sollte aktiviert sein.

CodeIgniter halt ich für ein geniales PHP-Framework. Daher benutze ich es für fast alle meine Projekte, auch für mein neustes Baby, ufashion.de.

Schade fand’ ich bisher immer nur, dass ich CodeIgniter nicht für Skripte verwenden konnte, die auf der Kommandozeile bzw. in der Konsole laufen. Daher habe ich mich gerade einmal auf die Suche gemacht um eine Möglichkeit zu finden, wie man CI doch auch auf der Konsole nutzen kann. Neben mehreren umständlichen Varianten bin ich auf die folgende Möglichkeit von phpstarter.net gestoßen, die schlicht, einfach und wirklich gut ist:

Man kopiert die index.php des Codeigniter-Frameworks in eine cli.php-Datei. Folgenden Code setzt man an den Anfang des Skripts:

#!/usr/local/bin/php
/**
* only a few lines of code will make the best web framework
* function on the command line
*/

/* we don't need to be limited by...normal limitations */
set_time_limit(0);
ini_set('memory_limit', '256M');

/* make sure this isn't being called by a web browser */
if (isset($_SERVER['REMOTE_ADDR'])) die('Permission denied.');

/* set some constants */
define('CMD', 1);

/* manually set the URI path based on command line arguments... */
unset($argv[0]); /* ...but not the first one */
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'] = '/' . implode('/', $argv) . '/';

Mit einem simplen Aufruf von

php cli.php controller methode

lässt sich nun jede beliebige Methode der Controller auf der Kommandozeile ausführen. Dieses Vorgehen wird mir in Zukunft sicherlich einiges an Zeit und Mühe sparen – wirklich eine feine Sache.

Für mein aktuelles Projekt muss ich eine Menge Bilder bearbeiten, drehen usw. Die meisten Bearbeitungsschritte funktionieren zwar auch mit PHP recht einfach, die Ergebnisse sind aber gerade bei komplexeren Operationen nicht die besten. Imagemagick scheint zwar da auf den ersten Blick ein Ausweg, auf Grund der fehlenden Doku habe ich aber darauf verzichtet und mich an Gimp versucht. Im Endeffekt konnte ich damit mein Batch-Script recht schnell zusammenbauen und die Ergebnisse sind zufriedenstellend.

Hier findet man eine keine Einführung in die Batch-Programmierung mit Gimp.

Allerdings sei für die Windows-Nutzer (XP) angemerkt, dass sich die Scripte nicht mit gimp -i -b '(batch-unsharp-mask "*.png" 5.0 0.5 0)' -b '(gimp-quit 0)' ausführen lassen.

Unter Windows scheint man nur doppelte Anführungszeichen (”) verwenden zu können – mit dem Hochkomma (’) kommt es zum Fehler “… konnte nicht geöffnet werden: No such file or directory” Angegebene Dateinamen oder Pattern muss man entsprechend escapen. Ein Aufruf würde also wie folgt aussehen:

gimp -i -b "(batch-unsharp-mask \"*.png\" 5.0 0.5 0)" -b "(gimp-quit 0)"

Alle Prozeduren sind im Prozeduren-Browser (Hilfe -> Prozeduren-Browser) recht ordentlich dokumentiert. Und können in der Code-Fu Konsole getestet werden.

Eigene Scripte werden in folgendem Verzeichnis gespeichert: C:\Programme\GIMP-2.0\share\gimp\2.0\scripts – vorausgesetzt natürlich Gimp ist tatsächlich auch unter C:\programme\gimp-2.0 installiert.

Kommentare in den Scripten werden mit ;; deklariert.

Mein Skillset:

  • OOP
  • Java
  • Android
  • Facebook Entwicklung: FBML & Co.
  • PHP mit CodeIgniter, Zend Framework
  • Javascript / AJAX mit jQuery
  • MySQL
  • (X)HTML, CSS, XML, JSON etc.
  • SVN zum source code management (SCM)
  • Kontakt

    Mail: mail {at} benjaminmock.de
    Mobil: 0176 32077839