Skip to content

Instantly share code, notes, and snippets.

@johnny5th
Last active June 20, 2018 20:33
Show Gist options
  • Save johnny5th/3a64aacbc91df1ddebecaff80a68334d to your computer and use it in GitHub Desktop.
Save johnny5th/3a64aacbc91df1ddebecaff80a68334d to your computer and use it in GitHub Desktop.
Adds a specific value validation to Webform
<?php
/**
* Implements hook_form_FORM_ID_alter().
*
* Adds specific value requirement form elements.
*/
function etbu_core_form_alter(&$form, FormState $form_state, $form_id) {
// Only alter webform UI element forms.
if ($form_id === 'webform_ui_element_form') {
$element_properties = $form_state->get('element_properties');
$form['properties']['validation']['required_value_container'] = [
'#type' => 'container',
'required_value_check' => [
'#type' => 'checkbox',
'#title' => t('Require specific value?'),
'#description' => t('If set, this message will be used when a required webform element is empty.'),
'#default_value' => $element_properties['required_value_check'],
'#parents' => [
'properties',
'required_value_check',
],
],
'required_value' => [
'#type' => 'textfield',
'#title' => t('Required value'),
'#description' => t('The value to validate against.'),
'#default_value' => $element_properties['required_value'],
'#parents' => [
'properties',
'required_value',
],
'#states' => [
'visible' => [
':input[name="properties[required_value_check]"]' => ['checked' => TRUE],
],
],
],
'required_value_error' => [
'#type' => 'textfield',
'#title' => t('Required value error message'),
'#description' => t('If set, this message will be used when a the webform element does not have the required value.'),
'#default_value' => $element_properties['required_value_error'],
'#parents' => [
'properties',
'required_value_error',
],
'#states' => [
'visible' => [
':input[name="properties[required_value_check]"]' => ['checked' => TRUE],
],
],
],
];
}
}
/**
* Implements hook_webform_element_alter().
*
* Attaches the validator for specific value requirements.
*/
function etbu_core_webform_element_alter(array &$element, FormStateInterface $form_state, array $context) {
// Check for desired element.
if (isset($element['#required_value_check']) && $element['#required_value_check'] == '1' && $element['#required_value'] != "") {
$element['#element_validate'][] = [
'Drupal\etbu_core\Validate\WebformRequiredValue',
'validate',
];
}
}
<?php
namespace Drupal\MY_MODULE\Validate;
use Drupal\Core\Form\FormStateInterface;
/**
* Form API callback. Validate element value.
*/
class WebformRequiredValue {
/**
* Validates given element.
*/
public static function validate(array &$element, FormStateInterface $formState, array &$form) {
$webformKey = $element['#webform_key'];
$value = $formState->getValue($webformKey);
$requiredValue = $element['#required_value'];
if ($value != $requiredValue) {
if (isset($element['#required_value_error']) && $element['#required_value_error'] != "") {
$formState->setError($element, $element['#required_value_error']);
}
else {
$tArgs = [
'%name' => empty($element['#title']) ? $element['#parents'][0] : $element['#title'],
'%value' => $value,
];
$formState->setError(
$element,
t('%value is not the required value for the field %name. Please use a different value.', $tArgs)
);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment