public function CivicrmContact::form in Webform CiviCRM Integration 8.5
Overrides WebformElementBase::form
See also
_webform_edit_civicrm_contact()
webform_civicrm_webform_component_presave only form_id 1 can have static user.
File
- src/
Plugin/ WebformElement/ CivicrmContact.php, line 154
Class
- CivicrmContact
- Provides a 'textfield' element.
Namespace
Drupal\webform_civicrm\Plugin\WebformElementCode
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
$form['element']['value']['#access'] = FALSE;
$form['element']['multiple']['#access'] = FALSE;
$webform = $form_state
->getFormObject()
->getWebform();
$utils = \Drupal::service('webform_civicrm.utils');
\Drupal::getContainer()
->get('civicrm')
->initialize();
\CRM_Core_Resources::singleton()
->addCoreResources();
$form['#attached']['library'][] = 'webform_civicrm/civicrm_contact';
$data = $webform
->getHandler('webform_civicrm')
->getConfiguration()['settings']['data'];
$element_properties = $form_state
->get('element_properties');
list($contact_types, $sub_types) = $utils
->wf_crm_get_contact_types();
list(, $c, ) = explode('_', $element_properties['form_key'], 3);
$contact_type = $element_properties['contact_type'];
$allow_create = $element_properties['allow_create'];
$form['form']['display_container']['#weight'] = 10;
$form['form']['field_container']['#weight'] = 10;
$form['validation']['#weight'] = 10;
$form['form']['widget'] = [
'#type' => 'select',
'#title' => $this
->t('Form Widget'),
'#default_value' => $element_properties['widget'],
'#options' => [
'autocomplete' => $this
->t('Autocomplete'),
'select' => $this
->t('Select List'),
'hidden' => $this
->t('Static'),
'textfield' => $this
->t('Enter Contact ID'),
],
];
$allow_create ? $this
->t('<strong>Contact Creation: Enabled</strong> - this contact has name/email fields on the webform.') : $this
->t('<strong>Contact Creation: Disabled</strong> - no name/email fields for this contact on the webform.');
// $adminHelp->addHelpDescription($form['display'], 'contact_creation');
// $form['civicrm']['#description'] = '<div class="messages ' . ($allow_create ? 'status' : 'warning') . '">' . $status . ' ' . $form['display']['#description'] . '</div>';
$form['form']['search_prompt'] = [
'#type' => 'textfield',
'#title' => $this
->t('Search Prompt'),
'#default_value' => $element_properties['search_prompt'],
'#description' => $this
->t('Text the user will see before selecting a contact.'),
'#size' => 60,
'#maxlength' => 1024,
'#states' => [
'invisible' => [
'select[name="properties[widget]"]' => [
'value' => 'hidden',
],
],
],
];
$form['form']['none_prompt'] = [
'#type' => 'textfield',
'#title' => $allow_create ? $this
->t('Create Prompt') : $this
->t('Not Found Prompt'),
'#default_value' => $element_properties['none_prompt'],
'#description' => $allow_create ? $this
->t('This text should prompt the user to create a new contact.') : $this
->t('This text should tell the user that no search results were found.'),
'#size' => 60,
'#maxlength' => 1024,
];
$form['form']['show_hidden_contact'] = [
'#type' => 'radios',
'#title' => $this
->t('Display Contact Name'),
'#description' => $this
->t('If enabled, this static element will show the contact that has been pre-selected (or else the Create/Not Found Prompt if set). Otherwise the element will not be visible.'),
'#options' => [
$this
->t('No'),
$this
->t('Yes'),
],
'#default_value' => $element_properties['show_hidden_contact'],
];
$form['form']['results_display'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this
->t('Contact Display Field(s)'),
'#required' => TRUE,
'#default_value' => $element_properties['results_display'],
'#options' => $this
->wf_crm_results_display_options($contact_type),
];
$form['field_handling'] = [
'#type' => 'details',
'#title' => $this
->t('Contact Field Handling'),
];
$form['field_handling']['no_autofill'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this
->t('Skip Autofilling of'),
'#description' => $this
->t('Which fields should <em>not</em> be autofilled for this contact?'),
'#default_value' => $element_properties['no_autofill'],
'#options' => [
'' => '- ' . $this
->t('None') . ' -',
] + $this
->wf_crm_contact_fields($webform, $c),
];
$form['field_handling']['hide_fields'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this
->t('Fields to Lock'),
'#description' => $this
->t('Prevent editing by disabling or hiding fields when a contact already exists.'),
'#default_value' => $element_properties['hide_fields'],
'#options' => [
'' => '- ' . $this
->t('None') . ' -',
] + $this
->wf_crm_contact_fields($webform, $c),
];
$form['field_handling']['hide_method'] = [
'#type' => 'select',
'#title' => $this
->t('Locked fields should be'),
'#default_value' => $element_properties['hide_method'],
'#options' => [
'hide' => $this
->t('Hidden'),
'disable' => $this
->t('Disabled'),
],
'#states' => [
'visible' => [
'select[name="properties[hide_fields][]"]' => [
'!value' => '',
],
],
],
];
$form['field_handling']['no_hide_blank'] = [
'#type' => 'checkbox',
'#title' => $this
->t("Don't lock fields that are empty"),
'#default_value' => $element_properties['no_hide_blank'],
'#states' => [
'visible' => [
'select[name="properties[hide_fields][]"]' => [
'!value' => '',
],
],
],
];
$form['field_handling']['submit_disabled'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Submit disabled field value(s)'),
'#description' => $this
->t('Store disabled field value(s) in webform submissions.'),
'#default_value' => $element_properties['submit_disabled'],
'#states' => [
'visible' => [
'select[name="properties[hide_fields][]"]' => [
'!value' => '',
],
],
],
];
$form['contact_defaults'] = [
'#type' => 'details',
'#title' => $this
->t('Default value'),
'#description' => $this
->t('Should the form be pre-populated with an existing contact?<ul><li>Any filters set below will restrict this default.</li><li>If more than one contact meets the criteria, the first match will be picked. If multiple existing contact fields exist on the webform, each will select a different contact.</li></ul>'),
];
$form['contact_defaults']['default'] = [
'#type' => 'select',
'#title' => $this
->t('Set default contact from'),
'#options' => [
'contact_id' => $this
->t('Specified Contact'),
],
'#empty_option' => $this
->t('- None -'),
'#default_value' => $element_properties['default'],
];
if ($c == 1 && $contact_type == 'individual') {
$form['contact_defaults']['default']['#options']['user'] = $this
->t('Current User');
}
elseif ($c > 1) {
$form['contact_defaults']['default']['#options']['relationship'] = $this
->t('Relationship to...');
$form['contact_defaults']['default_relationship_to'] = [
'#type' => 'select',
'#default_value' => $element_properties['default_relationship_to'],
];
$form['contact_defaults']['default_relationship'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this
->t('Specify Relationship(s)'),
'#options' => [
'' => '- ' . $this
->t('No relationship types defined for @a to @b', [
'@a' => $contact_types[$contact_type],
'@b' => $contact_types[$data['contact'][1]['contact'][1]['contact_type']],
]) . ' -',
],
'#default_value' => $element_properties['default_relationship'],
];
}
$form['contact_defaults']['default']['#options']['auto'] = $this
->t('Auto - From Filters');
$form['contact_defaults']['default_contact_id'] = [
'#type' => 'textfield',
'#title' => $this
->t('Contact'),
'#id' => 'default-contact-id',
'#states' => [
'visible' => [
'select[name="properties[default]"]' => [
'value' => 'contact_id',
],
],
],
];
$cid = $element_properties['default_contact_id'];
$contactComponent = \Drupal::service('webform_civicrm.contact_component');
if ($cid && ($name = $contactComponent
->wf_crm_contact_access($element_properties, [
'check_permissions' => 1,
], $cid))) {
$form['contact_defaults']['default_contact_id']['#default_value'] = $cid;
$form['contact_defaults']['default_contact_id']['#attributes'] = [
'data-civicrm-name' => $name,
'data-civicrm-id' => $cid,
];
}
$form['contact_defaults']['allow_url_autofill'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Use contact id from URL'),
'#default_value' => $element_properties['allow_url_autofill'],
'#description' => $this
->t('If the url contains e.g. %arg, it will be used to pre-populate this contact (takes precidence over other default values).', [
'%arg' => "cid{$c}=123",
]),
];
if ($c > 1) {
$form['contact_defaults']['dupes_allowed'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Allow Duplicate Autofill'),
'#default_value' => $element_properties['dupes_allowed'],
'#description' => $this
->t('Check this box to allow a contact to be selected even if they already autofilled a prior field on the form. (For example, if contact 1 was autofilled with Bob Smith, should this field also be allowed to select Bob Smith or should it pick a different contact?)'),
];
}
$form['contact_defaults']['randomize'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Randomize'),
'#default_value' => $element_properties['randomize'],
'#description' => $this
->t('Pick a contact at random if more than one meets criteria.'),
'#states' => [
'visible' => [
'select[name="properties[default]"]' => [
'value' => 'auto',
],
],
],
];
$form['filters'] = [
'#type' => 'details',
'#title' => $this
->t('Filters'),
'#description' => $this
->t('Only contacts meeting filter criteria will be available as select options or default value.<br />Note: Filters only apply to how a contact is chosen on the form, they do not affect how a contact is saved.'),
];
if (!empty($sub_types[$contact_type])) {
$form['filters']['contact_sub_type'] = [
'#type' => 'select',
'#title' => $this
->t('Type of @contact', [
'@contact' => $contact_types[$contact_type],
]),
'#empty_option' => $this
->t('- Any -'),
'#options' => $sub_types[$contact_type],
'#default_value' => $element_properties['contact_sub_type'],
];
}
$form['filters']['group'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this
->t('Groups'),
'#options' => [
'' => '- ' . $this
->t('None') . ' -',
] + $utils
->wf_crm_apivalues('group_contact', 'getoptions', [
'field' => 'group_id',
]),
'#default_value' => $element_properties['group'],
'#description' => $this
->t('Listed contacts must be members of at least one of the selected groups (leave blank to not filter by group).'),
];
$tags = [];
$form['filters']['tag'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this
->t('Tags'),
'#options' => [
'' => '- ' . $this
->t('None') . ' -',
] + CRM_Core_BAO_Tag::getTags('civicrm_contact', $tags, NULL, '- '),
'#default_value' => $element_properties['tag'],
'#description' => $this
->t('Listed contacts must be have at least one of the selected tags (leave blank to not filter by tag).'),
];
if ($c > 1) {
$form['filters']['relationship']['filter_relationship_contact'] = [
'#type' => 'select',
'#title' => $this
->t('Relationships to'),
'#options' => [
'' => '- ' . $this
->t('None') . ' -',
],
'#default_value' => $element_properties['filter_relationship_contact'],
];
$form['filters']['relationship']['filter_relationship_types'] = [
'#type' => 'select',
'#multiple' => TRUE,
'#title' => $this
->t('Specify Relationship(s)'),
'#options' => [
'' => '- ' . $this
->t('Any relation') . ' -',
],
'#default_value' => $element_properties['filter_relationship_types'],
];
// Fill relationship data for defaults and filters
$all_relationship_types = array_fill(1, $c - 1, []);
for ($i = 1; $i < $c; ++$i) {
$form['contact_defaults']['default_relationship_to']['#options'][$i] = $form['filters']['relationship']['filter_relationship_contact']['#options'][$i] = $utils
->wf_crm_contact_label($i, $data, 'plain');
$rtypes = $utils
->wf_crm_get_contact_relationship_types($contact_type, $data['contact'][$i]['contact'][1]['contact_type'], $data['contact'][$c]['contact'][1]['contact_sub_type'], $data['contact'][$i]['contact'][1]['contact_sub_type']);
foreach ($rtypes as $k => $v) {
$all_relationship_types[$i][] = [
'key' => $k,
'value' => $v . ' ' . $utils
->wf_crm_contact_label($i, $data, 'plain'),
];
$form['contact_defaults']['default_relationship']['#options'][$k] = $form['filters']['relationship']['filter_relationship_types']['#options'][$k] = $v . ' ' . $utils
->wf_crm_contact_label($i, $data, 'plain');
}
if (!$rtypes) {
$all_relationship_types[$i][] = [
'key' => '',
'value' => '- ' . t('No relationship types defined for @a to @b', [
'@a' => $contact_types[$contact_type],
'@b' => $contact_types[$data['contact'][$i]['contact'][1]['contact_type']],
]) . ' -',
];
}
}
$form['contact_defaults']['default_relationship']['#attributes']['data-reltypes'] = $form['filters']['relationship']['filter_relationship_types']['#attributes']['data-reltypes'] = json_encode($all_relationship_types);
}
$form['filters']['check_permissions'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Enforce Permissions'),
'#default_value' => $element_properties['check_permissions'],
'#description' => $this
->t('Only show contacts the acting user has permission to see in CiviCRM.') . '<br />' . $this
->t('WARNING: Keeping this option enabled is highly recommended unless you are effectively controlling access by another method.'),
];
// Need to be hidden values so that they persist from configuration on the
// main Webform CiviCRM settings form.
$form['allow_create'] = [
'#type' => 'hidden',
'#value' => $element_properties['allow_create'],
];
$form['contact_type'] = [
'#type' => 'value',
'#value' => $element_properties['contact_type'],
];
return $form;
}