Skip to content

Instantly share code, notes, and snippets.

@chumkui
Created May 29, 2024 17:50
Show Gist options
  • Select an option

  • Save chumkui/467d794bb28dd7b7ea9f74f8e176ff16 to your computer and use it in GitHub Desktop.

Select an option

Save chumkui/467d794bb28dd7b7ea9f74f8e176ff16 to your computer and use it in GitHub Desktop.
CiviCRM form with handler to reproduce the Contact Filter bug
uuid: b3d0c64f-05ef-4550-9556-0876ec4fa323
langcode: en
status: open
dependencies:
module:
- webform_civicrm
- webform_image_handler
weight: 0
open: null
close: null
uid: 1
template: false
archive: false
id: reproduce_webform_civicrm_bug
title: 'Reproduce Webform-CiviCRM bug'
description: ''
categories: { }
elements: |-
civicrm_1_contact_1_contact_existing:
'#type': civicrm_contact
'#title': 'Existing Contact'
'#widget': hidden
'#none_prompt': '+ Create new +'
'#show_hidden_contact': 1
'#results_display':
display_name: display_name
'#default': user
'#group':
'': ''
'#allow_create': 1
'#contact_type': individual
'#form_key': civicrm_1_contact_1_contact_existing
'#parent': civicrm_1_contact_1_fieldset_fieldset
'#extra': { }
css: ''
javascript: ''
settings:
ajax: false
ajax_scroll_top: form
ajax_progress_type: ''
ajax_effect: ''
ajax_speed: null
page: true
page_submit_path: ''
page_confirm_path: ''
page_theme_name: ''
form_title: both
form_submit_once: false
form_open_message: ''
form_close_message: ''
form_exception_message: ''
form_previous_submissions: true
form_confidential: false
form_confidential_message: ''
form_disable_remote_addr: false
form_convert_anonymous: false
form_prepopulate: false
form_prepopulate_source_entity: false
form_prepopulate_source_entity_required: false
form_prepopulate_source_entity_type: ''
form_unsaved: false
form_disable_back: false
form_submit_back: false
form_disable_autocomplete: false
form_novalidate: false
form_disable_inline_errors: false
form_required: false
form_autofocus: false
form_details_toggle: false
form_reset: false
form_access_denied: default
form_access_denied_title: ''
form_access_denied_message: ''
form_access_denied_attributes: { }
form_file_limit: ''
form_attributes: { }
form_method: ''
form_action: ''
share: false
share_node: false
share_theme_name: ''
share_title: true
share_page_body_attributes: { }
submission_label: ''
submission_exception_message: ''
submission_locked_message: ''
submission_log: false
submission_excluded_elements: { }
submission_exclude_empty: false
submission_exclude_empty_checkbox: false
submission_views: { }
submission_views_replace: { }
submission_user_columns: { }
submission_user_duplicate: false
submission_access_denied: default
submission_access_denied_title: ''
submission_access_denied_message: ''
submission_access_denied_attributes: { }
previous_submission_message: ''
previous_submissions_message: ''
autofill: false
autofill_message: ''
autofill_excluded_elements: { }
wizard_progress_bar: true
wizard_progress_pages: false
wizard_progress_percentage: false
wizard_progress_link: false
wizard_progress_states: false
wizard_start_label: ''
wizard_preview_link: false
wizard_confirmation: true
wizard_confirmation_label: ''
wizard_auto_forward: true
wizard_auto_forward_hide_next_button: false
wizard_keyboard: true
wizard_track: ''
wizard_prev_button_label: ''
wizard_next_button_label: ''
wizard_toggle: false
wizard_toggle_show_label: ''
wizard_toggle_hide_label: ''
wizard_page_type: container
wizard_page_title_tag: h2
preview: 0
preview_label: ''
preview_title: ''
preview_message: ''
preview_attributes: { }
preview_excluded_elements: { }
preview_exclude_empty: true
preview_exclude_empty_checkbox: false
draft: none
draft_multiple: false
draft_auto_save: false
draft_saved_message: ''
draft_loaded_message: ''
draft_pending_single_message: ''
draft_pending_multiple_message: ''
confirmation_type: page
confirmation_url: ''
confirmation_title: ''
confirmation_message: ''
confirmation_attributes: { }
confirmation_back: true
confirmation_back_label: ''
confirmation_back_attributes: { }
confirmation_exclude_query: false
confirmation_exclude_token: false
confirmation_update: false
limit_total: null
limit_total_interval: null
limit_total_message: ''
limit_total_unique: false
limit_user: null
limit_user_interval: null
limit_user_message: ''
limit_user_unique: false
entity_limit_total: null
entity_limit_total_interval: null
entity_limit_user: null
entity_limit_user_interval: null
purge: none
purge_days: null
results_disabled: false
results_disabled_ignore: false
results_customize: false
token_view: false
token_update: false
token_delete: false
serial_disabled: false
access:
create:
roles:
- anonymous
- authenticated
users: { }
permissions: { }
view_any:
roles: { }
users: { }
permissions: { }
update_any:
roles: { }
users: { }
permissions: { }
delete_any:
roles: { }
users: { }
permissions: { }
purge_any:
roles: { }
users: { }
permissions: { }
view_own:
roles: { }
users: { }
permissions: { }
update_own:
roles: { }
users: { }
permissions: { }
delete_own:
roles: { }
users: { }
permissions: { }
administer:
roles: { }
users: { }
permissions: { }
test:
roles: { }
users: { }
permissions: { }
configuration:
roles: { }
users: { }
permissions: { }
handlers:
webform_civicrm:
id: webform_civicrm
handler_id: webform_civicrm
label: CiviCRM
notes: ''
status: true
conditions: { }
weight: -50
settings:
disable: 'Leave Fields and Save Settings'
nid: 1
number_of_contacts: '1'
1_contact_type: individual
1_webform_label: 'Contact 1'
civicrm_1_contact_1_contact_contact_sub_type:
'': ''
civicrm_1_contact_1_contact_existing: create_civicrm_webform_element
civicrm_1_contact_1_contact_prefix_id: 0
civicrm_1_contact_1_contact_first_name: 0
civicrm_1_contact_1_contact_middle_name: 0
civicrm_1_contact_1_contact_last_name: 0
civicrm_1_contact_1_contact_suffix_id: 0
civicrm_1_contact_1_contact_nick_name: 0
civicrm_1_contact_1_contact_gender_id: 0
civicrm_1_contact_1_contact_job_title: 0
civicrm_1_contact_1_contact_birth_date: 0
civicrm_1_contact_1_contact_preferred_communication_method: 0
civicrm_1_contact_1_contact_privacy: 0
civicrm_1_contact_1_contact_preferred_language: 0
civicrm_1_contact_1_contact_communication_style_id: 0
civicrm_1_contact_1_contact_image_url: 0
civicrm_1_contact_1_contact_contact_id: 0
civicrm_1_contact_1_contact_user_id: 0
civicrm_1_contact_1_contact_external_identifier: 0
civicrm_1_contact_1_contact_source: 0
civicrm_1_contact_1_contact_cs: 0
civicrm_1_contact_1_contact_employer_id: 0
civicrm_1_contact_1_contact_is_deceased: 0
civicrm_1_contact_1_contact_deceased_date: 0
contact_1_settings_matching_rule: Unsupervised
contact_1_number_of_cg20: '0'
contact_1_number_of_cg18: '0'
contact_1_number_of_cg29: '0'
contact_1_number_of_cg56: '0'
contact_1_number_of_other: '0'
contact_1_number_of_address: '0'
contact_1_number_of_phone: '0'
contact_1_number_of_email: '0'
contact_1_number_of_website: '0'
contact_1_number_of_im: '0'
contact_1_number_of_cg39: '0'
contact_1_number_of_cg23: '0'
contact_1_number_of_cg22: '0'
contact_1_number_of_cg13: '0'
contact_1_number_of_cg19: '0'
prefix_known: ''
prefix_unknown: ''
toggle_message: 0
message: ''
activity_number_of_activity: '0'
case_number_of_case: '0'
participant_reg_type: '0'
reg_options:
event_type:
any: any
show_past_events: now
show_future_events: '1'
show_public_events: all
title_display: title
show_full_events: 1
event_sort_field: start_date
show_remaining: '0'
validate: 1
block_form: 0
disable_unregister: 0
allow_url_load: 0
disable_primary_participant: 0
membership_1_number_of_membership: '0'
civicrm_1_contribution_1_contribution_enable_contribution: '0'
checksum_text: ''
create_fieldsets: 1
confirm_subscription: 1
block_unknown_users: 0
create_new_relationship: 0
disable_contact_paging: 0
new_contact_source: 'Reproduce Webform-CiviCRM bug'
data:
contact:
1:
contact:
1:
contact_type: individual
contact_sub_type: { }
webform_label: 'Contact 1'
matching_rule: Unsupervised
number_of_cg20: '0'
number_of_cg18: '0'
number_of_cg29: '0'
number_of_cg56: '0'
number_of_other: '0'
number_of_address: '0'
number_of_phone: '0'
number_of_email: '0'
number_of_website: '0'
number_of_im: '0'
number_of_cg39: '0'
number_of_cg23: '0'
number_of_cg22: '0'
number_of_cg13: '0'
number_of_cg19: '0'
activity:
number_of_activity: '0'
case:
number_of_case: '0'
membership:
1:
number_of_membership: '0'
participant_reg_type: '0'
reg_options:
event_type:
any: any
show_past_events: now
show_future_events: '1'
show_public_events: all
title_display: title
show_full_events: 1
event_sort_field: start_date
show_remaining: '0'
validate: 1
block_form: 0
disable_unregister: 0
allow_url_load: 0
disable_primary_participant: 0
image_handler:
id: webform_image_handler
handler_id: image_handler
label: 'Image handler'
notes: ''
status: true
conditions: { }
weight: -49
settings: { }
variants: { }
name: Webform Image Handler
type: module
description: A module containing a custom webform handler to process images
core_version_requirement: ^10
package: CT Custom
dependencies:
- 'webform:webform'
<?php
/**
* @file
* Provides an example of a webform handler.
*/
/**
* Implements hook_theme().
*/
function webform_image_handler_theme() {
return [
'webform_image_handler_summary' => [
'variables' => ['settings' => NULL, 'handler' => []],
],
];
}
<?php
namespace Drupal\webform_image_handler\Plugin\WebformHandler;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\WebformSubmissionInterface;
/**
* Form submission handler.
*
* @WebformHandler(
* id = "webform_image_handler",
* label = @Translation("Image handler"),
* category = @Translation("Custom"),
* description = @Translation("Handles images in webforms."),
* cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
* results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
* )
*/
class WebformImageHandler extends WebformHandlerBase
{
/**
* Display the invoked plugin method to end user.
*
* @param string $method_name
* The invoked method name.
* @param string $context1
* Additional parameter passed to the invoked method name.
*/
protected function debug($method_name, $context1 = NULL)
{
if (!empty($this->configuration['debug'])) {
$t_args = [
'@id' => $this->getHandlerId(),
'@class_name' => get_class($this),
'@method_name' => $method_name,
'@context1' => $context1,
];
$this->messenger()->addWarning($this->t('Invoked @id: @class_name:@method_name @context1', $t_args), TRUE);
}
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission)
{
$this->debug(__FUNCTION__);
//Only run the validation on a form Update as this is after the teacher has received it
if (!$webform_submission->isNew()) {
// Run validation only on form update
$this->validateAuthorised($form_state);
}
if ($webform_submission->isNew()) {
// Run validation only on form creation
$this->validateUpload($form_state);
}
}
/**
* Check to see if there are any images uploaded. If there are no images and authorised is not set to 'Yes'
* display a message to the user advising them that there has to be images present. If there are images present
* and authorised is not set to 'Yes' display a message to the user advising them that they must authorise the form
*
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*/
protected function validateAuthorised(FormStateInterface $form_state)
{
$values = $form_state->getValues();
$images = $values['my_photo'];
$authorised = $values['civicrm_1_activity_1_cg55_custom_530'];
if (!empty($images) && $authorised !== '1') {
$form_state->setErrorByName('civicrm_1_activity_1_cg55_custom_530', $this->t("You must set authorise to 'Yes' if you are submitting one or more pictures."));
}
if (empty($images) && $authorised !== '0') {
$form_state->setErrorByName('civicrm_1_activity_1_cg55_custom_530', $this->t("You must set authorise to 'No' if you are not uploading any images."));
}
}
/**
* Check to see if there are any images uploaded. There has to be at least one image uploaded when submitting the form for the first time.
*
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*/
protected function validateUpload(FormStateInterface $form_state)
{
$values = $form_state->getValues();
$images = $values['my_photo'];
if (empty($images)) {
$form_state->setErrorByName('my_photo', $this->t("You must attach at least one image for approval!"));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment