You do not need to use
$this->context->controller->errors[] = $this->l('Incorrect city');
Look at native validation part of code:
if (($postcode = $this->getField('postcode'))) {
if ($postcode->isRequired()) {
$country = $this->formatter->getCountry();
if (!$country->checkZipCode($postcode->getValue())) {
$postcode->addError($this->translator->trans('Invalid postcode - should look like "%zipcode%"',
array('%zipcode%' => $country->zip_code_format),
'Shop.Forms.Errors'));
$is_valid = false;
}
}
}
By using method "addError" on specific form field, you can display error comment under each field.
And then, if you want NOT to save the form, your "hookActionValidateCustomerAddressForm" have to return 0 - zero.