Kategorie: Coding / Frameworks

CakePHP 3: Kurzfassung zum Verwenden von Migrations

CakePHP bietet mit Migrations die Möglichkeit, Änderungen an der Datenbankstruktur einzuspielen oder rückgängig zu machen. Der typische Ablauf zur Migration ist folgender:

Generating migrations from an existing database

If you are dealing with a pre-existing database and want to start using migrations, or to version control the initial schema of your application’s database, you can run the migration_snapshot command:

bin/cake bake migration_snapshot Initial

Generating a diff between two database states

You can generate a migrations file that will group all the differences between two database states using the migration_diff bake template. To do so, you can use the following command:

bin/cake bake migration_diff NameOfTheMigrations

Applying Migrations

Once you have generated or written your migration file, you need to execute the following command to apply the changes to your database:

bin/cake migrations migrate

Migrations Status

The Status command prints a list of all migrations, along with their current status. You can use this command to determine which migrations have been run:

bin/cake migrations status

CakePHP 3: Benutzername oder Email zum Anmelden mit AuthComponent verwenden

In den Einstellungen der AuthComponent lässt sich festlegen, welches Feld der Datenbank für das Login verwendet werden soll. Hier kann allerdings nur ein einzelner Wert angegeben werden (bspw. username oder email). Um jedoch bei der Eingabe des Logins sowohl Benutzername, als auch Email zu erlauben, kann man die Einstellung zur Laufzeit (also beim Aufruf des Controllers) anpassen und das entsprechende Feld setzen. Und zwar wie folgt:

src/Controller/AppController.php

use Cake\Controller\Controller;

class AppController extends Controller
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('Flash');
        $this->loadComponent('Auth', [
            'authenticate' => [
                'Form' => [
                    'fields' => ['username' => 'username', 'password' => 'password'],
                ]
            ],
        ]);
    }
}

src/Controller/UsersController.php

use App\Controller\AppController;
use Cake\Validation\Validation;

class UsersController extends AppController
{
    public function login()
    {
        if ($this->request->is('post')) {

            if (Validation::email($this->request->getData('username'))) {
                $this->Auth->config('authenticate', [
                    'Form' => [
                        'fields' => ['username' => 'email']
                    ]
                ]);
                $this->Auth->constructAuthenticate();
                $this->request->data['email'] = $this->request->getData('username');
            }

            $user = $this->Auth->identify();

            if ($user) {
                $this->Auth->setUser($user);
                return $this->redirect($this->Auth->redirectUrl());
            }

            $this->Flash->error(__('Invalid combination of username/email and password.'));
        }
    }
}

src/Template/Users/login.ctp

<php
echo $this->Flash->render('auth');
echo $this->Form->create();

echo $this->Form->input('username');
echo $this->Form->input('password');

echo $this->Form->button(__('Login'));
echo $this->Form->end();
?>

CakePHP – Media Plugin: Media Dateien (Grafiken, …) mit verschiedenen Models nutzen

Unter http://grafikart.github.io/CakePHP-Media/index_en.html gibt es ein klasse CakePHP Plugin, mit dem sich Dateien verschiedenster Art (vorzüglich Grafiken, aber auch: png, jpg, pdf, mov, …) mit den Datensätzen anderer Models verknüpfen lassen. Im Video-Tutorial der Webseite wird ausführlichst beschrieben, wie dieses Plugin verwendet wird. Sehr zu empfehlen!

CakePHP 2.x: versenden von Emails (CakeEmail) debuggen

Möglichkeit 1: Debug-Einstellung setzen

Eine einfache Möglichkeit, um das Versenden von Emails in CakePHP 2.x zu testen, ist die Debug-Einstellung der Email Konfiguration. Dabei genügt das Setzen der Transport-Einstellung auf ‚Debug‘ und schon wird der Inhalt der Email an der entsprechenden Stelle angezeigt:

<?php
// app/Config/email.php
class EmailConfig {
   public $default = array(
      'transport' => 'Debug',
      // ...

Dies funktioniert allerdings nur, wenn man sich die Ausgabe des aufgerufenen Scripts anzeigen lassen kann. Bei Cronjobs beispielsweise wird dies schon schwieriger.

CakePHP: Warum funktionieren Shells (bei gleichem Aufruf) nicht als Cronjob?

Shells lassen sich in CakePHP auch für den Aufruf aus Cronjobs verwenden. Dabei kann es jedoch vorkommen, dass der Aufruf einer Shell über das Terminal ohne Probleme funktioniert, aber im späteren Einsatz beim Aufruf über einen Cronjob nicht mehr so richtig will. Es hatte mich einiges an Zeit gekostet, herauszufinden warum dies passieren kann:

CakePHP und Probleme mit nocache-Tags

In CakePHP ist es möglich, Bereich anzugeben, welche bei einem View-Caching der Seite nicht mit „gechached“ werden sollen. Dies geht sehr komfortabel mit den Kommentar-Tags <!--nocache--> und <!--/nocache-->. Damit wird beliebiger PHP-Code zwischen dieses beiden Tags auch bei einer Cache-Seite weiterhin ausgeführt und die Ausgaben nicht in statischen Text umgewandelt.

Bei einem Projekt kam es allerdings vor, dass sich die Inhalte mehrerer nocache-Tags nicht ganz nachvollziehbar vermischten und so an einer anderer Cache-Stelle wieder auftauchten. Nach längerem Suchen hier der Grund:

cssHooks in jQuery

In jQuery Version 1.4.3 wurde ein neues Objekt eingeführt, welches die Definition eigener Getter und Setter für CSS-Eigenschaften ermöglicht. So lassen sich beispielsweise vereinfachte Getter/Setter erstellen, welche Box-Schatten, Gradienten oder auch runde Ecken (border-radius, -moz-border-radius, -webkit-border-radius) für verschiedene Browser handhaben.

The $.cssHooks object provides a way to define functions for getting and setting particular CSS values. It can also be used to create new cssHooks for normalizing CSS3 features such as box shadows and gradients.

Details zu Eigenschaften und Verwendung dieses Objekts sind unter
http://api.jquery.com/jQuery.cssHooks/ zu finden.

WordPress: ersetzen von Zeichen im Editor verhindern (z.B. „–„)

WordPress nutzt zum Formatieren von Texteingaben eine Funktion, welche bestimmte Zeichen (oder Zeichenfolgen) automatisch durch HTML-konformen Code ersetzt. So wird beispielsweise ein doppelter Strich („–„) standardmäßig in einen langen Gedankenstrich umgewandelt. Da dies besonders bei der Ausgabe von Programm-Code oder Terminalzeilen von Nachteil ist, hier eine kleine Zusammenfassung, wie man dies verhindern kann: