$attributes Block attributes. * @since 0.0.2 */ public function __construct( $attributes ) { $this->set_properties( $attributes ); $this->set_input_label( __( 'Phone', 'sureforms' ) ); $this->set_error_msg( $attributes, 'srfm_phone_block_required_text' ); $this->set_duplicate_msg( $attributes, 'srfm_phone_block_unique_text' ); $this->slug = 'phone'; $this->auto_country = $attributes['autoCountry'] ?? ''; $this->default_country = $attributes['defaultCountry'] ?? ''; $this->enable_country_filter = $attributes['enableCountryFilter'] ?? false; $this->country_filter_type = $attributes['countryFilterType'] ?? 'include'; $this->include_countries = $attributes['includeCountries'] ?? []; $this->exclude_countries = $attributes['excludeCountries'] ?? []; // When auto country is enabled, resolve a best-effort country here at render // time to seed the baked `default-country` attribute (a sensible flag before // any JS runs). The authoritative per-visitor detection happens client-side: // phone.js applies an immediate network-free Intl guess and then refines it // from the same-origin geo-country REST endpoint — so it stays correct even on // full-page-cached sites, where this baked value would otherwise be the first // visitor's country. // // Why not get_locale()? // WordPress get_locale() returns the *site's* configured language (e.g. 'en_US'), // not the visitor's physical location. A site set to English would show 'US' for // every visitor worldwide — defeating the purpose of auto-country detection. // // Why resolve server-side at all (vs. a browser geo-IP fetch)? // A client-side fetch('https://ipapi.co/json') caused CORS failures, 429 rate // limits on high-traffic sites, and exposed visitor IPs to a third party from the // browser. The server path (CDN header first, then a capped, cached ipapi.co // lookup in Helper::get_geo_country()) avoids all three. if ( $this->auto_country ) { // Pass the configured default as the fallback so a detection failure // degrades to the user's chosen country instead of a hardcoded 'us'. $fallback = ! empty( $this->default_country ) && is_string( $this->default_country ) ? strtolower( $this->default_country ) : 'us'; $this->default_country = Helper::get_geo_country( $fallback ); } $this->set_unique_slug(); $this->set_field_name( $this->unique_slug ); $this->set_markup_properties( $this->input_label, true ); $this->set_aria_described_by(); $this->set_label_as_placeholder( $this->input_label ); } /** * Render the sureforms phone classic styling * * @since 0.0.2 * @return string|bool */ public function markup() { ob_start(); ?>
label_markup ); ?> help_markup ); ?>
aria_described_by ) ? "aria-describedby='" . esc_attr( trim( $this->aria_described_by ) ) . "'" : ''; ?> data-required="data_require_attr ); ?>" aria-required="data_require_attr ); ?>" default-country="default_country ); ?>" auto_country ) { ?> data-auto-country="true" enable_country_filter ) { ?> data-enable-country-filter="true" data-country-filter-type="country_filter_type ); ?>" country_filter_type && ! empty( $this->include_countries ) ) { ?> data-include-countries="include_countries ) ) ); ?>" country_filter_type && ! empty( $this->exclude_countries ) ) { ?> data-exclude-countries="exclude_countries ) ) ); ?>" value="default ); ?>" placeholder_attr ); ?> data-unique="aria_unique ); ?>">
duplicate_msg_markup ); ?>