Monatliches Archiv: Januar 2013

Das Yii CGridView, wie ich es verwende

In diesem Beitrag möchte ich einige Dinge zum Yii CGridView erläutern und meine Erfahrungen mit dem Yii CGridview darstellen.

In einigen Fällen gibt es Sonderfälle, wo man kein standardisiertes CGridView möchte. Beispielsweise bei der Auflistung einer URL oder eines E-Mail Links.

Standardfall

Wie es von Gii standardmäßig gemacht wird, wird ein Yii CGridView wie folgt erstellt:

1
2
3
4
5
6
7
8
9
10
11
<br />
$this->widget('zii.widgets.grid.CGridView', array(<br />
  'id'=>'beispiel-grid',<br />
  'dataProvider'=>$model->search(),<br />
  'filter'=>$model,<br />
  'columns'=>array(<br />
        'spalte1',<br />
        'spalte2',<br />
        'spalte3',<br />
  ),<br />
));<br />

CGridView weitere Berechnungen oder ein CGridView Link

Doch das Yii CGridView kann noch weitaus mehr. Zum Beispiel möchte ich vor der Ausgabe noch Berechnungen durchführen oder wie oben schon beschrieben einen Link generieren, so kann ich hier leider nicht einfach einen PHP-Code Schnipsel angeben. Allerdings wird durchaus PHP verarbeitet, wenn wir es in Anführungszeichen angeben. Eine Url oder eine Berechnung erstellen wir dann wie folgt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<br />
$this->widget('zii.widgets.grid.CGridView', array(<br />
  'id'=>'beispiel-grid',<br />
  'dataProvider'=>$model->search(),<br />
  'filter'=>$model,<br />
  'columns'=>array(<br />
        array(<br />
            'name'=>'link',<br />
            'type'=>'raw',<br />
            'value'=>'Chtml::link("Zur Webseite", array("$data->link"))',<br />
        ),<br />
        array(<br />
            'name'=>'betrag',<br />
            'type'=>'raw',<br />
            'value'=>'($data->betrag*1.19)',<br />
        ),<br />
        array(<br />
            'name'=>'link',<br />
            'value'=>'Chtml::link("Zur Webseite", array("$data->link"))',<br />
        ),<br />
  ),<br />
));<br />

Yii CGridView Filter – selbst erstellen

Das Yii CGridView erlaubt es uns auch, in der Filter Zeile eigene Filter zu definieren. So können wir, wie in dem folgenden Beispiel, die Filterzelle auch mit einem Dropdown-Feld füllen. Der Befehl CHtml::listData() erlaubt es uns die Daten an die Filterzelle so zu übergeben, dass daraus ein Dropdown-Feld entsteht. So können wir dann die Suche bzw. das Filtern auf die vorgegebenen Werte des Dropdown Menüs einschränken.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<br />
$this->widget('zii.widgets.grid.CGridView', array(<br />
  'id'=>'beispiel-grid',<br />
  'dataProvider'=>$model->search(),<br />
  'filter'=>$model,<br />
  'columns'=>array(<br />
        array(<br />
            'name'=>'link',<br />
            'type'=>'raw',<br />
            'filter'=>CHtml::listData(Benuzter::model()->links()->findAll(), 'url', 'name'),<br />
            'value'=>'Chtml::link("Zur Webseite", array("$data->link"))',<br />
        ),<br />
        array(<br />
            'name'=>'betrag',<br />
            'type'=>'raw',<br />
            'value'=>'($data->betrag*1.19)',<br />
        ),<br />
        array(<br />
            'name'=>'link',<br />
            'value'=>'Chtml::link("Zur Webseite", array("$data->link"))',<br />
        ),<br />
  ),<br />
));<br />

Yii CGridView Pagination

Wie die Pagination verändert und gesteuert werden kann, werde ich bei Gelegenheit in einem weiteren Artikel zeigen.

Sagt mir Eure Themen, die ich für euch in diesem Blog bearbeiten soll?

Yii RBAC – Rollenbasierte Rechte und mehr – Teil 4

In diesem Artikel soll es um die YII RBAC (Yii Role Based Access Control) gehen. Auf deutsch Rollenbasierte Benutzer Rechte.

