Cuando estamos trabajando con la validación, por ejemplo, de un formulario necesitamos recuperar el valor de un campo. Puede ser trivial, pero no lo es. Sobre todo cuando este campo es de tipo fecha. Si el error tipo que te aparece es este:
TypeError: DateTime::__construct() expects parameter 1 to be string, array given in DateTime->__construct()
Este es tu post 😉
La manera de referenciar al contenido, en formato string, de este campo es mediante la siguiente expresión:
$birthdate = $form_state->getValue('birthdate')[0]['value']->format('d-m-Y');
De paso aprovecho y explico cómo se llevaría a cabo la verificación de una mayoría de edad.
En el método del formulario especificamos que queremos llevar a cabo una validación personalizada. Esta sería la sentencia que habría que insertar:
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
$form['#validate'][] = '::validateAge';
return $form;
}
Ahora implementamos el método que realizará la validación y es este, el que motivó crear este post.
public function validateAge(array&$form, FormStateInterface $form_state) {
$birthdate = $form_state->getValue('birthdate')[0]['value']->format('d-m-Y');
if (!$this->isAdult($birthdate)) {
$form_state->setErrorByName('birthdate', t('Lo sentimos, pero no eres mayor de edad.'));
}
}
Y por último, el método que calcula la edad en años.
protected function isAdult($birthdate) {
$date = new \DateTime($birthdate);
$today = new \DateTime();
$age = $today->diff($date);
return $age->y > 18;
}
Así que con una cosa tan tonta y sencilla te puedes pasar horas buscando la solución. ¡Bienvenido al mundo de Drupal!