CakePHP: Input Validierung mit mehreren Regeln

Fast einen Monat ist es her seit dem letzten Post. Nur ein kleiner Tipp und auch kein besonders aufwändiger für multiple Validierungsfeldern pro Eingabefeld. Die Überprüfung eines Eingabefeld für eine deutsche Bankleitzahl könnte beispielsweise so im Model implementiert werden:

var $validate = array(
'blz' => array(
									'minLength' => array(
										'rule' => array('minLength', 8),
										'message' => 'Bitte geben Sie eine gültige Bankleitzahl eines deutschen Bankinstituts ein.'),
									'maxLength' => array(
										'rule' => array('maxLength', 8),
										'message' => 'Bitte geben Sie eine gültige Bankleitzahl eines deutschen Bankinstituts ein.'),
									'numeric' => array(
									'rule' => 'numeric',
									'required' => true,
									'message' => 'Bitte geben Sie nur Zahlen als Bankleitzahl ein.'))
)

CakePHP: Validierung ohne zu Speichern

Es kann vorkommen, da möchte man die Nutzereingaben in einem Formular zunächst nur validieren, bevor sie in der Datenbank gespeichert werden. Dies kann zum Beispiel bei einem Bestellvorgang sein, bei dem die eingegebenen Nutzerangaben noch einmal zur Übersicht dem Nutzer angezeigt werden soll und erst nach dieser Prüfung gesichert werden sollen.
Dafür stellt CakePHP die Methode ‘validates()‘ des Models bereit.

In der CakePHP-Dokumentation steht genau dieser Anwendungsfall beschrieben, jedoch überliest man auf die schnelle ggf. eine wichtige Stelle: Vor der Validierung müssen die Daten auf jeden Fall dem Model übergeben werden.

$this->Modelname->set($this->data);
if($this->Modelname->validates()) { #Alles ok, Überprüfungsseite anzeigen
#....
} else { #Daten validieren nicht
#...
}

CakePHP: $displayField funktioniert nicht innerhalb von Plugins?!

Es existiert eine $belongsTo-Beziehung, angenommen zwischen einem Impressum und einem Buch. Das Impressum-Model wurde also entsprechend mit dem $belongsTo-Attribut beschrieben. Nun soll ein neues Impressum eines Buches angelegt werden und dafür soll bpsw. nicht der Buchname aus dem Buch-Model, sondern die ISBN-Nummer als Referenz herangezogen werden. Also bekommt das Buch-Model das Model-Attribut $displayField = ‘isbn’. Das scheint aber nicht zu funktionieren. Wenn jemand weiß warum nicht, dann bitte kommentieren! Ich freue mich auf antworten! Bis dahin kann man das natürlich umgehen, indem man das $displayField-Atribut unmittelbar vor dem Aufruf im Controller zur Laufzeit setzen lässt:

#innerhalb des impressum controller
$this->Impressum->Buch->displayField = 'isbn';
$this->set('buch',$this->Impressum->Buch->find('list');

Das Ganze findet innerhalb eines Plugins statt. Nennen wir das Plugin “Bibliothek”…Muss man hier etwas beachten?

Das erdachte Szenario möge man mir verzeihen. Es geht hier nur ums Prinzip ;-)

 

Die Lösung ist gefunden!

Näheres dazu und ergänzt um virtuelle Felder im Blog “CakePHPDoku”

CakePHP: Bestimmte Tabellenfelder auslesen

Nichts wildes, im Kochbuch von CakePHP auch leicht zu finden, dennoch hin und wieder gern gebraucht: Mittels find()-Methode des Models nur bestimmte Tabellenfelder aus der Datenbank holen. Simpel:

$this->Model->find('all', array('fields' => array('Model.feldname'), 'recursive' => -1));

Das “recursive => -1″ sorgt dafür, dass eventuelle Datenmodellabhängigkeiten nicht berücksichtigt werden.