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