bootstrap_italia-8.x-0.x-dev/src/Helper/FormInput.php
src/Helper/FormInput.php
<?php namespace Drupal\bootstrap_italia\Helper; /** * Helper Form class for bootstrap_italia theme. * * Why isn't it a service? https://www.drupal.org/project/drupal/issues/2002606. */ class FormInput { /** * Set form input. * * @param array<string, mixed> &$variables * Referenced $variables. */ public static function set(array &$variables): void { if (isset($variables['element']['#type'])) { $variables['type'] = self::getType($variables); switch ($variables['type']) { case 'text': case 'email': case 'tel': case 'search': case 'date': case 'datetime-local': case 'datetime': case 'datelist': case 'webform_time': case 'time': case 'color': case 'url': case 'month': case 'week': self::setText($variables); break; case 'textfield': self::setTextfield($variables); break; case 'range': self::setRange($variables); break; case 'file': self::setFile($variables); break; case 'password': case 'webform_password': self::setPassword($variables); break; case 'submit': self::setSubmit($variables); break; } } self::checkErrors($variables); self::checkSuccess($variables); } /** * Return variables type. * * @param array<string, mixed> $variables * Variables array. * * @return string * Element type. */ private static function getType(array $variables): string { $type = $variables['element']['#type']; // Search if a webform-password. if (isset($variables['attributes']['class']) && in_array('js-webform-input-hide', $variables['attributes']['class'], TRUE) ) { $type = 'webform_password'; } return $type; } /** * Set text input type. * * @param array<string, mixed> $variables * Variables array. */ private static function setText(array &$variables): void { $variables['attributes']['class'][] = 'form-control'; } /** * Set textfield input type. * * @param array<string, mixed> $variables * Variables array. */ private static function setTextfield(array &$variables): void { // Ensure there is no collision with Bootstrap 5 default class names // by replacing ".form-text" with ".form-textfield". $attributes = &$variables['attributes']; if (!empty($attributes['class'])) { $classIndex = array_search('form-text', $attributes['class']); $attributes['class'][$classIndex] = 'form-textfield'; } $variables['attributes']['class'][] = 'form-control'; } /** * Set range input type. * * @param array<string, mixed> $variables * Variables array. */ private static function setRange(array &$variables): void { $variables['attributes']['class'][] = 'form-range'; } /** * Set file input type. * * @param array<string, mixed> $variables * Variables array. */ private static function setFile(array &$variables): void { $variables['attributes']['class'][] = 'upload'; } /** * Set submit input type. * * @param array<string, mixed> $variables * Variables array. */ private static function setSubmit(array &$variables): void { $variables['attributes']['class'][] = 'btn'; if (isset($variables['attributes']['data-drupal-selector'])) { if ($variables['attributes']['data-drupal-selector'] == 'edit-submit' || $variables['attributes']['data-drupal-selector'] == 'edit-actions-submit' || $variables['attributes']['data-drupal-selector'] == 'edit-submit-watchdog' ) { $variables['attributes']['class'][] = 'btn-primary'; $variables['attributes']['class'][] = 'me-3'; } if ($variables['attributes']['data-drupal-selector'] == 'edit-reset') { $variables['attributes']['class'][] = 'btn-outline-danger'; $variables['attributes']['class'][] = 'me-3'; } if ($variables['attributes']['data-drupal-selector'] == 'edit-delete') { $variables['attributes']['class'][] = 'btn-danger'; $variables['attributes']['class'][] = 'me-3'; } if ($variables['attributes']['data-drupal-selector'] == 'edit-apply-above' || $variables['attributes']['data-drupal-selector'] == 'edit-apply-below' || $variables['attributes']['data-drupal-selector'] == 'edit-preview-next' || $variables['attributes']['data-drupal-selector'] == 'edit-preview' || $variables['attributes']['data-drupal-selector'] == 'edit-submit-content' || $variables['attributes']['data-drupal-selector'] == 'edit-overview' || $variables['attributes']['data-drupal-selector'] == 'edit-wizard-next' || $variables['attributes']['data-drupal-selector'] == 'edit-wizard-prev' ) { $variables['attributes']['class'][] = 'btn-outline-primary'; $variables['attributes']['class'][] = 'me-3'; } // Detect ajax remove buttons. if (str_ends_with($variables['attributes']['data-drupal-selector'], '-remove-button')) { $variables['attributes']['class'][] = 'btn-outline-danger'; } } } /** * Set password input type. * * @param array<string, mixed> $variables * Variables array. */ private static function setPassword(array &$variables): void { $variables['attributes']['class'][] = 'form-control '; $variables['attributes']['class'][] = 'input-password'; // Ensure there is no collision with Bootstrap 5 default class names // unset ".form-text". $attributes = &$variables['attributes']; if (!empty($attributes['class'])) { $classIndex = array_search('form-text', $attributes['class']); unset($attributes['class'][$classIndex]); } $variables['attributes']['data-bs-input'] = TRUE; } /** * Check validation error on single field. * * @param array<string, mixed> $variables * Variables array. */ private static function checkErrors(array &$variables): void { if (isset($variables['attributes']['class']) && in_array('error', $variables['attributes']['class'], TRUE) ) { $variables['attributes']['class'][] = 'is-invalid'; } if (isset($variables['attributes']['class']) && in_array('error', $variables['attributes']['class'], TRUE) ) { $variables['attributes']['class'][] = 'is-invalid'; } } /** * Check validation success on single field. * * @param array<string, mixed> $variables * Variables array. */ private static function checkSuccess(array &$variables): void { if (isset($variables['attributes']['class'])) { if (in_array('success', $variables['attributes']['class'], TRUE) || in_array('valid', $variables['attributes']['class'], TRUE) || in_array('validated', $variables['attributes']['class'], TRUE) ) { $variables['attributes']['class'][] = 'just-validate-success-field'; } } } }