Dabei haben wir viel mehr Möglichkeiten, als nur Rechte in Rollen zu vergeben, wie das geht möchte ich in diesem Artikel schildern.

Dieser Artikel ist Teil der Artikelserie über das Yii User Management.

Was ist das YII RBAC

Das Modell der Yii RBAC setzt das in der ANSI-Norm 359-2004 genannte Role Based Access Control (RBAC) um. Jedes Mehrbenutzersystem hat bei vielen Benutzern das Problem, dass die Rechte der Benutzer immer komplizierter zu pflegen werden. Das RBAC soll genau dies vereinfachen und das Problem besiegen.

Dabei werden die Benutzer einer oder mehreren Rollen zugewiesen. In vielen Systemen wird erzwungen, dass ein Benutzer mindestens einer Rolle zugewiesen sein muss. Oft ist es jedoch möglich, einen Benutzer mehrere Rollen zu geben. Die meisten sehen die Rechteverwaltung über ein RBAC als bestes Verfahren an.

In den Yii RBAC ist es nicht nur möglich einem Benutzer eine oder mehrere Rollen zu geben. Es ist darüber hinaus auch möglich, einzelnen Benutzern über die Rechte der Rolle noch einzelne Rechte zu geben. Da dies jedoch dann wieder mit der Zeit unübersichtlich wird, empfehle ich dies nur im äußersten Notfall zu tun. Aber auch hier gibt es Anwendungsfälle, für die es einfacher bzw. besser ist dies so umzusetzen.

Business Regeln

Mit Business Regeln sind zu deutsch Geschäftsregeln gemeint. Geschäftsregeln sind mit Entscheidungstabellen vergleichbar. Geschäftsregeln bzw. entsprechende Entscheide treffen wir sehr oft am Tag. Die Geschäftsregeln setzen genau dies um. Beispiel: Wenn es 12 Uhr ist und wenn es Mittwoch ist, dann hole ich das Kind vom Kindergarten ab. So ist es möglich, mit den Geschäftsregeln das Rechte Management auf bestimmte Entscheidungen auszubauen. Zum Beispiel kann ich bestimmten Benutzern nur zu bestimmten Uhrzeiten Zugriff gewähren. Genau dies beschreiben die Geschäftsregeln. Geschäftsregeln sind im Yii User Management tief verankert und schon Integriert. Wir müssen diese nur anwenden.

Tätigkeiten

Als Tätigkeiten gelten alle Actions unserer Controller. Beziehungsweise würde ich eher umgekehrt sagen, alle Actions können eine Tätigkeit darstellen. Beim Yii RBAC wenden wir auch die Tätigkeiten an. Wir weisen die erlaubten Tätigkeiten entsprechenden Rollen zu. Damit aber kein unbefugter Zugriff bekommt, gehen wir besser umgekehrt vor. Wir verbieten allen alles und erlauben nur den gewünschten Benutzern (mit der bestimmten Rolle) die Tätigkeit. So können wir auch unterscheiden, ob ein Benutzer etwas bearbeiten darf oder nur ansehen. Beides stellt eine eigene Tätigkeit dar. Das Yii RBAC basiert auf Tätigkeiten. Die Rollen des Yii RBAC bringen uns rein gar nichts wenn wir diesen keine Tätigkeiten zuweisen können. Denn dann müssten wir im Quellcode wieder verankern wer was dürfte. Und genau das wollen wir mit dem Yii RBAC verhindern, Rechte sollen einfach, schnell und sicher verwaltbar sein.

Was meint Ihr zu den Yii RBAC?

Erweiterungen und verbesserungen für die Yii User Identity class – Teil 3

Dieser Artikel ist ein Beispiel, wie einfach das Hinzufügen von beliebigen Daten zur Yii User Identity Class ist. Dieser Artikel ist Teil der Artikelserie über das Yii User Management.

In diesem Artikel möchte ich zeigen, wie es möglich ist, schon beim Loginprozess noch weitere Daten im System zu speichern. In vielen Fällen ist es sinnvoll, schon direkt nach der Login Prozedur auf die Benutzerdaten zugreifen zu können.

