You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							137 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							137 lines
						
					
					
						
							3.7 KiB
						
					
					
				| <?php | |
| /** | |
|  * @link http://www.yiiframework.com/ | |
|  * @copyright Copyright (c) 2008 Yii Software LLC | |
|  * @license http://www.yiiframework.com/license/ | |
|  */ | |
|  | |
| namespace yii\widgets; | |
|  | |
| use yii\base\InvalidConfigException; | |
| use yii\helpers\Html; | |
| use yii\helpers\Json; | |
| use yii\web\JsExpression; | |
|  | |
| /** | |
|  * MaskedInput generates a masked text input. | |
|  * | |
|  * MaskedInput is similar to [[Html::textInput()]] except that | |
|  * an input mask will be used to force users to enter properly formatted data, | |
|  * such as phone numbers, social security numbers. | |
|  * | |
|  * To use MaskedInput, you must set the [[mask]] property. The following example | |
|  * shows how to use MaskedInput to collect phone numbers: | |
|  * | |
|  * ~~~ | |
|  * echo MaskedInput::widget(array( | |
|  *     'name' => 'phone', | |
|  *     'mask' => '999-999-9999', | |
|  * )); | |
|  * ~~~ | |
|  * | |
|  * The masked text field is implemented based on the [jQuery masked input plugin](http://digitalbush.com/projects/masked-input-plugin). | |
|  * | |
|  * @author Qiang Xue <qiang.xue@gmail.com> | |
|  * @since 2.0 | |
|  */ | |
| class MaskedInput extends InputWidget | |
| { | |
| 	/** | |
| 	 * @var string the input mask (e.g. '99/99/9999' for date input). The following characters are predefined: | |
| 	 * | |
| 	 * - `a`: represents an alpha character (A-Z,a-z) | |
| 	 * - `9`: represents a numeric character (0-9) | |
| 	 * - `*`: represents an alphanumeric character (A-Z,a-z,0-9) | |
| 	 * - `?`: anything listed after '?' within the mask is considered optional user input | |
| 	 * | |
| 	 * Additional characters can be defined by specifying the [[charMap]] property. | |
| 	 */ | |
| 	public $mask; | |
| 	/** | |
| 	 * @var array the mapping between mask characters and the corresponding patterns. | |
| 	 * For example, `array('~' => '[+-]')` specifies that the '~' character expects '+' or '-' input. | |
| 	 * Defaults to null, meaning using the map as described in [[mask]]. | |
| 	 */ | |
| 	public $charMap; | |
| 	/** | |
| 	 * @var string the character prompting for user input. Defaults to underscore '_'. | |
| 	 */ | |
| 	public $placeholder; | |
| 	/** | |
| 	 * @var string a JavaScript function callback that will be invoked when user finishes the input. | |
| 	 */ | |
| 	public $completed; | |
| 	/** | |
| 	 * @var array the HTML attributes for the input tag. | |
| 	 */ | |
| 	public $options = array(); | |
|  | |
|  | |
| 	/** | |
| 	 * Initializes the widget. | |
| 	 * @throws InvalidConfigException if the "mask" property is not set. | |
| 	 */ | |
| 	public function init() | |
| 	{ | |
| 		parent::init(); | |
| 		if (empty($this->mask)) { | |
| 			throw new InvalidConfigException('The "mask" property must be set.'); | |
| 		} | |
|  | |
| 		if (!isset($this->options['id'])) { | |
| 			$this->options['id'] = $this->hasModel() ? Html::getInputId($this->model, $this->attribute) : $this->getId(); | |
| 		} | |
| 	} | |
|  | |
| 	/** | |
| 	 * Runs the widget. | |
| 	 */ | |
| 	public function run() | |
| 	{ | |
| 		if ($this->hasModel()) { | |
| 			echo Html::activeTextInput($this->model, $this->attribute, $this->options); | |
| 		} else { | |
| 			echo Html::textInput($this->name, $this->value, $this->options); | |
| 		} | |
| 		$this->registerClientScript(); | |
| 	} | |
|  | |
| 	/** | |
| 	 * Registers the needed JavaScript. | |
| 	 */ | |
| 	public function registerClientScript() | |
| 	{ | |
| 		$options = $this->getClientOptions(); | |
| 		$options = empty($options) ? '' : ',' . Json::encode($options); | |
| 		$js = ''; | |
| 		if (is_array($this->charMap) && !empty($this->charMap)) { | |
| 			$js .= 'jQuery.mask.definitions=' . Json::encode($this->charMap) . ";\n"; | |
| 		} | |
| 		$id = $this->options['id']; | |
| 		$js .= "jQuery(\"#{$id}\").mask(\"{$this->mask}\"{$options});"; | |
| 		$view = $this->getView(); | |
| 		MaskedInputAsset::register($view); | |
| 		$view->registerJs($js); | |
| 	} | |
|  | |
| 	/** | |
| 	 * @return array the options for the text field | |
| 	 */ | |
| 	protected function getClientOptions() | |
| 	{ | |
| 		$options = array(); | |
| 		if ($this->placeholder !== null) { | |
| 			$options['placeholder'] = $this->placeholder; | |
| 		} | |
|  | |
| 		if ($this->completed !== null) { | |
| 			if ($this->completed instanceof JsExpression) { | |
| 				$options['completed'] = $this->completed; | |
| 			} else { | |
| 				$options['completed'] = new JsExpression($this->completed); | |
| 			} | |
| 		} | |
|  | |
| 		return $options; | |
| 	} | |
| }
 | |
| 
 |