PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.2.15
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.2.15
6.2.15 6.2.14 6.2.13 6.2.12 6.2.10 6.2.11 6.2.9 6.2.8 6.2.7 6.2.6 6.2.5 6.2.4 6.2.3 6.2.2 3.6.22 3.6.31 3.6.40 3.6.41 3.6.42 3.6.50 3.6.51 3.6.60 3.6.61 3.6.62 3.6.64 All 197 releases
← All changes | app/Services/FormBuilder/Components/Address.php +154 -31 3.6.31 → 6.2.15 View file →
@@ -1,65 +1,188 @@
1 1 <?php
2 2
3 3 namespace FluentForm\App\Services\FormBuilder\Components;
4 4
5 +use FluentForm\App\Helpers\Helper;
6 +use FluentForm\App\Services\FormBuilder\AutocompleteTokens;
7 +use FluentForm\Framework\Helpers\ArrayHelper;
8 +
5 9 class Address extends BaseComponent
6 10 {
7 11 /**
8 12 * Wrapper class for address element
13 + *
9 14 * @var string
10 15 */
11 - protected $wrapperClass = 'fluent-address';
16 + protected $wrapperClass = 'fluent-address';
12 17
13 18 /**
14 19 * Compile and echo the html element
15 - * @param array $data [element data]
16 - * @param stdClass $form [Form Object]
17 - * @return viod
20 + *
21 + * @param array $data [element data]
22 + * @param \stdClass $form [Form Object]
23 + *
24 + * @return void
18 25 */
19 - public function compile($data, $form)
20 - {
26 + public function compile($data, $form)
27 + {
21 28 $elementName = $data['element'];
22 - $data = apply_filters('fluenform_rendering_field_data_'.$elementName, $data, $form);
29 + $data = apply_filters('fluentform/rendering_field_data_' . $elementName, $data, $form);
23 30
24 31 $rootName = $data['attributes']['name'];
25 - $hasConditions = $this->hasConditions($data) ? 'has-conditions ' : '';
26 - $data['attributes']['class'] .= ' ff-name-address-wrapper ' . $this->wrapperClass . ' ' . $hasConditions;
27 - $data['attributes']['class'] = trim($data['attributes']['class']);
28 - $atts = $this->buildAttributes(
29 - \FluentForm\Framework\Helpers\ArrayHelper::except($data['attributes'], 'name')
32 + $hasConditions = $this->hasConditions($data) ? 'has-conditions ' : '';
33 + $data['attributes']['class'] = trim(
34 + ArrayHelper::get($data, 'attributes.class', '')
35 + . ' ff-name-address-wrapper ' . $this->wrapperClass . ' ' . $hasConditions
30 36 );
31 - ob_start();
32 - echo "<div {$atts}>";
33 - if($data['settings']['label']):
34 - echo "<div class='ff-el-input--label'>";
35 - echo "<label>{$data['settings']['label']}</label>";
36 - echo "</div>";
37 - endif;
38 - echo "<div class='ff-el-input--content'>";
39 37
40 - $visibleFields = array_chunk(array_filter($data['fields'], function($field) {
38 + $provider = ArrayHelper::get($data, 'settings.autocomplete_provider');
39 + $legacyGoogleEnable = ArrayHelper::get($data, 'settings.enable_g_autocomplete', 'no') === 'yes';
40 + $isLegacyProvider = !ArrayHelper::has($data, 'settings.autocomplete_provider');
41 + // Render coordinate fields if Pro is active and coordinate saving is enabled
42 + if (Helper::hasPro() && 'yes' == ArrayHelper::get($data, 'settings.save_coordinates')) {
43 + $coordinateFields = [
44 + 'latitude' => $rootName . '[latitude]',
45 + 'longitude' => $rootName . '[longitude]'
46 + ];
47 +
48 + $textComponent = new \FluentForm\App\Services\FormBuilder\Components\Text();
49 +
50 + foreach ($coordinateFields as $type => $fieldName) {
51 + $fieldConfig = [
52 + 'attributes' => [
53 + 'name' => $fieldName,
54 + 'type' => 'hidden',
55 + 'data-key_name' => $type,
56 + ],
57 + 'element' => 'input_hidden'
58 + ];
59 +
60 + $textComponent->compile($fieldConfig, $form);
61 + }
62 + }
63 +
64 + if ($provider === 'google' || ($isLegacyProvider && $legacyGoogleEnable)) {
65 + $data['attributes']['class'] .= ' ff_map_autocomplete';
66 + $data['attributes']['data-ff_with_g_map'] = ArrayHelper::get($data, 'settings.enable_g_map', 'no') === 'yes' ? '1' : '';
67 + $data['attributes']['data-ff_with_auto_locate'] = ArrayHelper::get($data, 'settings.enable_auto_locate', false);
68 + do_action('fluentform/address_map_autocomplete', $data, $form);
69 + } elseif ($provider === 'html5') {
70 + $data['attributes']['class'] .= ' ff_html5_geolocate';
71 + $data['attributes']['data-ff_html5_locate'] = ArrayHelper::get($data, 'settings.enable_auto_locate', 'on_click');
72 + $data['attributes']['data-name'] = $data['attributes']['name'];
73 + do_action('fluentform/address_map_autocomplete', $data, $form);
74 + }
75 +
76 + // autocomplete belongs to the sub-fields, not to this wrapper <div>.
77 + $atts = $this->buildAttributes(
78 + ArrayHelper::except($data['attributes'], ['name', 'autocomplete'])
79 + );
80 +
81 + //re order fields from version 4.3.2
82 + if ($order = ArrayHelper::get($data, 'settings.field_order')) {
83 + $order = array_values(array_column($order, 'value'));
84 + $fields = ArrayHelper::get($data, 'fields');
85 + $data['fields'] = array_merge(array_flip($order), $fields);
86 + }
87 + ob_start();
88 + echo '<div ' . $atts . '>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- $atts is escaped before being passed in.
89 + do_action_deprecated(
90 + 'fluentform_rendering_address_field',
91 + [
92 + $data,
93 + $form
94 + ],
95 + FLUENTFORM_FRAMEWORK_UPGRADE,
96 + 'fluentform/rendering_address_field',
97 + 'Use fluentform/rendering_address_field instead of fluentform_rendering_address_field.'
98 + );
99 + do_action('fluentform/rendering_address_field', $data, $form);
100 + if ($label = $data['settings']['label']):
101 + echo "<div class='ff-el-input--label'>";
102 + echo '<label aria-label="'.esc_attr($this->removeShortcode($label)).'">' . fluentform_sanitize_html($data['settings']['label']) . '</label>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- fluentform_sanitize_html escaped
103 + echo '</div>';
104 + endif;
105 + echo "<div class='ff-el-input--content'>";
106 +
107 + $visibleFields = array_chunk(array_filter($data['fields'], function ($field) {
41 108 return $field['settings']['visible'];
42 109 }), 2);
110 +
43 111
112 + $googleAutoComplete = 'yes' === ArrayHelper::get($data, 'settings.enable_g_autocomplete');
44 113 foreach ($visibleFields as $chunked) {
45 114 echo "<div class='ff-t-container'>";
46 115 foreach ($chunked as $item) {
47 - if($item['settings']['visible']) {
116 + if ($item['settings']['visible']) {
48 117 $itemName = $item['attributes']['name'];
49 - $item['attributes']['name'] = $rootName.'['.$itemName.']';
50 - $item = apply_filters('fluentform_before_render_item', $item, $form);
118 + $item['attributes']['data-key_name'] = $itemName;
119 + $item['attributes']['name'] = $rootName . '[' . $itemName . ']';
120 +
121 + $item['attributes']['autocomplete'] = AutocompleteTokens::forSubField(
122 + $itemName,
123 + ArrayHelper::get($data, 'attributes.autocomplete'),
124 + ArrayHelper::get($item, 'attributes.autocomplete')
125 + );
126 +
127 + if ('select_country' === $item['element'] && $googleAutoComplete) {
128 + $selectedCountries = (array) ArrayHelper::get($item, 'attributes.value', []);
129 + if ('visible_list' === ArrayHelper::get($item, 'settings.country_list.active_list')) {
130 + $selectedCountries = array_unique(
131 + array_merge(
132 + $selectedCountries,
133 + ArrayHelper::get($item, 'settings.country_list.visible_list', [])
134 + )
135 + );
136 + }
137 + $item['attributes']['data-autocomplete_restrictions'] = json_encode(array_filter($selectedCountries));
138 + }
139 +
140 + $item = apply_filters_deprecated(
141 + 'fluentform_before_render_item',
142 + [
143 + $item,
144 + $form
145 + ],
146 + FLUENTFORM_FRAMEWORK_UPGRADE,
147 + 'fluentform/before_render_item',
148 + 'Use fluentform/before_render_item instead of fluentform_before_render_item.'
149 + );
150 + $item = apply_filters('fluentform/before_render_item', $item, $form);
51 151 echo "<div class='ff-t-cell'>";
52 - do_action('fluentform_render_item_'.$item['element'], $item, $form);
53 - echo "</div>";
152 + do_action_deprecated(
153 + 'fluentform_render_item_' . $item['element'],
154 + [
155 + $item,
156 + $form
157 + ],
158 + FLUENTFORM_FRAMEWORK_UPGRADE,
159 + 'fluentform/render_item_' . $item['element'],
160 + 'Use fluentform/render_item_' . $item['element'] . ' instead of fluentform_render_item_' . $item['element']
161 + );
162 + do_action('fluentform/render_item_' . $item['element'], $item, $form);
163 + echo '</div>';
54 164 }
55 165 }
56 - echo "</div>";
166 + echo '</div>';
57 167 }
58 168
59 - echo "</div>";
60 - echo "</div>";
169 + echo '</div>';
170 + echo '</div>';
61 171
62 - $html = ob_get_clean();
63 - echo apply_filters('fluenform_rendering_field_html_'.$elementName, $html, $data, $form);
172 + $html = ob_get_clean();
173 +
174 + $html = apply_filters_deprecated(
175 + 'fluentform_rendering_field_html_' . $elementName,
176 + [
177 + $html,
178 + $data,
179 + $form
180 + ],
181 + FLUENTFORM_FRAMEWORK_UPGRADE,
182 + 'fluentform/rendering_field_html_' . $elementName,
183 + 'Use fluentform/rendering_field_html_' . $elementName . ' instead of fluentform/rendering_field_html_' . $elementName
184 + );
185 +
186 + $this->printContent('fluentform/rendering_field_html_' . $elementName, $html, $data, $form);
64 187 }
65 188 }