Kategorien
PHP Yii Framework

Yii Simple Open Street Map Extension

The Simple Open Street Map Extension for Yii is a fast and comftable was to show multiple markers and a Open Street Map.

Features

  • automatic Zoom Factors, might be adjusted a little bit for street map zooms
  • Html Marker Text with Links etc.
  • Open Street Map License *free*
  • easy to use
open_street_map_yii
Open Street Map Yii Extension for the 10 biggest cities in brasil

 

Kategorien
PHP

PHP performante Array Operationen mit SplFixedArray

Seit PHP 5.3. gibt es Arrays mit fixer Länge names SplFixedArray (wie in Java und anderen Sprachen), die performanter oder gleich performant sind in den meisten Operationen wie

  • lesen
  • einfügen
  • auslesen

Details zu den Performance Vorteilen inklusive Tests gibt es auf diesem Blog.

Im folgendes Beispiel habe ich die neue Datenstruktur benutzt und bin zu enormen Performancegewinnen gekommen:

function  activeRecordAttributeToArrayFastMemory($objects, $attributeName)
{
    $size = count($objects);
        $array = new SplFixedArray($size);
        for($i = 0; $i < $size; $i++)
        {
            $array[$i] = $objects[$i]->$attributeName;
        }
    $returnArray = $array->toArray();
    return $returnArray;
}
Kategorien
JavaScript PHP

PHP-Funktionen in JS benutzen mit php.js

Wer vermisst es nicht: High Level Funktionen, die einem die einfachsten arbeiten abnehmen in Javscript. Von PHP ist man immer gewöhnt schlanken, gut lesbaren Code zu schreiben, auch dank der vielen eingebauten Hilfsfunktionen, wie z.B. für die String Verarbeitung:

  • strncmp
  • strpbrk
  • strpos
  • strrchr
  • strrev
  • strripos
  • strrpos
  • strspn
  • strstr
  • strtok
  • strtolower
  • strtoupper
  • strtr

Dies ist zeit langem schon möglich durch eine Javascript Library namens php.js, die fast alle PHP Funktionen nach Javascript portiert hat und für PHP Programmierer sicher eine gute Hilfe ist.

Kategorien
Yii Framework

Yii Griedview ID nicht definiert

Wenn man die Yii Gridview benutzt, um bei Dataprovider Daten schnell in eine Tabelle zu verpacken, muss man aufpassen, dass man definiert, was die eindeutige ID jeder Zeile ist. Bei einem CArrayDataProvider muss man das Attribut „keyField“ setzen :

$this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider' => new CArrayDataProvider($myData, array("keyField" => "myKeyFieldName")),
        )
    ));
    ?>

ansonsten gibt es eine Fehlermeldung:

xxx.id nicht definiert

Man muss aufpassen, welchen Dataprovider man benutzt, bei einem CActiveDataProvider heißt das Attribut dann wieder anders – Achtung!: „keyAttribute“

$this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider' => new CActiveDataProvider($myActiveRecords, array("keyAttribute" => "myKeyFieldName")),
        )
    ));
    ?>
Kategorien
JavaScript jQuery PHP

Cross Domain Ajax Requests

Von Hause aus sind Cross Domain Ajax Requests aus Sicherheitsgründen nicht erlaubt, weil so fremder Schad-Code beim Client nachgeladen und ausgeführt werden kann.

Um trotzdem einen erfolgreichen Ajax Request auf eine andere Domain oder Subdomain oder auch nur von HTTP auf HTTPS zu senden, muss man die Access-Control-Allow-Origin beachten.

Man muss nicht jsonp benutzen, wie viele vorschlagen, sondern kann normales json benutzen (der Ajax Request von www.mydomain1.de gesendet):

<script>
    $.ajax({
        url: "http://www.mydomain2.de/ajax.php",
        type: 'GET',
        crossDomain: true,
        dataType: 'json',
        success: function(data) {
            console.log( data );
            $( ".result" ).html( data );
        },
        error: function( data) {
            console.log("error ajax");
            console.log( data );
        }
    });
</script>
<div class='result'></div>

Auf der eigene mydomain2.de/ajax.php Seite muss nur folgender Code eingebunden werden, um die Access-Control-Allow-Origin zu umgehen:

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: http://www.mydomain1.de');

echo json:encode("it works");
die();
Kategorien
Yii Framework

Yii PHP Objekte übergeben nach Javascript

Es gibt verschiedene Varianten die PHP Variablen und Objekte nach Javascript zu übergeben:

1. mit PHP json_encode()

var employmentTypesIds = <?php echo json_encode($employmentTypesIds)?>;

2. per Extension mit Active Record Relationen! – carjson

3. per Script Übergabe:

$cs->registerScript('php_vars',
            'messages1 = '.CJSON::encode(Yii::app()->createAbsoluteUrl("/messages/hello")).';'.
            'messages1 = '.CJSON::encode(Yii::app()->createAbsoluteUrl("/messages/goodbye")).';'
        );
Kategorien
Yii Framework

Yii Session Handling über die Datenbank aktivieren

Aus Sicherheitsgründen kann man die Session mit Yii nicht über das Dateisystem, sondern über die Datenbank verwalten lassen automatisch und die Sessionvariable verschlüsseln.

Folgende Konfiguration ist dafür notwendig:

'components' => array(      
     'session'=>array(
            'class' => 'system.web.CDbHttpSession',
            'connectionID' => 'db',
            'sessionTableName' => 'session',
            'autoStart'=>true,
            'cookieMode'=>'only',
            //'savePath'=>'/tmp',
            'sessionName'=>'connected_session',
            'timeout'=>60*60,// 1 hour
            'useTransparentSessionId'=>false,
        ),
Kategorien
Yii Framework

Yii CGridView Custom Header für Pdf Generierung

Um ein PDF generieren zu können mit mpdf, muss man die thead-Tags entfernen, da diese nicht umgewandelt werden von mpdf. Dazu kann man die folgende Klasse verwenden:

Yii::import('zii.widgets.grid.CGridView');

class PDFGridView extends CGridView {

    public function renderTableHeader() {
        $options['class'] = 'pdf-grid-header';
        echo CHtml::openTag('tr', $options) . "\n";
        foreach ($this->columns as $header) {
            $header->renderHeaderCell();
        }
        echo CHtml::closeTag('tr') . "\n";
    }
}

View:

 $this->widget('PDFGridView', array(...)
Kategorien
Amazon MWS PHP

PHP überprüfen, ob ein String eine valide Asin ist

Um zu überprüfen, ob ein String eine valide Asin ist, muss man die 2 möglichen Regeln für Asins überprüfen:

  • ein „B“ gefolgt von 2 Zahlen und 7 alphanumerischen Werten
  • eine spezial ISBN-Vairiante: 9 Zahlen und am Ende entweder ein „X“ oder eine weitere Zahl (sehr selten)

Der passende reguläre Ausdruck in einer Funktion gekapselt in PHP ist:

function isAsin($string){
    $ptn = "/B[0-9]{2}[0-9A-Z]{7}|[0-9]{9}(X|0-9])/";
    if(preg_match($ptn, $string, $matches)){
        return true;
    }
}

Zum Testen habe ich folgenden Code verwendet:

$testAsins = array("B223213FCF","232342342X", "A223213FCF");
foreach ($testAsins as $testAsin)
{
    if(isAsin($testAsin)){
        echo $testAsin." is ASIN"."<br>";
    }
}

Ausgabe des Skripts ist:

B223213FCF is ASIN
232342342X is ASIN
Kategorien
PHP

PHP Design Patterns

Das Verständnis und die Anwendung von Design Patterns gehören in der fortgeschrittenen Programmierung zum guten Ton. Der Sinn für die Verwendung von Design Patterns ist die Software erweiterbar zu halten und auch Jahre später noch ohne großen Aufwand an neue Anforderungen anpassen zu können.

Die folgenden Ausführungen sind aus dem Standardwerk zu dem Thema „PHP Design Patterns“ aus dem O’Reilly Verlag entnommen (ab Kapitel 3), was ich nur jedem PHP Programmierer ans Herz legen kann:

Ein paar interessante Beispiele will ich im Folgenden daraus kurz vorstellen:

Fluent Interfaces

Fluent Interfaces dienen dazu, den Code einer Klasse für andere Entwickler leichter verständlich zu halten und damit indirekt auch Kommentare zu sparen.

Ein Beispiel das viele kennen ist ein ORM Mapper, wie Propel oder Doctrin, beim dem Queries wie folgt zusammengebaut werden:

$orm = new Orm();
$orm->select(array("id", "name"))->from("myTable")->where("id=1");

Einen solchen flüssigen Code erreicht man, wenn mit Fluent Interfaces arbeitet und das Object der Klasse immer wieder zurückt gibt am Ende jedes Methodenaufrufes: