Modele w yii framework

Po długiej przerwie wracam do wątku dotyczącego frameworka Yii. Jeżeli będziecie mieli jakieś problemy z Yii piszcie w komentarzach.
Jak wam pewnie wiadomo modele służą do obiektowej reprezentacji danych z formularza bądź już z bazy danych. Do generowania modelu używam narzędzia gii, które zostanie opisane w następnej części. Jednak sam model z relacjami to nie wszystko.
W dzisiejszym wpisie przybliżę wam nazwane podzbiory, walidatory oraz wirtualne atrybuty.

Wirtualne atrybuty

Wirtualne atrybuty to inaczej mówiąc gettery oraz settery. Umożliwiają nam pobieranie/ustawianie wartości nie istniejących pól w naszej bazie. Prosty przykład to pobranie pełnej nazwy naszego użytkownika – imienia, drugiego imienia oraz nazwiska.

  1.  # Deklarujemy zmienną na nasz atrybut.
  2.  private $full_name;
  3.  # metoda zwraca nam dane użytkownika.
  4.  public function getFullName() {
  5.      $this->full_name .= $this->name;
  6.      # Pamiętaj nie każdy ma drugie imię.
  7.      if( ! Empty($this->sname) )
  8.          $this->full_name .= $this->sname;
  9.      $this->full_name .= $this->surname;
  10.      return $this->full_name;
  11.  }
  12.  //
  13.  // Tak używamy w kodzie.
  14.  // Pobieranie danych.
  15.  $fn = MyUser->FullName();
  16.  $fn = MyUser->FullName; # da takie same rezultaty.  
  17.  // Ustawianie danych.
  18.  MyUser->active = MyUser::ACTIVE;
  19.  MyUser->setActive(MyUser::ACTIVE);

Ja wykorzystuje to na moim blogu gdy dodaje nowy artykuł. Zajawka oraz treść całego artykułu są pokazywane jako jedno pole edytora. Pomaga mi to przy importowaniu wpisów z plików odt. Importuje artykuł, skrypt znajduje obrazek i dodaje treść do wirtualnego pola. Moim zadaniem jest tylko odpowiednie podzielenie go na zajawkę i treść. Model przy zapisie dzieli pole treści na zajawkę oraz treść i zapisuje je do bazy.

Nazwane podzbiory

Nazwane podzbiory są bardzo przydatnym elementem przy częstym filtrowaniu danych z modelu. Używam ich do wyświetlania listy opublikowanych postów. Za każdym razem kiedy chcę pobrać konkretne wpisy z blogu wywołuję jedną metodę z mojego modelu. Poniżej kilka przykładów

  1.  // pobieramy listę wszystkich opublikowanych wpisów.
  2.  $posts_list = $posts->published()->findall();
  3.  ...
  4.  // pobieramy listę wszystkich wpisów z ustawioną flagą autopublikacji, 
  5.  // ale jeszcze nie opublikowanych na blogu. 
  6.  $posts_autopublish = $posts->autopublish()->unpublished()->findall();

Ciekawą opcją jest możliwość przekazywania parametrów wyszukiwania do podzbiorów.

  1.  $recent_posts = Posts::model()->recent(5)->findall();

Metoda zwróci nam tylko ostanie 5 najnowszych postów. A poniżej jej kod:

  1.  public function recent($limit=3)
  2.  {
  3.      $this->getDbCriteria()->mergeWith(array(
  4.          'order'=>'create_time DESC',
  5.          'limit'=>$limit,
  6.      ));
  7.      return $this;
  8.  }

Następujący kod definiuje dwa nazwane podzbiory, opublikowane oraz najnowsze w klasie modelu Post:

  1.  class Post extends CActiveRecord
  2.  {
  3.      public function scopes()
  4.      {
  5.          return array(
  6.              'published'=>array(
  7.                  'condition'=>'status=1',
  8.              ),
  9.              'recently'=>array(
  10.                  'order'=>'create_time DESC',
  11.                  'limit'=>5,
  12.              ),
  13.          );
  14.      }
  15.  }

Domyślne podzbiory

Dodanie domyślnego podzbioru ograniczy
nam pokazywanie danych dla każdego zapytania. Dobrym przykładem
może być przekazywanie języka używanego przez nas. Innym może
być pokazywanie wiadomości tylko jeżeli aktualnie zalogowany
użytkownik był na liście adresatów.

  1.  public function defaultScope()
  2.  {
  3.      return array(
  4.          'condition'=>"language='".Yii::app()->language."'",
  5.      );
  6.  }

Walidacja danych.

Sprawdzanie poprawności danych przebiega wg reguł określonych w metodzie `rules()` klasy naszego modelu.

  1.  public rules() {
  2.      return array(
  3.          array('lista atrybutów', 'nazwa walidatora', on=>"import, search, delete" inne parametry),
  4.          array('name', 'lenght', 'max'=>128), 
  5.          array('nick', 'length', 'min'=>3, 'max'=>12),
  6.      );
  7.  }

gdzie parametr on jest listą scenariuszy w których dana reguła ma znaczenie. Nasza lista atrybutów będzie sprawdzana tylko przy rejestracji, wyszukiwaniu oraz suwaniu naszego wpisu. Atrybut name musi być krótszy niż 128 znaków a nick musi mieć długość od 3 do 12 znaków.

CDN

W kolejnych częściach zamierzam poruszyć tematy relacji, migracje oraz narzędzia gii. Jeżeli artykuł się podobał, bądź macie jakieś pytania, piszcie w komentarzach.

Comments

comments

Comments

Leave a Reply

You must be logged in to post a comment.