class-phone.php

Source code

<?php
/**
 * Phone field.
 *
 * @package HivePress\Fields
 */

namespace HivePress\Fields;

use HivePress\Helpers as hp;

// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;

/**
 * Phone number.
 */
class Phone extends Text {

	/**
	 * Country codes.
	 *
	 * @var array
	 */
	protected $countries = [];

	/**
	 * Country code.
	 *
	 * @var string
	 */
	protected $country;

	/**
	 * Class initializer.
	 *
	 * @param array $meta Class meta values.
	 */
	public static function init( $meta = [] ) {
		$meta = hp\merge_arrays(
			[
				'label'       => esc_html__( 'Phone', 'hivepress' ),
				'filterable'  => false,
				'sortable'    => false,
				'prefillable' => false,

				'settings'   => [
					'min_length' => null,
					'max_length' => null,
					'pattern'    => null,

					'countries'  => [
						'label'       => esc_html__( 'Countries', 'hivepress' ),
						'description' => esc_html__( 'Select countries to restrict the available calling codes.', 'hivepress' ),
						'type'        => 'select',
						'options'     => 'countries',
						'multiple'    => true,
						'_order'      => 110,
					],

					'country'    => [
						'label'       => esc_html__( 'Default Country', 'hivepress' ),
						'description' => esc_html__( 'Select the country calling code displayed by default.', 'hivepress' ),
						'type'        => 'select',
						'options'     => 'countries',
						'_order'      => 120,
					],
				],
			],
			$meta
		);

		parent::init( $meta );
	}

	/**
	 * Class constructor.
	 *
	 * @param array $args Field arguments.
	 */
	public function __construct( $args = [] ) {
		$args = hp\merge_arrays(
			$args,
			[
				'display_type' => 'tel',
				'pattern'      => '\+?[0-9\-\s]+',
				'max_length'   => 24,
			]
		);

		parent::__construct( $args );
	}

	/**
	 * Bootstraps field properties.
	 */
	protected function boot() {
		$attributes = [];

		// Set countries.
		if ( $this->countries ) {
			$attributes['data-countries'] = wp_json_encode( $this->countries );
		}

		if ( $this->country ) {
			$attributes['data-country'] = $this->country;
		}

		// Set component.
		$attributes['data-component'] = 'phone';

		$this->attributes = hp\merge_arrays( $this->attributes, $attributes );

		parent::boot();
	}

	/**
	 * Sets field display template.
	 *
	 * @param string $display_template Display template.
	 */
	protected function set_display_template( $display_template ) {
		if ( ! hp\has_shortcode( $display_template ) ) {
			$display_template = preg_replace( '/%value%(?![^<>]*>)/', '<span data-component="phone">%value%</span>', $display_template );
		}

		$this->display_template = $display_template;
	}

	/**
	 * Sets field countries.
	 *
	 * @param array $countries Country codes.
	 */
	protected function set_countries( $countries ) {
		if ( $countries ) {

			// Set display template.
			$this->display_template = str_replace( 'data-component', 'data-countries="' . hp\esc_json( wp_json_encode( $countries ) ) . '" data-component', $this->display_template );
		}

		$this->countries = $countries;
	}

	/**
	 * Sanitizes field value.
	 */
	protected function sanitize() {
		parent::sanitize();

		$this->value = preg_replace( '/[^\d+]/', '', $this->value );
		$this->value = preg_replace( '/(?!^)\+/', '', $this->value );
	}
}