822 lines
31 KiB
PHP
822 lines
31 KiB
PHP
<?php
|
|
|
|
namespace FluentCrm\App\Hooks\Handlers;
|
|
|
|
use FluentCrm\App\Services\Helper;
|
|
use FluentCrm\Framework\Support\Arr;
|
|
use FluentCrm\App\Models\CustomContactField as CustomFields;
|
|
|
|
/**
|
|
* Integrations Class
|
|
*
|
|
* @package FluentCrm\App\Hooks
|
|
*
|
|
* @version 2.5.94
|
|
*/
|
|
class PrefFormHandler
|
|
{
|
|
public function handleShortCode($atts, $noContactContent = '')
|
|
{
|
|
|
|
if (isset($_REQUEST['_fc_secure_hash'])) {
|
|
$hash = sanitize_text_field($_REQUEST['_fc_secure_hash']);
|
|
if ($hash) {
|
|
$_COOKIE['fc_hash_secure'] = $hash;
|
|
}
|
|
}
|
|
|
|
$settings = Helper::getGlobalEmailSettings();
|
|
|
|
if (Arr::get($settings, 'pref_form') != 'yes' || empty(Arr::get($settings, 'pref_general'))) {
|
|
return '';
|
|
}
|
|
|
|
|
|
do_action('fluent_crm/rendering_pref_form_shortcode');
|
|
|
|
$subscriber = FluentCrmApi('contacts')->getCurrentContact(true, true);
|
|
|
|
if (!$subscriber) {
|
|
return $noContactContent;
|
|
}
|
|
|
|
/**
|
|
* Determine the preference form labels in FluentCRM.
|
|
*
|
|
* This filter allows modification of the labels used in the preference form.
|
|
*
|
|
* @since 2.5.95
|
|
*
|
|
* @param array {
|
|
* An associative array of labels.
|
|
*
|
|
* @type string $first_name Label for the first name field.
|
|
* @type string $last_name Label for the last name field.
|
|
* @type string $prefix Label for the title field.
|
|
* @type string $email Label for the email field.
|
|
* @type string $phone Label for the phone/mobile field.
|
|
* @type string $dob Label for the date of birth field.
|
|
* @type string $address_line_1 Label for the address line 1 field.
|
|
* @type string $address_line_2 Label for the address line 2 field.
|
|
* @type string $city Label for the city field.
|
|
* @type string $state Label for the state field.
|
|
* @type string $postal_code Label for the ZIP code field.
|
|
* @type string $country Label for the country field.
|
|
* @type string $update Label for the update info button.
|
|
* @type string $address_heading Label for the address information section.
|
|
* @type string $list_label Label for the mailing list groups section.
|
|
* }
|
|
*/
|
|
$labels = apply_filters('fluent_crm/pref_labels', [
|
|
'first_name' => __('First Name', 'fluent-crm'),
|
|
'last_name' => __('Last Name', 'fluent-crm'),
|
|
'prefix' => __('Title', 'fluent-crm'),
|
|
'email' => __('Email', 'fluent-crm'),
|
|
'phone' => __('Phone/Mobile', 'fluent-crm'),
|
|
'dob' => __('Date of Birth', 'fluent-crm'),
|
|
'address_line_1' => __('Address Line 1', 'fluent-crm'),
|
|
'address_line_2' => __('Address Line 2', 'fluent-crm'),
|
|
'city' => __('City', 'fluent-crm'),
|
|
'state' => __('State', 'fluent-crm'),
|
|
'postal_code' => __('ZIP Code', 'fluent-crm'),
|
|
'country' => __('Country', 'fluent-crm'),
|
|
'update' => __('Update info', 'fluent-crm'),
|
|
'address_heading' => __('Address Information', 'fluent-crm'),
|
|
'list_label' => __('Mailing List Groups', 'fluent-crm'),
|
|
'custom_fields' => __('Custom Fields', 'fluent-crm')
|
|
]);
|
|
|
|
$formFields = $this->getFormFields($settings, $subscriber, $labels, false);
|
|
|
|
$listOptions = [];
|
|
$lists = Helper::getPublicLists();
|
|
if ($lists) {
|
|
foreach ($lists as $list) {
|
|
$listOptions[strval($list->id)] = $list->title;
|
|
}
|
|
|
|
$formattedLists = [];
|
|
foreach ($subscriber->lists as $list) {
|
|
$formattedLists[] = $list->id;
|
|
}
|
|
|
|
$formFields['lists'] = [
|
|
'type' => 'checkboxes',
|
|
'name' => 'lists',
|
|
'container_class' => 'fc_inline_checkboxes',
|
|
'options' => $listOptions,
|
|
'value' => $formattedLists,
|
|
'id' => 'mailing_lists',
|
|
'label' => Arr::get($labels, 'list_label', 'Mailing List Groups'),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Determine the preference form fields against a subscriber or contact data in FluentCRM.
|
|
*
|
|
* This filter allows modification of the preference form fields before they are displayed.
|
|
*
|
|
* @since 2.5.95
|
|
*
|
|
* @param array $formFields The current form fields.
|
|
* @param object $subscriber The subscriber object.
|
|
* @return array Modified form fields.
|
|
*/
|
|
$formFields = apply_filters('fluent_crm/pref_form_fields', $formFields, $subscriber);
|
|
|
|
$formFields[] = [
|
|
'type' => 'hidden',
|
|
'atts' => [
|
|
'name' => 'action',
|
|
'value' => 'fluent_crm_account_form'
|
|
]
|
|
];
|
|
|
|
if (isset($_REQUEST['_fc_secure_hash'])) {
|
|
$hash = sanitize_text_field($_REQUEST['_fc_secure_hash']);
|
|
if($hash) {
|
|
$formFields[] = [
|
|
'type' => 'hidden',
|
|
'atts' => [
|
|
'name' => '_fc_hash_secure',
|
|
'value' => $hash
|
|
]
|
|
];
|
|
}
|
|
}
|
|
|
|
wp_enqueue_style(
|
|
'fluentcrm_public_pref',
|
|
fluentCrmMix('public/public_pref.css'),
|
|
[],
|
|
FLUENTCRM_PLUGIN_VERSION
|
|
);
|
|
|
|
wp_enqueue_script('fluentcrm_public_pref', fluentCrmMix('public/public_pref.js'), ['jquery'], FLUENTCRM_PLUGIN_VERSION, true);
|
|
|
|
wp_localize_script('fluentcrm_public_pref', 'fluentcrm_sub_pref', [
|
|
'ajaxurl' => admin_url('admin-ajax.php')
|
|
]);
|
|
|
|
return (string) fluentCrm('view')->make('external.pref_form', [
|
|
'fields' => $formFields,
|
|
'submitBtn' => [
|
|
'container_class' => 'fc_pref_submit',
|
|
'btn_text' => __('Update info', 'fluent-crm'),
|
|
'atts' => [
|
|
'type' => 'submit',
|
|
'id' => 'fluentcrm_preferences_submit',
|
|
'class' => 'btn fc_pref_submit'
|
|
]
|
|
],
|
|
'subscriber' => $subscriber
|
|
]);
|
|
}
|
|
|
|
public function handleDynamicContentShortCode($atts, $text = '')
|
|
{
|
|
if(!$text) {
|
|
return '';
|
|
}
|
|
|
|
$defaults = [
|
|
'hide_for_guest' => 'no'
|
|
];
|
|
|
|
$atts = shortcode_atts($defaults, $atts, 'fluentcrm_content');
|
|
|
|
$subscriber = FluentCrmApi('contacts')->getCurrentContact(true, true);
|
|
|
|
if(!$subscriber) {
|
|
if($atts['hide_for_guest'] == 'yes') {
|
|
return '';
|
|
}
|
|
return preg_replace_callback('/({{|##)+(.*?)(}}|##)/', function ($matches) {
|
|
if(isset($matches[2])) {
|
|
$token = $matches[2];
|
|
$tokens = explode('|', $token);
|
|
if(isset($tokens[1])) {
|
|
return $tokens[1];
|
|
}
|
|
}
|
|
return '';
|
|
}, $text);
|
|
}
|
|
|
|
return \FluentCrm\App\Services\Libs\Parser\Parser::parse($text, $subscriber);
|
|
}
|
|
|
|
public function handleAjax()
|
|
{
|
|
if (!isset($_POST['_fc_nonce']) || !wp_verify_nonce($_POST['_fc_nonce'], 'fluent_crm_account_form_fields')) {
|
|
wp_send_json_error([
|
|
'message' => __('Sorry, your nonce did not verify.', 'fluent-crm')
|
|
], 422);
|
|
}
|
|
|
|
$settings = Helper::getGlobalEmailSettings();
|
|
|
|
if (Arr::get($settings, 'pref_form') != 'yes' || empty(Arr::get($settings, 'pref_general'))) {
|
|
wp_send_json_error([
|
|
'message' => __('Sorry! You cannot update your profile.', 'fluent-crm')
|
|
], 422);
|
|
}
|
|
|
|
if (isset($_REQUEST['_fc_hash_secure']) && !is_user_logged_in()) {
|
|
$hash = sanitize_text_field($_REQUEST['_fc_hash_secure']);
|
|
if ($hash) {
|
|
$_COOKIE['fc_hash_secure'] = $hash;
|
|
}
|
|
}
|
|
|
|
$subscriber = FluentCrmApi('contacts')->getCurrentContact(false, true);
|
|
|
|
if (!$subscriber) {
|
|
wp_send_json_error([
|
|
'message' => __('Sorry! You cannot update your profile.', 'fluent-crm')
|
|
], 422);
|
|
}
|
|
|
|
$validInputs = $this->getFormFields($settings, $subscriber, [], true);
|
|
|
|
$validKeys = array_keys($validInputs);
|
|
|
|
$validData = Arr::only($_REQUEST, $validKeys);
|
|
if (empty($validData['email'])) {
|
|
$validData['email'] = $subscriber->email;
|
|
}
|
|
|
|
$errors = [];
|
|
foreach ($validInputs as $key => $input) {
|
|
if (Arr::get($input, 'required') && empty($validData[$key])) {
|
|
$errors[] = $key . ' is required';
|
|
}
|
|
|
|
// Handle array values for multi-select and checkboxes
|
|
if (isset($validData[$key]) && is_array($validData[$key])) {
|
|
$validData[$key] = array_map('sanitize_text_field', $validData[$key]);
|
|
} else {
|
|
$validData[$key] = sanitize_text_field(Arr::get($validData, $key, ''));
|
|
}
|
|
}
|
|
|
|
if (!empty($validData['date_of_birth']) && !$this->isValidDate($validData['date_of_birth'])) {
|
|
$errors[] = 'date_of_birth';
|
|
}
|
|
|
|
if ($errors) {
|
|
wp_send_json_error([
|
|
'message' => __('Please fill up all required fields', 'fluent-crm'),
|
|
'errors' => $errors,
|
|
'inputs' => $validData
|
|
], 422);
|
|
}
|
|
|
|
// Handle custom fields
|
|
$enabledCustomFieldSlugs = Arr::get($settings, 'pref_custom', []);
|
|
$allCustomFields = (new CustomFields)->getGlobalFields()['fields'];
|
|
|
|
if (!empty($allCustomFields) && !empty($enabledCustomFieldSlugs)) {
|
|
foreach ($allCustomFields as $field) {
|
|
$fieldKey = $field['slug'];
|
|
|
|
// Only process fields that are enabled in pref_custom
|
|
if (!in_array($fieldKey, $enabledCustomFieldSlugs)) {
|
|
continue;
|
|
}
|
|
|
|
if (isset($validData[$fieldKey])) {
|
|
$value = $validData[$fieldKey];
|
|
|
|
// Handle different field types
|
|
switch ($field['type']) {
|
|
case 'checkbox':
|
|
if (is_array($value)) {
|
|
$value = array_map('sanitize_text_field', $value);
|
|
}
|
|
break;
|
|
|
|
|
|
case 'select-multi':
|
|
|
|
if (is_array($value)) {
|
|
$value = array_map('sanitize_text_field', $value);
|
|
} else {
|
|
$value = [];
|
|
}
|
|
break;
|
|
|
|
case 'number':
|
|
$value = floatval($value);
|
|
break;
|
|
|
|
case 'textarea':
|
|
$value = isset($_POST[$fieldKey]) ? sanitize_textarea_field($_POST[$fieldKey]) : '';
|
|
break;
|
|
|
|
case 'date':
|
|
$value = sanitize_text_field($value);
|
|
break;
|
|
|
|
default:
|
|
$value = sanitize_text_field($value);
|
|
}
|
|
|
|
// Update the meta with proper type
|
|
$subscriber->updateMeta($field['slug'], $value, 'custom_field');
|
|
unset($validData[$fieldKey]); // Remove from main data
|
|
}
|
|
}
|
|
}
|
|
|
|
$subscriber->fill($validData);
|
|
|
|
$updateData = $subscriber->getDirty();
|
|
|
|
if($updateData) {
|
|
$subscriber->save();
|
|
}
|
|
|
|
if (isset($_REQUEST['lists'])) {
|
|
$publicLists = Helper::getPublicLists();
|
|
$publicListIds = [];
|
|
foreach ($publicLists as $publicList) {
|
|
$publicListIds[] = $publicList->id;
|
|
}
|
|
|
|
$selectedListIds = map_deep($_REQUEST['lists'], 'intval');
|
|
$attachLists = [];
|
|
$detachLists = [];
|
|
|
|
foreach ($subscriber->lists as $list) {
|
|
if (!in_array($list->id, $publicListIds)) {
|
|
continue;
|
|
}
|
|
|
|
if (!in_array($list->id, $selectedListIds)) {
|
|
$detachLists[] = $list->id;
|
|
}
|
|
}
|
|
|
|
foreach ($selectedListIds as $selectedListId) {
|
|
if (in_array($selectedListId, $publicListIds)) {
|
|
$attachLists[] = $selectedListId;
|
|
}
|
|
}
|
|
|
|
if ($attachLists) {
|
|
$subscriber->attachLists($attachLists);
|
|
}
|
|
|
|
if ($detachLists) {
|
|
$subscriber->detachLists($detachLists);
|
|
}
|
|
|
|
} else {
|
|
$listIds = $subscriber->lists()->get()->pluck('id')->toArray();
|
|
$subscriber->detachLists($listIds);
|
|
}
|
|
|
|
do_action('fluent_crm/pref_form_self_contact_updated', $subscriber, $_REQUEST);
|
|
|
|
if ($updateData) {
|
|
do_action('fluentcrm_contact_updated', $subscriber, $updateData);
|
|
do_action('fluent_crm/contact_updated', $subscriber, $updateData);
|
|
}
|
|
|
|
wp_send_json_success([
|
|
'message' => __('Your information has been updated', 'fluent-crm'),
|
|
'data' => $validData
|
|
], 200);
|
|
}
|
|
|
|
private function getFormFields($settings, $subscriber, $labels, $inputOnly = false)
|
|
{
|
|
$generalFields = Arr::get($settings, 'pref_general');
|
|
$customFields = Arr::get($settings, 'pref_custom');
|
|
|
|
$formFields = [];
|
|
|
|
if (array_intersect($generalFields, ['first_name', 'last_name'])) {
|
|
|
|
$nameFields = [];
|
|
|
|
if (in_array('prefix', $generalFields)) {
|
|
$nameFields['prefix'] = [
|
|
'type' => 'select',
|
|
'name' => 'prefix',
|
|
'container_class' => 'fc_name_prefix',
|
|
'id' => 'fc_name_prefix',
|
|
'label' => Arr::get($labels, 'prefix', 'Prefix'),
|
|
'placeholder' => '--',
|
|
'options' => Helper::getContactPrefixes(true),
|
|
'value' => $subscriber->prefix
|
|
];
|
|
}
|
|
|
|
if (in_array('first_name', $generalFields)) {
|
|
$nameFields['first_name'] = [
|
|
'type' => 'input',
|
|
'name' => 'first_name',
|
|
'id' => 'fc_first_name',
|
|
'atts' => [
|
|
'type' => 'text',
|
|
'placeholder' => __('First Name', 'fluent-crm')
|
|
],
|
|
'required' => true,
|
|
'label' => Arr::get($labels, 'first_name', 'First Name'),
|
|
'value' => $subscriber->first_name
|
|
];
|
|
}
|
|
|
|
if (in_array('last_name', $generalFields)) {
|
|
$nameFields['last_name'] = [
|
|
'type' => 'input',
|
|
'name' => 'last_name',
|
|
'id' => 'fc_last_name',
|
|
'atts' => [
|
|
'type' => 'text',
|
|
'placeholder' => __('Last Name', 'fluent-crm')
|
|
],
|
|
'required' => true,
|
|
'label' => Arr::get($labels, 'last_name', 'Last Name'),
|
|
'value' => $subscriber->last_name
|
|
];
|
|
}
|
|
|
|
$formFields['name'] = [
|
|
'type' => 'container',
|
|
'container_class' => 'fc_names fc_' . count($nameFields) . '_col',
|
|
'fields' => $nameFields
|
|
];
|
|
}
|
|
|
|
$formFields[] = [
|
|
'type' => 'raw_html',
|
|
'html' => '<div class="fc_2_col fc_email_phone_date">'
|
|
];
|
|
|
|
$formFields['email'] = [
|
|
'type' => 'input',
|
|
'name' => 'email',
|
|
'id' => 'fc_email',
|
|
'atts' => [
|
|
'type' => 'email',
|
|
'placeholder' => __('Email', 'fluent-crm'),
|
|
'disabled' => true
|
|
],
|
|
'required' => true,
|
|
'label' => Arr::get($labels, 'email', 'Email'),
|
|
'value' => $subscriber->email
|
|
];
|
|
|
|
if (in_array('phone', $generalFields)) {
|
|
$formFields['phone'] = [
|
|
'type' => 'input',
|
|
'name' => 'phone',
|
|
'id' => 'fc_phone',
|
|
'atts' => [
|
|
'type' => 'tel',
|
|
'placeholder' => __('Phone', 'fluent-crm')
|
|
],
|
|
'required' => false,
|
|
'label' => Arr::get($labels, 'phone', 'Phone/Mobile'),
|
|
'value' => $subscriber->phone
|
|
];
|
|
}
|
|
|
|
$formFields[] = [
|
|
'type' => 'raw_html',
|
|
'html' => '</div>'
|
|
];
|
|
|
|
if (in_array('date_of_birth', $generalFields)) {
|
|
$formFields['date_of_birth'] = [
|
|
'type' => 'date_dropdowns',
|
|
'name' => 'date_of_birth',
|
|
'id' => 'fc_date_of_birth',
|
|
'required' => false,
|
|
'label' => Arr::get($labels, 'dob', 'Date of Birth'),
|
|
'value' => $subscriber->date_of_birth
|
|
];
|
|
}
|
|
|
|
if (in_array('address_fields', $generalFields)) {
|
|
$formFields[] = [
|
|
'type' => 'raw_html',
|
|
'html' => '<h4 class="fc_address_info_heading">' . Arr::get($labels, 'address_heading', 'Address Information') . '</h4>'
|
|
];
|
|
|
|
/**
|
|
* Filter to modify the list of country names for the Preference Form Field in FluentCRM.
|
|
*
|
|
* This filter allows you to modify the list of country names used in FluentCRM.
|
|
*
|
|
* @since 2.7.0
|
|
*
|
|
* @param array An array of country names.
|
|
*/
|
|
$countryNames = apply_filters('fluent_crm/countries', []);
|
|
|
|
$formattedCountries = [];
|
|
foreach ($countryNames as $country) {
|
|
$formattedCountries[$country['code']] = $country['title'];
|
|
}
|
|
|
|
$formFields['address'] = [
|
|
'type' => 'container',
|
|
'container_class' => 'fc_addresses fc_2_col',
|
|
'fields' => [
|
|
'address_line_1' => [
|
|
'type' => 'input',
|
|
'name' => 'address_line_1',
|
|
'id' => 'fc_address_line_1',
|
|
'atts' => [
|
|
'type' => 'text',
|
|
'placeholder' => __('Address Line 1', 'fluent-crm')
|
|
],
|
|
'label' => Arr::get($labels, 'address_line_1', 'Address Line 1'),
|
|
'value' => $subscriber->address_line_1
|
|
],
|
|
'address_line_2' => [
|
|
'type' => 'input',
|
|
'name' => 'address_line_2',
|
|
'id' => 'fc_address_line_2',
|
|
'atts' => [
|
|
'type' => 'text',
|
|
'placeholder' => __('Address Line 2', 'fluent-crm')
|
|
],
|
|
'label' => Arr::get($labels, 'address_line_2', 'Address Line 2'),
|
|
'value' => $subscriber->address_line_2
|
|
],
|
|
'city' => [
|
|
'type' => 'input',
|
|
'name' => 'city',
|
|
'id' => 'fc_address_city',
|
|
'atts' => [
|
|
'type' => 'text',
|
|
'placeholder' => __('City', 'fluent-crm')
|
|
],
|
|
'label' => Arr::get($labels, 'city', 'City'),
|
|
'value' => $subscriber->city
|
|
],
|
|
'state' => [
|
|
'type' => 'input',
|
|
'name' => 'state',
|
|
'id' => 'fc_address_state',
|
|
'atts' => [
|
|
'type' => 'text',
|
|
'placeholder' => __('State', 'fluent-crm')
|
|
],
|
|
'label' => Arr::get($labels, 'state', 'State'),
|
|
'value' => $subscriber->state
|
|
],
|
|
'postal_code' => [
|
|
'type' => 'input',
|
|
'name' => 'postal_code',
|
|
'id' => 'fc_address_postal_code',
|
|
'atts' => [
|
|
'type' => 'text',
|
|
'placeholder' => __('Zip Code', 'fluent-crm')
|
|
],
|
|
'label' => Arr::get($labels, 'postal_code', 'Zip Code'),
|
|
'value' => $subscriber->postal_code
|
|
],
|
|
'country' => [
|
|
'type' => 'select',
|
|
'name' => 'country',
|
|
'id' => 'fc_address_country',
|
|
'placeholder' => __('Select Country', 'fluent-crm'),
|
|
'label' => Arr::get($labels, 'country', 'Country'),
|
|
'value' => $subscriber->country,
|
|
'options' => $formattedCountries
|
|
],
|
|
]
|
|
];
|
|
}
|
|
|
|
// Add custom fields section
|
|
if (!empty($customFields)) {
|
|
$allCustomFields = (new CustomFields)->getGlobalFields()['fields'];
|
|
$enabledCustomFields = [];
|
|
|
|
// Filter custom fields based on pref_custom settings
|
|
foreach ($allCustomFields as $field) {
|
|
if (in_array($field['slug'], $customFields)) {
|
|
$enabledCustomFields[] = $field;
|
|
}
|
|
}
|
|
|
|
if (!empty($enabledCustomFields)) {
|
|
$formFields[] = [
|
|
'type' => 'raw_html',
|
|
'html' => '<p class="fc_custom_fields_heading"></p>'
|
|
];
|
|
|
|
// Group fields by their group attribute
|
|
$groupedFields = [];
|
|
$ungroupedFields = [];
|
|
|
|
foreach ($enabledCustomFields as $field) {
|
|
if (!empty($field['group'])) {
|
|
$group = $field['group'];
|
|
if (!isset($groupedFields[$group])) {
|
|
$groupedFields[$group] = [];
|
|
}
|
|
$groupedFields[$group][] = $field;
|
|
} else {
|
|
$ungroupedFields[] = $field;
|
|
}
|
|
}
|
|
|
|
// Add ungrouped fields first
|
|
if (!empty($ungroupedFields)) {
|
|
$ungroupedContainer = [
|
|
'type' => 'container',
|
|
'container_class' => 'fc_custom_fields fc_2_col',
|
|
'fields' => []
|
|
];
|
|
|
|
foreach ($ungroupedFields as $field) {
|
|
$fieldType = $field['type'];
|
|
$fieldKey = $field['slug'];
|
|
$fieldConfig = $this->getCustomFieldConfig($field, $subscriber);
|
|
$ungroupedContainer['fields'][$fieldKey] = $fieldConfig;
|
|
}
|
|
|
|
$formFields['custom_fields_ungrouped'] = $ungroupedContainer;
|
|
}
|
|
|
|
// Create containers for each group
|
|
foreach ($groupedFields as $groupName => $fields) {
|
|
$customFieldsContainer = [
|
|
'type' => 'container',
|
|
'container_class' => 'fc_custom_fields fc_2_col fc_custom_field_group_box',
|
|
'fields' => []
|
|
];
|
|
|
|
$customFieldsContainer['fields']['group_heading'] = [
|
|
'type' => 'raw_html',
|
|
'html' => '<h5 class="fc_custom_field_group_heading">' . esc_html($groupName) . '</h5>'
|
|
];
|
|
|
|
foreach ($fields as $field) {
|
|
$fieldType = $field['type'];
|
|
$fieldKey = $field['slug'];
|
|
$fieldConfig = $this->getCustomFieldConfig($field, $subscriber);
|
|
$customFieldsContainer['fields'][$fieldKey] = $fieldConfig;
|
|
}
|
|
|
|
$formFields['custom_fields_' . sanitize_title($groupName)] = $customFieldsContainer;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if (!$inputOnly) {
|
|
return $formFields;
|
|
}
|
|
|
|
return $this->parseInputs($formFields);
|
|
}
|
|
|
|
private function parseInputs($fields)
|
|
{
|
|
$inputFields = [];
|
|
|
|
$inputTypes = ['hidden', 'input', 'checkboxes', 'select', 'radio', 'date', 'date_dropdowns', 'textarea', 'select-multi', 'custom_date', 'custom_date_time'];
|
|
|
|
foreach ($fields as $inputKey => $field) {
|
|
$type = Arr::get($field, 'type');
|
|
if ($type == 'container') {
|
|
$inputFields = array_merge($this->parseInputs($field['fields']), $inputFields);
|
|
} else if (in_array($type, $inputTypes)) {
|
|
$inputFields[$inputKey] = $field;
|
|
}
|
|
}
|
|
|
|
return $inputFields;
|
|
}
|
|
|
|
private function getCustomFieldConfig($field, $subscriber)
|
|
{
|
|
$fieldType = $field['type'];
|
|
$fieldKey = $field['slug'];
|
|
|
|
$fieldConfig = [
|
|
'type' => 'input',
|
|
'name' => $fieldKey,
|
|
'id' => 'fc_' . $fieldKey,
|
|
'label' => $field['label'],
|
|
'required' => !empty($field['required']),
|
|
'value' => $subscriber->getMeta($field['slug'], 'custom_field')
|
|
];
|
|
|
|
// Add field-specific configurations
|
|
switch ($fieldType) {
|
|
case 'text':
|
|
$fieldConfig['type'] = 'input';
|
|
$fieldConfig['atts'] = [
|
|
'type' => 'text',
|
|
'placeholder' => $field['label'],
|
|
'class' => 'fc_input_control'
|
|
];
|
|
break;
|
|
|
|
case 'textarea':
|
|
$fieldConfig['type'] = 'textarea';
|
|
$fieldConfig['atts'] = [
|
|
'placeholder' => $field['label'],
|
|
'class' => 'fc_input_control',
|
|
'name' => $fieldKey
|
|
];
|
|
break;
|
|
|
|
case 'number':
|
|
$fieldConfig['type'] = 'input';
|
|
$fieldConfig['atts'] = [
|
|
'type' => 'number',
|
|
'placeholder' => $field['label'],
|
|
'class' => 'fc_input_control'
|
|
];
|
|
break;
|
|
|
|
case 'select-one':
|
|
$fieldConfig['type'] = 'select';
|
|
$fieldConfig['options'] = array_combine($field['options'], $field['options']);
|
|
$fieldConfig['placeholder'] = $field['label'];
|
|
$fieldConfig['atts'] = [
|
|
'class' => 'fc_input_control select-one'
|
|
];
|
|
break;
|
|
|
|
case 'select-multi':
|
|
$fieldConfig['type'] = 'select-multi';
|
|
$fieldConfig['options'] = array_combine($field['options'], $field['options']);
|
|
$fieldConfig['value'] = is_array($fieldConfig['value']) ? $fieldConfig['value'] : [];
|
|
$fieldConfig['name'] = $fieldKey . '[]';
|
|
$fieldConfig['atts'] = [
|
|
'class' => 'fc_input_control select-multi',
|
|
'multiple' => 'multiple'
|
|
];
|
|
break;
|
|
|
|
case 'radio':
|
|
$fieldConfig['type'] = 'radio';
|
|
$fieldConfig['options'] = array_combine($field['options'], $field['options']);
|
|
$fieldConfig['atts'] = [
|
|
'class' => 'fc_input_control'
|
|
];
|
|
break;
|
|
|
|
case 'checkbox':
|
|
$fieldConfig['type'] = 'checkboxes';
|
|
$fieldConfig['options'] = is_array($field['options']) ? $field['options'] : [];
|
|
$fieldConfig['value'] = is_array($fieldConfig['value']) ? $fieldConfig['value'] : [];
|
|
$fieldConfig['atts'] = [
|
|
'class' => 'fc_input_control'
|
|
];
|
|
break;
|
|
|
|
case 'date':
|
|
$fieldConfig['type'] = 'custom_date';
|
|
$fieldConfig['atts'] = [
|
|
'type' => 'date',
|
|
'class' => 'fc_date_item fc_input_control',
|
|
'data-format' => 'YYYY-MM-DD',
|
|
'placeholder' => $field['label'],
|
|
'data-template' => 'DD - MM - YYYY'
|
|
];
|
|
break;
|
|
|
|
case 'date_time':
|
|
$fieldConfig['type'] = 'custom_date_time';
|
|
$fieldConfig['atts'] = [
|
|
'type' => 'text',
|
|
'class' => 'fc_date_item fc_input_control',
|
|
'data-format' => 'YYYY-MM-DD HH:mm:ss',
|
|
'placeholder' => $field['label'],
|
|
'data-template' => 'DD - MM - YYYY HH:mm'
|
|
];
|
|
break;
|
|
}
|
|
|
|
return $fieldConfig;
|
|
}
|
|
|
|
/**
|
|
* Check if a string is a valid calendar date in Y-m-d format.
|
|
*
|
|
* @param string $ymd Date string (e.g. 2024-02-31).
|
|
* @return bool
|
|
*/
|
|
private function isValidDate($ymd)
|
|
{
|
|
if (!is_string($ymd) || !preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $ymd, $parts)) {
|
|
return false;
|
|
}
|
|
return checkdate((int) $parts[2], (int) $parts[3], (int) $parts[1]);
|
|
}
|
|
|
|
}
|