2012-05-06 44 views
10

Mam podmiot z kilkoma polami w nim. Jednym z nich jest zatwierdzony po złożeniu formularza w następujący sposób:Sprawdzanie poprawności liczby całkowitej z formularza

/** 
* @var integer $anzahl 
* 
* @ORM\Column(name="anzahl", type="integer") 
* @Assert\NotBlank(message="Bitte geben Sie eine Kistenanzahl an.") 
* @Assert\Type(type="numeric", message="Die Kistenanzahl muss eine Zahl sein.") 
* @Assert\Min(limit="1", message="Sie müssen mindestens eine Kiste suchen oder anbieten.") 
*/ 
private $anzahl; 

Mam dwa problemy z tym rozwiązanie:

Tylko całkowita Wartości wyższe niż zero powinno być przyjęte. Jednak zatwierdzanie odbywa się również za pomocą funkcji pływających/podwójnych. Jeśli jednak zmienię @Assert\Type(type="numeric") na @Assert\Type(type="integer"), żadne dane wejściowe nie zostaną zweryfikowane jako prawdziwe. Jak mogę sprawdzić, czy moje dane wejściowe są wartościami całkowitymi?

Innym problemem jest to, że po wpisaniu oczywiście nieprawidłowej wartości (jak ciąg liter) otrzymuję nie tylko mój niemiecki komunikat o błędzie dla sprawdzania typu, ale również komunikat w języku angielskim "ta wartość powinna być prawidłową liczbą". Skąd pochodzi ta wiadomość i jak mogę się jej pozbyć?

Odpowiedz

17

Należy użyć:

@Assert\Type(type="integer") 

Ale uważaj, należy używać go z IntegerType, a nie NumberType lub TextType:

Symfony\Component\Form\Extension\Core\Type\IntegerType 

IntegerType jest identyczna NumberType wyjątkiem tego, że integruje właściwy data transformer.

+0

' @Asersert \ Type (type = "integer") 'nie działa. To była pierwsza rzecz, którą próbowałem. – sprain

+0

Czy widziałeś drugą część odpowiedzi? Jakiego typu formularza używasz dla tej właściwości? –

+1

Użycie liczby całkowitej jako typu pola zrobiło lewę. Dzięki. – sprain

5

Można użyć

/** 
* @Assert\Regex(pattern="/\d+/") 
*/ 

lub utworzyć walidatora z ctype_digit.

+3

Ponieważ jest to rozwiązanie, które akceptuje liczby, nawet używając 'text' jako typu pola, ma wadę, że akceptuje wartości takie jak" ** 123ABC ** ". Może ten wzór byłby bardziej użyteczny, ponieważ nie akceptuje wartości zaczynających się od zer wiodących: '* @Asert \ Regex (pattern ="/^ ([1-9] [0-9] *) $/")' – insertusernamehere

+0

Krótsza wersja nie zaczyna się od 0, wtedy akceptowane są tylko cyfry. @ Assert \ Regex (wzorzec = "/^(?! 0) \ d + $ /") ' – Stphane

9

Jeśli typ pola powinno być ciąg, można użyć zamiast tego:

/** 
* @Assert\Type(type="digit") 
*/ 

Chociaż nie jest wymienione in the documentation, TypeValidator wykorzystuje również ctype_* funkcje.

Zobacz \Symfony\Component\Validator\Constraints\TypeValidator:

public function validate($value, Constraint $constraint) 
{ 
    ... 

    $ctypeFunction = 'ctype_'.$type; 

    ... 

    } elseif (function_exists($ctypeFunction) && call_user_func($ctypeFunction, $value)) { 

    ... 
} 
+1

Świetnie, dziękuję! Utworzono żądanie pobrania, aby dodać je do dokumentacji. –

9

Działa to dla mnie:

->add('field_name', 'integer', array(
    'label' => 'Your label here', 
    'data' => 0, // default value 
    'precision' => 0, // disallow floats 
    'constraints' => array(
     new Assert\NotBlank(), 
     new Assert\Type('integer'), 
     new Assert\Regex(array(
      'pattern' => '/^[0-9]\d*$/', 
      'message' => 'Please use only positive numbers.' 
      ) 
     ), 
     new Assert\Length(array('max' => 2)) 
    ) 
)) 
0

musiałem użyć number typu pola formularza, ale to pokazało gwiazdkę * obok etykiety wejściowego choć jest nie jest obowiązkowe. Więc musiałem też użyć 'required' => false. Pole formularza typu integer nie działało. Podstawowy typ danych pola to smallint.

->add('storey', 'number', array('required' => false)) 

Regex ograniczenie w yml nie działa zbyt natomiast typ jest integer albo nic warunkiem. Nie wiem, dlaczego

storey: 
    - Regex: '/^[0-9]+$/' 

Moja wersja Symfony ma wartość 2.7.

0

Począwszy od Symfony v2.3 wersja należy użyć:

/** 
* @Assert\Type(type="integer") 
* @Assert\GreaterThan(0) 
*/ 

Należy jednak pamiętać, że tworzy typ pola powinna być liczba całkowita (IntegerType::class), w przeciwnym razie będę dostać negatywną weryfikację.

Powiązane problemy