2014-12-02 17 views
20

mogę zdefiniować regułę dla jednej liczby całkowitej w ten sposób:Yii2: reguła sprawdzania poprawności dla tablicy?

[['x'], 'integer'] 

Czy można powiedzieć, że x jest tablicą całkowitą? Na przykład:

[['x'], 'integer[]'] 

Czy mogę określić prawidłowe wartości w tablicy?

Aktualizacja: Od wersji Yii 2.0.4 otrzymaliśmy pomoc. Zobacz this answer.

+0

Czy to na zasadach modelu? Naprawdę nie możesz przechowywać tablicy, być może serializacji. Czy chcesz postarać się uczynić siebie bardziej klarownym? – casraf

+0

W moim przypadku jest to model dla formularza, który zawiera pola wyboru, które są ładowane jako tablica (z $ modal-> load (Yii :: $ app-> request-> post()). Tak więc nie jest dla ActiveRecord obiekt: – robsch

+0

@Chen Asraf Możesz zapisać tablicę, jeśli używasz ** mongodb ** – verybadbug

Odpowiedz

42

Od wersji 2.0.4 istnieje nowa EachValidator co sprawia, że ​​łatwiej teraz :

['x', 'each', 'rule' => ['integer']], 

To powinno wystarczyć. Jeśli Należy również sprawdzić wartości można użyć tego (z 'in' validator który faktycznie jest RangeValidator):

['x', 'each', 'rule' => ['in', 'range' => [2, 4, 6, 8]]], // each value in x can only be 2, 4, 6 or 8 

Można jednak korzystać z tego „w” walidator również bezpośrednio. I to jest możliwe z wersji 2.0.4 Yii przed:

['x', 'in', 'range' => [2, 4, 6, 8], 'allowArray' => true] 

Zastosowanie 'strict' => true prawdopodobnie nie ma sensu w przypadku, gdy dane są wysyłane przez klienta i ustawiany Model->load(). Nie jestem do końca pewien, ale myślę, że te wartości są wysyłane jako łańcuchy (jak "5" zamiast 5).

+0

['x', 'each', 'rule' => ['in', 'range' => [2, 4, 6, 8]]] nie zadziała jeśli x jest tablicą ints (nie skalarem rodzaj). Powinno to zostać wykonane tak, jak opisałeś poniżej ['x', 'each', 'rule' => ['in', 'allowArray' => true, 'range' => [2, 4, 6, 8]]] . Spędziłem trochę czasu, gdy zdefiniowałem, gdzie dokładnie robię coś złego. Niemniej jednak dziękuję za odpowiedź: – Ekonoval

+1

['x', 'each', 'rule' => ['integer']] Używam tej dokładnej linii w moim SearchModelu, ale to nie działa ... Wygląda na to, że zignorowano regułę ... Czemu? – webpaul

+0

@webpaul Trudno powiedzieć. Utwórz nowe pytanie ze szczegółowymi informacjami. – robsch

13

może trzeba utworzyć niestandardowe reguły walidacji jak poniżej:

['x','checkIsArray'] 

potem w modelu, impelement checkIsArray:

public function checkIsArray(){ 
    if(!is_array($this->x)){ 
     $this->addError('x','X is not array!'); 
    } 
} 

można zrobić wszystko, czego potrzebujesz do reguły zwyczaj sprawdzania poprawności.


Jak Emte wspomniano na komentarz, można również użyć funkcji inline walidator z anonimowym jak poniżej:

['x',function ($attribute, $params) { 
    if(!is_array($this->x)){ 
     $this->addError('x','X is not array!'); 
    } 
}] 
+0

To brzmi rozsądnie! – robsch

+3

jeśli nie chcesz podawać nowej funkcji, możesz użyć funkcji anonimowej bezpośrednio w regule – emte

+0

@emte Tak, masz rację. Dziękuję Ci. –

3

Jeśli trzeba sprawdzić przed określonym zakresie dla każdego elementu tablicy

['x', 'required'] 

Plus

['x', 'each', 'rule' => ['in', 'allowArray' => true, 'range' => [2, 4, 6, 8]]] 

lub

['x', 'in', 'allowArray' => true, 'range' => [2, 4, 6, 8] ] 
Powiązane problemy