Kategorien
Symfony Yii Framework

Yii2 versus Symfony 4 – ein Framework Vergleich

Ich habe lange mit Yii und dem Symfony Framework gearbeitet und will versuchen im Folgenden die Unterschiede von beiden Frameworks aus Programmierer Sicht zu erläutern.

Konfiguration von Umgebungen

Beim Erstellen von Web-Anwendungen hat man typischer Weise mindestens 2 Umgebungen: Die Entwicklungsumgebung, auf der man Fehler sehen will und die Live Umgebung, wo dies nicht passieren soll. Dazu kommen Test-Umgebung zum Ausführen automatisierter Tests und vielleicht eine Staging Umgebung.

Symfony löst das sehr geschickt, mit .env Dateien und eigenen Ordnern innerhalb des Konfigurations-Ordners.

Bei Yii muss der Programmierer selber hand anlegen, um die richtige Konfiguration zu laden, es sind von Hause aus nur 3 (dev, prod, test) Umgebungen vorgsehen, danach wird es unübersichtlich.

Kategorien
Yii Framework

Yii Relation über mehrere Tabellen und Models benutzen

Es gibt einen sehr einfachen Syntax, um einfache Relationen, die in verschiedenen Models definiert sind zu bneutzen und so einen Join über mehrere Tabellen zu erzeugen:

$criteria->with[] ='model1.model2.model3';
$criteria->compare('model3.name', $this->attribute_search, true );

Dies wird meistens bei einer Gridview benutzt, die eine Suche auf einem Attribut durchführen soll, dass in einem verbunden Model liegt.

 

Kategorien
Yii Framework

Yii custom CButtonColumn in Gridview

Dieser Button hat ein eigenes Image über Bootstrap mittels der Klasse icon-download und wird in einem neuen Tab geöffnet.

   array(
                'class' => 'zii.widgets.grid.CButtonColumn',
                'template'=>'{pdf}',
                'buttons'=>array(
                    'pdf' => array(
                        'url' => 'Yii::app()->createUrl("/con/action",array("id"=>$data->id))', 
                        'options' => array('target' => '_blank', 'class' => 'icon-download'),
                        'label' => '',
                        'imageUrl' => false,
                    ),
Kategorien
Yii Framework

Yii2 OpenStreetMap Extension

Ich habe iene einfache OpenStreetMap Extension für Yii2 entwickelt, mit der man beliebige Punkte mit einem Tooltip anzeigen kann. Als Karten-Provider wird OpenLayers verwendet.

Insallationsanweisungen:

  1. Kopieren des Archiv Inhalts nach /widgets/OpenLayers
  2. einbinder der Extension in einer beliebigen view:
<?php
/* @var $this yii\web\View */

use app\widgets\OpenLayers\OpenLayers;
use yii\helpers\BaseVarDumper;
use yii\helpers\Html;
?>
<div>

    <div>
        <h1>Multiple Dots</h1>
        <h2>Input</h2>
        <?php $cities = [
            ["name" => "Belize City", "lng" => -88.1975600, "lat" => 17.4995200, "link" => Html::a("link", "http://www.routenplaner24.de/n/stadtplan/belize+city-3582677"), "population" => "3"],
            ["name" => "San Ignacio", "lng" => -89.0796400, "lat" => 17.1576000, "link" => Html::a("link", "http://www.routenplaner24.de/n/stadtplan/san+ignacio-3581194"), "population" => "5"],
            ["name" => "Orange Walk", "lng" => -88.5632800, "lat" => 18.0812400, "link" => Html::a("link", "http://www.routenplaner24.de/n/stadtplan/orange+walk-3581514"), "population" => "6"],
        ];
        BaseVarDumper::dump($cities, 10, true);

        ?>
        <h2>Map</h2>
        <?php echo OpenLayers::widget(['cities' => $cities, 'map_id' => 'multiple']) ?>

    </div>
</div>

und fertig…

yii2_open_street_map_extension
Yii2 OpenStreetMap Extension / Widget

 

 Download der Extension als .zip File

Kategorien
Buch Empfehlungen Yii Framework

Yii für Profis: Buch Rezension von Yii Project Blueprints

Das September 2014 erschienene Buch „Yii Project Blueprints“ aus dem Packt Publishing Verlag stammt aus einer Reihge guter englischsprachiger Bücher über das PHP-Framework Yii. Am Anfang war ich sehr skeptisch, ob ich das 43te HowTo über die Erstellung eines CMS oder PM-Ticket Tools in meinen Händen halten würde, aber ich wurde sehr positiv überrascht: Dieses Buch richtet sich an gestandene Yii-Programmierer, die in die Tiefen des Frameworks eintauchen wollen.

Die ersten zwei Kapitel sind eher für den Einstieg gedacht, aber danach lernt man erstaunlich interessante Kniffe mit dem Framwork kennen. Ein paar Beispiele:

  • Einbindung von Composer
  • viele sicherheitsrelevante Tipps: Erzeugung von wirklichen Zufallszahlen, Markdown-Parser etc.
  • Cronjobs mit Yiic
  • Fokus auf Wiederverwendbarkeit und Unabhängigkeit der Komponenten, z.B. wird genau erklärt, wie man Module benutzt und wie man diese am besten wiederverwendet
  • Flash Messages
  • die Verwendung eines E-Mail -Sende und -Empfang Dienstes am Bsp. von SendGrid
  • Authentifizierung von Usern mit HybridAuth: Google+, Twitter, Facebook etc. Accounts
  • SEO: Slug-Urls und Sitemap/RSS Feeds Implementierung
  • Implementierung einer RESTful API

Der einzige Wermutstropfen sind die raren Screenshots, die sehr zum Verständnis der öfter sehr langen Code-Beispiele hätten beitragen können.

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
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
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(...)