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

A product could not be loaded.

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:

Kategorien
WordPress

WordPress Paragraph Tags werden nicht eingefügt

Man kann sehr einfach über das Problem stolpern, dass die <p>-Tags (Paragrapgh-Tags) nicht automatisch im Blog eingefügt werden.

Um das Problem zu lösen, musste man einfach die Hook vorher ausführen, die die Paragraph Tags setzt:

$content = get_the_content();

echo  apply_filters('the_content', $content);

Dies ergab sich dadurch, dass der Content noch nach iso kodiert werden musste. Ansosnten wäre die Funktion the_content() die richtige Wahl gewesen, die das automatisch erledigt.

Dies is bei mir passiert, bei der Verwendung von WordPress ohne ein Theme sondern nur als Content-Lieferant mittels:

define('WP_USE_THEMES', false);
Kategorien
Yii Framework

Yii AR Search mit Relations Attribute Has_Many

Um eine Suche auch über die Relationen einer Active Record Klasse zu realisieren, muss Folgendes beachtet werden:

1. Die Relation muss vorhanden sein:

 public function relations()
    {
            'categories' => array(self::HAS_MANY, 'place_id', 'category_id'),

2. Die Relation muss suchbar sein:

public function rules()
    {
            array('name, categories', 'safe', 'on' => 'search'),

3. In der Suchfunktion muss folgender Code eingefügt werden. Das OR ist dabei optional aber wichtig, wenn man sich wundert, dass keine Ergebnisse angezeigt werden in der View.

  public function findPlaces($searchTerm)
    {
        $criteria = new CDbCriteria;

        $criteria->compare('name', $this->name, true, 'OR');
        $criteria->with = array('categories' => array("together" => true));
        $criteria->compare('categories.name', $searchTerm,true, 'OR');

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }