BlockEditing
3 days ago
Convert
3 days ago
Duplicate
3 days ago
Management
3 days ago
Timestamps
3 days ago
Tracker
3 days ago
views
3 days ago
CommonMethodSettings.php
3 days ago
FreeShippingCalculator.php
3 days ago
FreeShippingThresholdRuleValidator.php
3 days ago
MethodDescription.php
3 days ago
MethodLogo.php
3 days ago
MethodLogoCheckoutBlocksAssets.php
3 days ago
MethodLogoSettingsField.php
3 days ago
MethodSettings.php
3 days ago
MethodTitle.php
3 days ago
RateCalculator.php
3 days ago
RateCalculatorFactory.php
3 days ago
SettingsDisplayPreparer.php
3 days ago
SettingsProcessor.php
3 days ago
SingleMethodSettings.php
3 days ago
SettingsProcessor.php
266 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Class SettingsProcessor |
| 4 | * |
| 5 | * @package WPDesk\FS\TableRate\ShippingMethod |
| 6 | */ |
| 7 | |
| 8 | namespace WPDesk\FS\TableRate\ShippingMethod; |
| 9 | |
| 10 | use Exception; |
| 11 | use WPDesk\FS\TableRate\Rule\Condition\ConditionsFactory; |
| 12 | use WPDesk\FS\TableRate\Rule\Settings\Validator\Conditions; |
| 13 | use WPDesk\FS\TableRate\Rule; |
| 14 | use WPDesk\FS\TableRate\Rule\Cost\RuleAdditionalCostFactory; |
| 15 | use WPDesk\FS\TableRate\Rule\Cost\RuleCostFieldsFactory; |
| 16 | use WPDesk_Flexible_Shipping; |
| 17 | |
| 18 | /** |
| 19 | * Can process Flexible Shipping Method settings. |
| 20 | */ |
| 21 | class SettingsProcessor { |
| 22 | |
| 23 | /** |
| 24 | * @var string |
| 25 | */ |
| 26 | private $id; |
| 27 | |
| 28 | /** |
| 29 | * @var string |
| 30 | */ |
| 31 | private $instance_id; |
| 32 | |
| 33 | /** |
| 34 | * @var string |
| 35 | */ |
| 36 | private $shipping_methods_option; |
| 37 | |
| 38 | /** |
| 39 | * @var string |
| 40 | */ |
| 41 | private $shipping_method_order_option; |
| 42 | |
| 43 | /** |
| 44 | * Save_Rules constructor. |
| 45 | * |
| 46 | * @param string $id . |
| 47 | * @param string $instance_id . |
| 48 | * @param array $shipping_methods_option . |
| 49 | * @param array $shipping_method_order_option . |
| 50 | */ |
| 51 | public function __construct( $id, $instance_id, $shipping_methods_option, $shipping_method_order_option ) { |
| 52 | $this->id = $id; |
| 53 | $this->instance_id = $instance_id; |
| 54 | $this->shipping_methods_option = $shipping_methods_option; |
| 55 | $this->shipping_method_order_option = $shipping_method_order_option; |
| 56 | } |
| 57 | |
| 58 | /** |
| 59 | * @param string $action . |
| 60 | * @param array $posted_data . |
| 61 | * |
| 62 | * @return array |
| 63 | * |
| 64 | * @throws Exception . |
| 65 | */ |
| 66 | public function process_and_save_settings( $action, $posted_data ) { |
| 67 | $shipping_method_settings = $this->save_settings( $action, $posted_data ); |
| 68 | $this->add_method_creation_date(); |
| 69 | |
| 70 | return $shipping_method_settings; |
| 71 | } |
| 72 | |
| 73 | /** |
| 74 | * @param string $action . |
| 75 | * @param array $shipping_methods . |
| 76 | * @param array $posted_data . |
| 77 | * |
| 78 | * @return string |
| 79 | */ |
| 80 | private function get_method_id( $action, $shipping_methods, $posted_data ) { |
| 81 | if ( 'new' === $action ) { |
| 82 | $method_id = get_option( 'flexible_shipping_method_id', 0 ); |
| 83 | |
| 84 | foreach ( $shipping_methods as $shipping_method ) { |
| 85 | if ( intval( $shipping_method['id'] ) > $method_id ) { |
| 86 | $method_id = intval( $shipping_method['id'] ); |
| 87 | } |
| 88 | } |
| 89 | ++$method_id; |
| 90 | |
| 91 | return $method_id; |
| 92 | } |
| 93 | |
| 94 | return sanitize_text_field( wp_unslash( $posted_data['method_id'] ) ); |
| 95 | } |
| 96 | |
| 97 | /** |
| 98 | * @param string $action . |
| 99 | * @param array $posted_data . |
| 100 | * |
| 101 | * @return array |
| 102 | */ |
| 103 | private function save_settings( $action, $posted_data ) { |
| 104 | $shipping_method = []; |
| 105 | $shipping_methods = get_option( $this->shipping_methods_option, [] ); |
| 106 | |
| 107 | $method_id = $this->get_method_id( $action, $shipping_methods, $posted_data ); |
| 108 | |
| 109 | if ( 'new' === $action ) { |
| 110 | $method_id_for_shipping = $this->id . '_' . $this->instance_id . '_' . $method_id; |
| 111 | } else { |
| 112 | $method_id_for_shipping = sanitize_text_field( wp_unslash( $posted_data['method_id_for_shipping'] ) ); |
| 113 | $shipping_method = isset( $shipping_methods[ $method_id ] ) ? $shipping_methods[ $method_id ] : []; |
| 114 | } |
| 115 | |
| 116 | $shipping_method = $this->update_shipping_methods( $method_id, $method_id_for_shipping, $shipping_method, $shipping_methods, $posted_data ); |
| 117 | $this->update_rates( $shipping_methods ); |
| 118 | |
| 119 | if ( 'new' === $action ) { |
| 120 | $shipping_method_order = get_option( $this->shipping_method_order_option, [] ); |
| 121 | |
| 122 | $shipping_method_order[ $method_id ] = $method_id; |
| 123 | |
| 124 | update_option( $this->shipping_method_order_option, $shipping_method_order ); |
| 125 | update_option( 'flexible_shipping_method_id', $method_id ); |
| 126 | } |
| 127 | |
| 128 | return $shipping_method; |
| 129 | } |
| 130 | |
| 131 | /** |
| 132 | * @param string $method_id . |
| 133 | * @param string $method_id_for_shipping . |
| 134 | * @param array $shipping_method . |
| 135 | * @param array $shipping_methods . |
| 136 | * @param array $posted_data . |
| 137 | * |
| 138 | * @return array |
| 139 | */ |
| 140 | private function update_shipping_methods( $method_id, $method_id_for_shipping, $shipping_method, $shipping_methods, $posted_data ) { |
| 141 | // Prepare fields for settings. |
| 142 | $shipping_method_settings = $this->prepare_shipping_method_settings( $method_id, $method_id_for_shipping, $posted_data ); |
| 143 | |
| 144 | // Add shipping method to list. |
| 145 | $shipping_methods[ $method_id ] = array_merge( $shipping_method, $shipping_method_settings ); |
| 146 | |
| 147 | // Save shipping methods. |
| 148 | update_option( $this->shipping_methods_option, $shipping_methods ); |
| 149 | |
| 150 | return $shipping_method_settings; |
| 151 | } |
| 152 | |
| 153 | /** |
| 154 | * Add method creation date. |
| 155 | */ |
| 156 | private function add_method_creation_date() { |
| 157 | if ( ! get_option( 'flexible_shipping_method_creation_date' ) ) { |
| 158 | add_option( 'flexible_shipping_method_creation_date', current_time( 'mysql' ) ); |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | /** |
| 163 | * @param array $shipping_methods . |
| 164 | */ |
| 165 | private function update_rates( $shipping_methods ) { |
| 166 | $rates = []; |
| 167 | |
| 168 | foreach ( $shipping_methods as $shipping_method ) { |
| 169 | $id = sprintf( '%s_%s_%s', $this->id, $this->instance_id, sanitize_title( $shipping_method['method_title'] ) ); |
| 170 | |
| 171 | $id = apply_filters( 'flexible_shipping_method_rate_id', $id, $shipping_method ); |
| 172 | |
| 173 | if ( ! isset( $rates[ $id ] ) && 'yes' === $shipping_method['method_enabled'] ) { |
| 174 | $rates[ $id ] = [ |
| 175 | 'identifier' => $id, |
| 176 | 'title' => $shipping_method['method_title'], |
| 177 | ]; |
| 178 | } |
| 179 | } |
| 180 | update_option( 'flexible_shipping_rates', $rates ); |
| 181 | } |
| 182 | |
| 183 | |
| 184 | /** |
| 185 | * @param int $method_id . |
| 186 | * @param int $method_id_for_shipping . |
| 187 | * @param array $posted_data . |
| 188 | * |
| 189 | * @return array |
| 190 | */ |
| 191 | private function prepare_shipping_method_settings( $method_id, $method_id_for_shipping, $posted_data ) { |
| 192 | |
| 193 | $shipping_method = [ |
| 194 | 'woocommerce_method_instance_id' => $this->instance_id, |
| 195 | 'id' => $method_id, |
| 196 | 'id_for_shipping' => $method_id_for_shipping, |
| 197 | 'method_title' => sanitize_text_field( $this->get_field_value( 'method_title', $posted_data ) ), |
| 198 | 'method_description' => sanitize_text_field( $this->get_field_value( 'method_description', $posted_data ) ), |
| 199 | CommonMethodSettings::METHOD_LOGO_ID => absint( $this->get_field_value( CommonMethodSettings::METHOD_LOGO_ID, $posted_data ) ), |
| 200 | ]; |
| 201 | |
| 202 | $shipping_method[ WPDesk_Flexible_Shipping::FIELD_METHOD_FREE_SHIPPING ] = ''; |
| 203 | |
| 204 | $method_free_shipping = $this->get_field_value( 'method_free_shipping', $posted_data ); |
| 205 | if ( ! empty( $method_free_shipping ) ) { |
| 206 | $shipping_method[ WPDesk_Flexible_Shipping::FIELD_METHOD_FREE_SHIPPING ] = wc_format_decimal( sanitize_text_field( $method_free_shipping ) ); |
| 207 | } |
| 208 | |
| 209 | $method_integration = $this->get_field_value( 'method_integration', $posted_data ); |
| 210 | $shipping_method['method_integration'] = sanitize_text_field( $method_integration ); |
| 211 | |
| 212 | $shipping_method['method_free_shipping_label'] = sanitize_text_field( $this->get_field_value( 'method_free_shipping_label', $posted_data ) ); |
| 213 | $shipping_method['method_calculation_method'] = sanitize_text_field( $this->get_field_value( 'method_calculation_method', $posted_data ) ); |
| 214 | $shipping_method[ WPDesk_Flexible_Shipping::SETTING_METHOD_FREE_SHIPPING_NOTICE ] = $this->get_value_of_yes_no( WPDesk_Flexible_Shipping::SETTING_METHOD_FREE_SHIPPING_NOTICE, $posted_data ); |
| 215 | |
| 216 | $shipping_method['method_default'] = $this->get_value_of_yes_no( 'method_default', $posted_data ); |
| 217 | $shipping_method['method_visibility'] = $this->get_value_of_yes_no( 'method_visibility', $posted_data ); |
| 218 | $shipping_method['method_debug_mode'] = $this->get_value_of_yes_no( 'method_debug_mode', $posted_data ); |
| 219 | $shipping_method['method_enabled'] = $this->get_value_of_yes_no( 'method_enabled', $posted_data ); |
| 220 | |
| 221 | $shipping_method[ WPDesk_Flexible_Shipping::SETTING_METHOD_RULES ] = $this->get_normalized_rules( |
| 222 | isset( $posted_data[ WPDesk_Flexible_Shipping::SETTING_METHOD_RULES ] ) ? $posted_data[ WPDesk_Flexible_Shipping::SETTING_METHOD_RULES ] : [] |
| 223 | ); |
| 224 | |
| 225 | return apply_filters( 'flexible_shipping_process_admin_options', $shipping_method ); |
| 226 | } |
| 227 | |
| 228 | /** |
| 229 | * @param array $posted_rules_settings . |
| 230 | * |
| 231 | * @return array |
| 232 | */ |
| 233 | private function get_normalized_rules( $posted_rules_settings ) { |
| 234 | $rules_settings_processor = new Rule\Settings\SettingsProcessor( |
| 235 | $posted_rules_settings, |
| 236 | ( new ConditionsFactory() )->get_conditions(), |
| 237 | ( new RuleCostFieldsFactory() )->get_fields(), |
| 238 | ( new Rule\Cost\RuleAdditionalCostFieldsFactory( ( new RuleAdditionalCostFactory() )->get_additional_costs() ) )->get_fields(), |
| 239 | ( new Rule\SpecialAction\SpecialActionFieldsFactory( ( new Rule\SpecialAction\SpecialActionFactory() )->get_special_actions() ) )->get_fields() |
| 240 | ); |
| 241 | return $rules_settings_processor->prepare_settings(); |
| 242 | } |
| 243 | |
| 244 | /** |
| 245 | * @param string $name . |
| 246 | * @param array $posted_data . |
| 247 | * |
| 248 | * @return mixed |
| 249 | */ |
| 250 | private function get_field_value( $name, $posted_data ) { |
| 251 | $key = sprintf( 'woocommerce_%s_%s', $this->id, $name ); |
| 252 | |
| 253 | return isset( $posted_data[ $key ] ) ? wp_unslash( $posted_data[ $key ] ) : null; |
| 254 | } |
| 255 | |
| 256 | /** |
| 257 | * @param string $name . |
| 258 | * @param array $posted_data . |
| 259 | * |
| 260 | * @return string |
| 261 | */ |
| 262 | private function get_value_of_yes_no( $name, $posted_data ) { |
| 263 | return filter_var( $this->get_field_value( $name, $posted_data ), FILTER_VALIDATE_BOOLEAN ) ? 'yes' : 'no'; |
| 264 | } |
| 265 | } |
| 266 |