/** * Creates an array mapping from checkout item id to the item name in the field. array is * localized into the user javascript so that the javascript can find items using the well known names. * * In release 3.8.14 the unique key for a field is available in an element attribute * called 'data-wpsc-meta-key'. Just in case someone out there has a highly customized * checkout experience that doesn't use the WPeC core functions to create the controls * using this map will maintain backwards compatibility. * * @access public * * @since 3.8.14 * @return (boolean) */ function _wpsc_create_checkout_unique_name_to_form_id_map() { global $wpsc_checkout; if (empty($wpsc_checkout)) { $wpsc_checkout = new wpsc_checkout(); } else { $wpsc_checkout->rewind_checkout_items(); } $checkout_item_map = array(); while (wpsc_have_checkout_items()) { $checkout_item = wpsc_the_checkout_item(); if (!empty($checkout_item->unique_name)) { $checkout_item_map[$wpsc_checkout->form_item_unique_name()] = $wpsc_checkout->form_element_id(); } } $wpsc_checkout->rewind_checkout_items(); return $checkout_item_map; }
/** * get the output used to show a shipping state and region select drop down * * @since 3.8.14 * * @param wpsc_checkout|null $wpsc_checkout checkout object * @return string */ function wpsc_checkout_shipping_state_and_region($wpsc_checkout = null) { // just in case the checkout form was not presented, like when we are doing the shipping calculator if (empty($wpsc_checkout)) { $wpsc_checkout = new wpsc_checkout(); $doing_checkout_form = false; } else { $doing_checkout_form = true; } // if we aren't showing the shipping state on the cor we have no work to do if (!$wpsc_checkout->get_checkout_item('shippingstate')) { return ''; } // save the current checkout item in case we adjust it in the routine, we'll put it back before return $saved_checkout_item = $wpsc_checkout->checkout_item; // check a new checkout form with all fields $checkout_form = new WPSC_Checkout_Form(null, false); // is the shipping country visible on the form, let's find out $shipping_country_form_element = $checkout_form->get_field_by_unique_name('shippingcountry'); $showing_shipping_country = (bool) $shipping_country_form_element->active; // make sure the shipping state is the current checkout element $wpsc_checkout->checkout_item = $wpsc_checkout->get_checkout_item('shippingstate'); // setup the edit field, aka 'shippingstate' $shipping_country = wpsc_get_customer_meta('shippingcountry'); $shipping_region = wpsc_get_customer_meta('shippingregion'); $shipping_state = wpsc_get_customer_meta('shippingstate'); // if we are showing the billing country on the form then we use the value that can be // changed by the user, otherwise we will use the base country as configured in store admin if ($showing_shipping_country) { $wpsc_country = new WPSC_Country($shipping_country); } else { $wpsc_country = new WPSC_Country(wpsc_get_base_country()); } $region_list = $wpsc_country->get_regions(); $placeholder = $wpsc_country->get('region_label'); if (empty($placeholder)) { $placeholder = $wpsc_checkout->checkout_item->name; } $placeholder = apply_filters('wpsc_checkout_field_placeholder', apply_filters('wpsc_checkout_field_name', $placeholder), $wpsc_checkout->checkout_item); $form_element_id = $wpsc_checkout->form_element_id(); if ($doing_checkout_form) { $id_attribute = ' id="' . $form_element_id . '" '; } else { $id_attribute = ''; } // if there are regions for the current country we are going to // create the billing state edit, but hide it $style = ' '; if (!empty($region_list)) { $style = 'style="display: none;"'; } $output = '<input class="shipping_region text wpsc-visitor-meta" ' . ' data-wpsc-meta-key="' . $wpsc_checkout->checkout_item->unique_name . '" ' . ' title="' . $wpsc_checkout->checkout_item->unique_name . '" ' . ' type="text" ' . $id_attribute . ' placeholder="' . esc_attr($placeholder) . '" ' . ' value="' . esc_attr($shipping_state) . '" ' . ' name="collected_data[' . $wpsc_checkout->checkout_item->id . ']" ' . $style . ' />' . "\n\r"; // setup the drop down field, aka 'shippingregion' // move the checkout item pointer to the billing country, so we can generate form element ids, highly lame $wpsc_checkout->checkout_item = $checkout_form->get_field_by_unique_name('shippingcountry'); // if there aren't any regions for the current country we are going to // create the empty region select, but hide it $style = ' '; if (empty($region_list)) { $style = 'style="display: none;"'; } $title = 'shippingregion'; $region_form_id = $wpsc_checkout->form_element_id() . '_region'; $output .= '<select id="' . $region_form_id . '" ' . ' class="current_region wpsc-visitor-meta wpsc-region-dropdown" ' . ' data-wpsc-meta-key="shippingregion" ' . ' title="' . $title . '" ' . 'name="collected_data[' . $wpsc_checkout->checkout_item->id . '][1]" ' . $style . ">\n\r"; $wpsc_current_region = $wpsc_country->get_region($shipping_region); if (!empty($region_list)) { if (count($region_list) > 1) { $label = $wpsc_country->get('region_label'); $please_select_message = sprintf(__('Please select a %s', 'wp-e-commerce'), $label); $output .= "<option value='0'>" . $please_select_message . "</option>\n\r"; } foreach ($region_list as $wpsc_region) { if ((bool) $wpsc_current_region && $wpsc_current_region->get_id() == $wpsc_region->get_id()) { $selected = "selected='selected'"; } else { $selected = ''; } $output .= "<option value='" . $wpsc_region->get_id() . "' {$selected}>" . esc_html($wpsc_region->get_name()) . "</option>\n\r"; } } $output .= "</select>\n\r"; // restore the checkout item in case we messed with it $wpsc_checkout->checkout_item = $saved_checkout_item; return $output; }