0
Ich möchte Postleitzahlen basierend auf Datenbankdaten validieren, wenn dies für das Land erforderlich ist oder nicht und welches Format.Leere Validierung in bestimmten Fällen zulassen
Ich habe derzeit die folgenden Validierungsregeln im Modell. Das einzige Problem besteht darin, dass die Validierungsregel nicht ausgelöst wird, wenn keine Postleitzahl angegeben ist. Irgendwelche Vorschläge?
$validator
->requirePresence('postalcode', 'true')
->add('postalcode', [
'shouldHavePostalCode' => [
'rule' => function ($value, $context) {
$countriesTable = TableRegistry::get('Countries');
$country = $countriesTable->findByIsoCode($context['data']['country'])->first();
if(is_null($country)) {
return 'postcode kon niet gecontroleerd worden door ongeldig land';
}
return $country->need_postalcode;
},
'message' => 'Verplicht voor dit land',
],
'validPostalCode' => [
'rule' => function ($value, $context) {
$countriesTable = TableRegistry::get('Countries');
$country = $countriesTable->findByIsoCode($context['data']['country'])->select(['postalcode_format', 'iso_code'])->first();
if (empty($country->postalcode_format)) {
return true;
}
$zip_regexp = '/^'.$country->postalcode_format.'$/ui';
$zip_regexp = str_replace(' ', '(|)', $zip_regexp);
$zip_regexp = str_replace('-', '(-|)', $zip_regexp);
$zip_regexp = str_replace('N', '[0-9]', $zip_regexp);
$zip_regexp = str_replace('L', '[a-zA-Z]', $zip_regexp);
$zip_regexp = str_replace('C', $country->iso_code, $zip_regexp);
if((bool)preg_match($zip_regexp, $value)) {
return true;
}
return 'Ongeldige indeling (' . $country->postalcode_format . ')';
},
]
])
->allowEmpty('postalcode');