Für das Rechtesystem in meinem Tippspiel werden die Komponenten Zend_Auth und Zend_Acl im Zendframework verwendet. Zend_Auth ist dabei für die Authentifizierung registrierter Nutzer zuständig und Zend_Acl für Verteilung und das setzen der Rechte. Es wurden drei Rollen angelegt: Guest, Member und Administrator.
Autor: Sebastian Viereck
HTML5 mit Boilerplate
Das HTML5 Framework Boilerplate bietet ein Grundgerüst für die Programmierung in dem neuen Webstandard HTML5 an und beinhaltet
- eine Optimierung für mobile Endgeräte
- Cross-Browser Kompatibilität insbesondere für die Internet Explorer Versionen
- HTML5 Cross-Browser Kompatibilität über die Javascript Bibliothek modernizer
- jQuery für sämtliche Javascript Arbeiten
.htaccess
-Datei mit gängigen Standardeinstellungen und Performance Optimierungen- Druck CSS Stylesheet
Zend Test mit PhpUnit
Zum Testen wurde PHPUnit verwendet als Standard-Testing-Tool für PHP und in Netbeans intergriert.
Dazu wurde eine Bootstrap Datei angelegt, in der die Applikationsvariablen geladen werden (IndexControllerTest.php):
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { public function setUp() { $this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini'); parent::setUp(); } }
Ein Test kann dan so aussehen (Test Files/application/controllers/IndexControllerTest.php):
require_once '/../../TestConfiguration.php'; require_once '/../../../application/models/Players.php'; class PlayersTest extends PhpUnit_Framework_TestCase{ public function setUp() { TestConfiguration::setupDatabase(); } public function testFetchAll(){ $TippspielObjekt = new Players(); $TippspielAnzahl = $TippspielObjekt->fetchAll(); $this->assertGreaterThan(10, $TippspielAnzahl->count()); } public function testLatest(){ $TippspielObjekt = new Players(); $TippspielAnzahl = $TippspielObjekt->fetchLatest(1); $this->assertSame(1,$TippspielAnzahl->count()); } }
Um die möglichen bei Usern im Betrieb auftretenden Fehler einer Webseiten zu loggen, empfiehlt sich ein Error Log in der htaccess einzurichten außerhalb des öffentlichen Teils der Webseite. Diese muss via FTP mit Schreibrechten versehen werden.
php_flag log_errors on
php_value error_log /srv/www/vhosts/domain/non-public/PHP_errors.log
php_flag ignore_repeated_errors on
php_flag ignore_repeated_source on
php_value error_reporting 1
Dabei werden keine sich wiederholenden und nur fatal run-time Fehler geloggt.
PHP 2-Spalten Layout eleganter Code
Wenn man performant und elegant ein belibeges 2 spaltiges Tabellen HTML Layout generieren will ohne Tabellen, kann man z.B: so tun:
$count = count($array); for($i = 0; $i < $count; $i++) { $style = !$i%2 ? "left" : "right"; $html .= "<div class='$style'>{$array[$i]}</div>"; }
und mit CSS ausrichten:
#container{width:600px} .left {width:200px} .right {width:400px}
PhpMyAdmin Inaktivitäts Zeitunkt erhöhen
Was mich richtig nervt, sind die automatischen Logouts von PhpMyAdmin, welche nach 1440s durchgeführt werden.
Dazu muss man in libraries/config.default den Wert ändern:
$cfg['LoginCookieValidity'] = 1440;
Un außerdem in der php.ini die Session Lifetime erhöhen, wenn nötig: session.gc_maxlifetime.
MySQL reservierte Bezeichner und Release
Gerade habe ich an dem Problem gehangen, dass ich mit Doctrine eine neue Spalte namens „release“ füllen wollte. Mit Release wart das Release-Datum von CDs gemeint. Es kam die Standard Fehlermeldung von MySQL, das ein Fehler bei release war.
$products->release = 2003;
Natürlich habe ich es auf Doctrine geschoben, weil da oft solch ein komisches Zeug passiert. Komisch war, dass die Fehlermdlung nicht auftrat bei:
$products->release = NULL;
Das gab mir schwer zu denken und führte mich auf die falsche Fährte in Richtung, dass der Wertebereich nicht passte.
Die Lösung war ganz einfach: Das Word Release gehört zu den reservierten Wörtern in MySQL, was ich nicht wusste. Einen Überblick gibt es hier.
Die Lösung war also, den Spalte umzubennen in product_release, damit funktioniert es dann:
$products->product_release = 2003;
Was genau der release-Befehl in MySQL macht, konnt ich leider nicht herausfinden, ich freue mich auf Beiträge darüber.
HTML Kunst
Wenn man eine Zahl mit führenden Nullen versehen will, wie z.B. 001, dann bietet sich die Funktion str_pad an:
$nummer3stellig = str_pad(1, 3, 0, STR_PAD_LEFT);
Wenn man alle Elemente bspw. aus generiertem HTML verschieben will, bietet sich jQuery an.
Folgendes HTML habe ich aus einem PDF zu HTML Umwandlungsprogramm erhalten:
<div style="position:absolute;top:97;left:333"><nobr><span class="ft1"> </span></nobr></div> <div style="position:absolute;top:121;left:333"><nobr><span class="ft1"> </span></nobr></div> <div style="position:absolute;top:145;left:333"><nobr><span class="ft1"> </span></nobr></div> <div style="position:absolute;top:170;left:293"><nobr><span class="ft2">Text </span></nobr></div>
Um die Inline Styles zu verändern und die Div-Blöcke um 100px zu verschieben nach rechts und nach unten kann folgender Code verwendet werden:
$(document).ready(function() { $('div').each(function() { var offset = $(this).offset(); alert("left: " + offset.left + ", top: " + offset.top ); $(this).css('left', offset.left + 100); $(this).css('top', offset.top + 100); }); });