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.

 

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,
                    ),

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.

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")),
        )
    ));
    ?>

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")).';'
        );

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,
        ),

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

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

WordPress Integration in Yii Projekt

Wenn man einen WordPress Blog in das Yii Framework intgrieren will und das Layout der Seite behalten will, bietet WordPress die Möglichkeit, die WordPress API zu benutzen ohne ein Theme erstellen zu müssen.

Der Blog/News Bereich soll unter der Adresse: foo.com/news/ erreichbar sein.

WordPress hochladen

WordPress kann wie gewohnt installiert werden und sollte in der Ordner-Hierachie in folgendes Verzeichnis auf selbr Ebene, wie das Yii-Projekt entpackt werden:

yii-project
  assets
  protected
wordpress

Als Datenbank sollte die selber benutzt werden, wie das Yii-Projekt und alle Worpdress-Tabellen sollten ein Prefix erhalten (standardmäßig “wp_” in der wp-config).

Nachdem man die wp-config angepasst hat, muss noch das Routing von Yii angepasst werden vor der Installation von WordPress.

Yii Controller anlegen weiterlesen…