Skip to content

Commit

Permalink
Merge pull request #218 from vlucas/issue208
Browse files Browse the repository at this point in the history
validate fields that are required, but may have empty or null values. Handles #208
  • Loading branch information
willemwollebrants authored Aug 28, 2017
2 parents db089ab + 9a45f79 commit 20a9c2d
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 12 deletions.
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ V::lang('ar');

## Built-in Validation Rules

* `required` - Required field
* `required` - Field is required
* `equals` - Field must match another field (email/password confirmation)
* `different` - Field must be different than another field
* `accepted` - Checkbox or Radio must be accepted (yes, on, 1, true)
Expand Down Expand Up @@ -142,6 +142,16 @@ extension for greater accuracy and reliability. The extension is not required
for Valitron to work, but Valitron will use it if available, and it is highly
recommended.

## Required fields
the `required` rule checks if a field exists in the data array, and is not null or an empty string.
```php
$v->rule('required', 'field_name');
```

Using an extra parameter, you can make this rule more flexible, and only check if the field exists in the data array.
```php
$v->rule('required', 'field_name', true);
```
## Credit Card Validation usage

Credit card validation currently allows you to validate a Visa `visa`,
Expand Down
29 changes: 18 additions & 11 deletions src/Valitron/Validator.php
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,16 @@ public static function langDir($dir = null)
*
* @param string $field
* @param mixed $value
* @param array $params
* @return bool
*/
protected function validateRequired($field, $value)
protected function validateRequired($field, $value, array $params= array(), array $fields = array())
{
if (isset($params[0]) && (bool) $params[0]){
$find = $this->getPart($this->_fields, explode('.', $field), true);
return $find[1];
}

if (is_null($value)) {
return false;
} elseif (is_string($value) && trim($value) === '') {
Expand Down Expand Up @@ -886,48 +892,49 @@ public function reset()
$this->_labels = array();
}

protected function getPart($data, $identifiers)
protected function getPart($data, $identifiers, $allow_empty = false)
{
// Catches the case where the field is an array of discrete values
if (is_array($identifiers) && count($identifiers) === 0) {
return array($data, false);
}

// Catches the case where the data isn't an array or object
if (is_scalar($data)) {
return array(NULL, false);
}

$identifier = array_shift($identifiers);

// Glob match
if ($identifier === '*') {
$values = array();
foreach ($data as $row) {
list($value, $multiple) = $this->getPart($row, $identifiers);
list($value, $multiple) = $this->getPart($row, $identifiers, $allow_empty);
if ($multiple) {
$values = array_merge($values, $value);
} else {
$values[] = $value;
}
}

return array($values, true);
}

// Dead end, abort
elseif ($identifier === NULL || ! isset($data[$identifier])) {
if ($allow_empty){
//when empty values are allowed, we only care if the key exists
return array(null, array_key_exists($identifier, $data));
}
return array(null, false);
}

// Match array element
elseif (count($identifiers) === 0) {
if ($allow_empty){
//when empty values are allowed, we only care if the key exists
return array(null, array_key_exists($identifier, $data));
}
return array($data[$identifier], false);
}

// We need to go deeper
else {
return $this->getPart($data[$identifier], $identifiers);
return $this->getPart($data[$identifier], $identifiers, $allow_empty);
}
}

Expand Down
31 changes: 31 additions & 0 deletions tests/Valitron/ValidateTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1240,6 +1240,37 @@ public function testWithData()
$this->assertFalse($v3->validate());
$this->assertNotEmpty($v3->errors());
}

public function testRequiredEdgeCases()
{
$v = new Validator(array(
'zero'=>0,
'zero_txt' => '0',
'false'=>false,
'empty_array'=>array()
));
$v->rule('required', array('zero', 'zero_txt', 'false', 'empty_array'));

$this->assertTrue($v->validate());
}

public function testRequiredAllowEmpty(){
$data= array(
'empty_text'=>'',
'null_value' => null,
'in_array'=>array(
'empty_text'=>''
)
);

$v1= new Validator($data);
$v1->rule('required', array('empty_text', 'null_value', 'in_array.empty_text'));
$this->assertFalse($v1->validate());

$v2= new Validator($data);
$v2->rule('required', array('empty_text', 'null_value', 'in_array.empty_text'));
$this->assertFalse($v2->validate());
}
}

function sampleFunctionCallback($field, $value, array $params) {
Expand Down

0 comments on commit 20a9c2d

Please sign in to comment.