Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CakePHP] Walidacja funkcji PHP w Behaviors
Forum PHP.pl > Forum > PHP > Frameworki
kicaj
Jak zrobic walidacje np. funkcji PHP copy() lub is_uploaded_file() w Behaviors Cake'a, tak by blad, a raczej jego tresc była traktowana jak zwykle 'message' z $validate modelu?
R4D3K
W bardzo prostu sposób nazywasz sobie funkcje jak tam chcesz i walidujesz argument wejściowym, którym jest $field ($key -> nazwa pola, $value -> wartość walidowanego pola). Ja kwiesz pliki uplodowane FormHelperem posadają tablice z name,tmp_name,size, error oraz type, więc mają taka wiedzę stworzysz sobie behavior np taki (używam go do walidacji obrazków w projekcie):

  1. <?php
  2.  
  3. /*
  4.  * Behavior validate, waliduje pliki
  5.  * @author R4D3K <panbogactwa@tlen.pl>
  6.  * @copyright Copyright (c) 2011-05-16 13:34:28, Radosław Wawrzyniak
  7.  */
  8.  
  9. class FileValidatorBehavior extends ModelBehavior {
  10. /**
  11.   * Sprawdza czy dany plik jest bmp,jpg,jpeg,gif,png
  12.   * @param type $model aktualny model
  13.   * @param type $field nazwa pola
  14.   * @param type $empty jeśli true plik może być pusty (odpowiednik allowEmpty)
  15.   * @return type boolean
  16.   */
  17. public function checkImage(&$model, $field, $empty = false) {
  18. $data = array_shift($field);
  19. if($data['error'] != 0) {
  20. if($empty) return true;
  21. else return false;
  22. }
  23. else {
  24. if(($data['type'] != 'image/jpeg') &&
  25. ($data['type'] != 'image/jpg') &&
  26. ($data['type'] != 'image/gif') &&
  27. ($data['type'] != 'image/x-png') &&
  28. ($data['type'] != 'image/pjpeg') &&
  29. ($data['type'] != 'image/png'))
  30. return false;
  31. else return true;
  32. }
  33. }
  34.  
  35. }
  36.  
  37. ?>
  38.  


Dodam że ja mam behavior FileValidator, która posiada jeszcze innych kilka pozytecznych reguł jak np sprawdzenia czy plik jest flashem pdfem itp.
I teraz jak korzystać?
Prosto (jakiś tam model tablica $validate):

  1. public $validate = array(
  2. 'avatar'=> array('rule1'=> array('rule'=> array('checkImage', true), 'message'=> 'Proszę załączyć prawidłowy plik graficzny')),
  3. );


Jak widzisz w tablicy podajesz nazwę metody i dalej parametry więcej info znajdziesz w booku cake. Jeśli chodzi o is_uploaded file to z racje tego ze uploadowane pliki często trafiają do różnych katalogów (avatary usera gdzie indziej niż img do newsów), najlepiej wcisnąć to w afterSave danego modelu i nie musisz jużsprawdzacz czy is_uploaded_file() odrazu dajesz move_uploaded_file.
kicaj
Tak, ten sposob znam...

Ale mam na mysli ze juz mam te metody w Behaviorze (np. checkImage()wink.gif i w jaki sposob moglbym pominac tworzenie tablicy $validate w Modelu, tak by ten walidacje przeprowadzal?

EDIT:
Problem rozwiazany:
Kod
$model->validate[$field] = $this->default_validate

gdzie $field to nazwa pola formularza ktory jest walidowany, a $default_validate to tablica na wzor $validate z Modelu

Ale pojawia sie nastepne pytanie, jezeli zastosuje domyslne walidacje, co z internacjonalizacja w 'message'?
R4D3K
Hmm a dlaczego chcesz pominąć pole validate w modelu ?
Jeśli już tak chcesz to zrobić ,ale z ciekawości mógłbyś napisać po co Ci to i dlaczego tak robisz to może Ci coś konkretnego podpowiem to zwróć uwagę na callbacki w behaviorze:
Cytat
beforeValidate(&$model)

You can use beforeValidate to modify a model's validate array or handle any other pre-validation logic. Returning false from a beforeValidate callback will abort the validation and cause it to fail.


I teraz możesz sprawdzić i uploadować plik podczas walidacji. Chodziarz jeśli chodzi Ci o sam upload ja bym to zrobił w callbacku aftersave
kicaj
Dlaczego chce pominac $validate w Modelu? Poniewaz tworze Behavior, w ktorym mam miec domyslne pola walidacji, aby w kazdym Modelu ktory uzywa mojego Behaviora nie duplikowac kodu (DRY)

Upload po afterSave()? Dlaczego? Dodasz rekord do bazy, ale jesli plik sie nie uploaduje?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.