Kategorien
Zend Framework

Zend kranuliertes Rechtesystem mit Zend_Acl und Zend_Auth

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.

Kategorien
HTML5

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
Kategorien
Zend Framework

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());
    }
}
Kategorien
Apache Webserver PHP

PHP mit htaccess debuggen: Error Log

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.

Kategorien
PHP

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}
Kategorien
MySQL

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.

Kategorien
MySQL

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.

Kategorien
Diverses

HTML Kunst

Mir ist ausversehen etwas lustiges beim Programmieren passiert: Beim Einlesen und Auswerten von über hundert HTML- Seiten für mein neustes Projekt ist mir die folgende Debusausgabe passiert. HTML Kunst:

Kategorien
PHP

Auffüllen von Zahlen mit führenden Nullen in PHP

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);
Kategorien
jQuery

verschieben von absolut positionierten Elementen mit jQuery

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);
            });
        });