Wie schon erwähnt, möchte ich hier noch einige Anmerkungen zum letzten Artikel machen. Wir möchten in der Yii User Identity Class gleich noch weitere Daten des Benutzers setzen, so dass diese direkt nach dem Login Prozess zur Verfügung stehen. Glücklicherweise bietet uns die Yii User Identity Class diese Möglichkeiten schon ohne weitere Implementierung neuer Methoden.

Mit folgendem Code können wir beispielsweise weitere Benutzerdaten zu den Identitätsdaten des Benutzers speichern:

1
$this->setState('vorname', $vorname);

Wie wir sehen, können wir also hier in der Yii User Identity Class noch beliebige weiter Daten setzen. Auf diese Daten können wir dann mit der Yii CWebUser Instanz darauf zugreifen. Und genau dies erfolgt genauso wie wir den Login ansteuern.

1
2
// Folgendes Beispiel würde uns dann also den Vornamen des Benutzers ausgeben
echo YII-&gt;app()-&gt;user-&gt;vorname;

So ist es dann direkt nach dem Login möglich, schon im Ausgabeseite den Vornamen des Benutzers an zu zeigen. Viele Systeme machen nach dem Login erst einen Reload oder man muss sich um diese Daten zur Laufzeit wirklich selbst kümmern.

Da die Yii User Identity Class von CUserIdentity abgeleitet ist und diese wiederrum von CComponent, haben wir hier alle üblichen Möglichkeiten einer Komponente. Wir können der Yii User Identity Class noch Events anhängen oder wie es in Yii eben auch mit Behaviors gemacht wird. Dabei verhält sich die Yii User Identity Class ebenso, wie jede andere beliebige Klasse die von CComponent abgeleitet wurde.

Zum Thema Yii Events und Yii Behaviors werde ich bei Gelegenheit noch einen eigenen Artikel verfassen.

Erstellen der Yii UserIdentity und was diese genau ist – Teil 2

Das User Management ist eines der wichtigsten Dinge, die am sichersten programmiert werden müssen, wenn es darum geht, Benutzerzugänge zur Verfügung zu stellen. Dabei sollte man immer in Gedanken haben, dass es nicht nur friedliche Besucher auf einer Webseite gibt. Auch wenn ich von keiner kriminellen Kraft ausgehe, muss ich doch dennoch sicherstellen, dass kein unbefugter Zugriff möglich ist.

Dieser Artikel ist Teil 2 der Artikelserie über die Yii User Management und umfasst folgende Artikel:

Die Yii UserIdentity ist eine Klasse, die die Klasse CBaseUserIdentity ableitet, die wiederum das Interface IUserIdentity implementiert. Die Yii UserIdentity ist dazu da, die Identitätsinformationen eines Besuchers zu speichern. Wenn dieser sich an der Webseite anmeldet, so macht er dies in der Regel mit einem Benutzernamen und einem Passwort. Damit Authentifiziert er sich am System, so dass das System weis, dass der Besucher auf bestimmte Aktionen Zugriff haben darf. In der Yii UserIdentity werden die Authentifizierungsdaten über den gesamten Zeitraum, in dem die Authentifizierung gültig ist, gespeichert.

In der Yii UserIdentity findet auch die Authentifizierung selbst statt. Hier kann also auch noch mehr, als nur der Vergleich von Username und Passwort stattfinden. Beispielsweise wenn man manche IP-Bereiche von der Webseiten authentifizierung ausschließen möchte, kann man das hier implementieren.

Ich erstelle die Yii UserIdentity wie folgt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
  * Erstellen der Yii UserIdentity Klasse
*/

class UserIdentity extends CUserIdentity
{
  private $_id;
  # Hier findet in der Yii UserIdentity die Authentifizierung statt.
  public function authenticate()
  {
    # Je nach Datenmodell kann dies natürlich entsprechend abweichen
    $record=User::model()->findByAttributes(array('username'=>$this->username));
    if($record===null)
      $this->errorCode=self::ERROR_USERNAME_INVALID;
    else if($record->pw!==md5($this->password))
      $this->errorCode=self::ERROR_PASSWORD_INVALID;
    else
    {
      $this->_admin = $record->admin;
      $this->_id=$record->id;
      $this->errorCode=self::ERROR_NONE;
    }
    return !$this->errorCode;
  }
  // Diese Methode ist nicht unbedingt notwendig. Jedoch finde ich dass die
  // Methode getId die ID der UserIdentity zurückliefern sollte und nicht
  // den Username wie das normalerweise bei Yii ist.
  public function getId()
  {
    return $this->_id;
  }
}

Eigenes YII User Management – Teil 1

Mit diesem Artikel möchte ich eine Artikelserie starten, die über ein eigenes Yii User Management handelt. Ich komme selbst immer wieder in die Verlegenheit, dass ich das Yii User Management benötige aber weder installiert noch erweiterbar zur Hand habe.

Dies soll sich mit dieser Artikel Serie ändern.

Übersicht

In der Artikelserie über das Yii User Management möchte ich folgende Themen abhandeln:

Überblick

Wie schon gesagt möchte ich in dieser Artikelserie nicht nur einen Überblick, sondern auch genaueres Wissen über das Yii User Management weitergeben.

Da Yii schon von Grund auf mit dem User Management ausgestattet ist, müssen wir es in den meisten Fällen nur richtig anwenden. Es gibt sogar schon fertige Funktionen für rollen basierte Rechte.

Was wir aber in jedem Fall selbst tun müssen, ist uns um die Verwaltung des Yii User Management zu kümmern. Wir benötigen also einen Bereich, den nur User mit dem Status Admin aufrufen können, in dem wir Benutzer erstellen und verwalten können. Möchten wir die Rollenbasierten Rechte verwenden, so benötigen wir natürlich auch noch Ansichten für das Verwalten der Rollen. Den Rollen müssen dann auch noch die Aktionen zugeteilt werden, so dass genau festgelegt werden kann, welcher Yii User was machen kann.

Warum ein eigenes Yii User Management

Es gibt schon sehr nützliche Module für das Yii User Management. Mit diesen fertigen Modulen kann man schon sehr gut arbeiten. Wer möchte, kann die Module ja auch an das Konzept der eigenen Seite anpassen. Gerade wenn man speziellere Anwendungsfälle hat, bei denen ein besonderes Yii User Management wichtig ist, wird es einfacher, wenn man sich diese selbst erstellt. Dies geht relativ einfach in Yii.

Wie bei so vielen Dingen im Leben finde ich, dass es auch hier wichtig ist, dass das Yii User Management so einfach wie möglich ist. Genauso sollte dies auch zu dem Projekt passen. Gerade wenn man mit Leuten zu tun hat, die nicht so versiert sind im Umgang mit komplizierteren Webseiten. Dann tue ich mir selbst einen Gefallen, wenn ich es im Look und Layout der Seite erstellen kann.

Wie genau das geht möchte ich in dieser Artikelserie anhand von konkreten Code-Beispielen zeigen.

Falls Ihr Fragen habt hinterlasst mir bitte einen Kommentar.

Shell Suchen

Nun möchte ich euch zeigen, wie ich mit einem neuen Befehl eine shell Suche ausführe. Auf der shell suchen ist manchmal gar nicht so einfach, wenn man die Befehle für das suchen nicht in und auswendig kennt. Ich tu mir hier immer ein wenig schwer, wenn ich mich länger nicht mit dem Thema der shell suche beschäftigt habe.

Mein neuer Befehl, mit dem ich auf der Shell suche, ist folgender:

1
cd /pfad/ins/verzeichnis/; fgrep -R "suchstring" * 2>/dev/null

Der Befehl „fgrep“ ist gleich dem Befehl „grep -F“. Allerdings ist das shell suchen mit fgrep schneller, wenn es sich um einen einfachen String handelt und nicht um einen Pattern.

Mit der Option -R löst der Befehl auch gleich das Problem, wenn man auf der shell rekursiv suchen möchte. Auf der Shell rekursiv suchen ist ein Thema, was mich schon oft und viel beschäftigt hat, weil man halt doch etwas öfters etwas sucht. Gerade wenn man mit zwielichtigen Angriffen zu kämpfen hat, ist das rekursive durchsuchen auf der Shell sehr wichtig.

Kennt Ihr noch einen einfacheren Befehl für das Suchen auf der Shell?