114 lines
3.4 KiB
PHP
114 lines
3.4 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* CMaskedTextField class file.
|
||
|
*
|
||
|
* @author Qiang Xue <qiang.xue@gmail.com>
|
||
|
* @link http://www.yiiframework.com/
|
||
|
* @copyright 2008-2013 Yii Software LLC
|
||
|
* @license http://www.yiiframework.com/license/
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* CMaskedTextField generates a masked text field.
|
||
|
*
|
||
|
* CMaskedTextField is similar to {@link CHtml::textField} except that
|
||
|
* an input mask will be used to help users enter properly formatted data.
|
||
|
* The masked text field is implemented based on the jQuery masked input plugin
|
||
|
* (see {@link http://digitalbush.com/projects/masked-input-plugin}).
|
||
|
*
|
||
|
* @author Qiang Xue <qiang.xue@gmail.com>
|
||
|
* @package system.web.widgets
|
||
|
* @since 1.0
|
||
|
*/
|
||
|
class CMaskedTextField extends CInputWidget
|
||
|
{
|
||
|
/**
|
||
|
* @var string the input mask (e.g. '99/99/9999' for date input). The following characters are predefined:
|
||
|
* <ul>
|
||
|
* <li>a: represents an alpha character (A-Z,a-z).</li>
|
||
|
* <li>9: represents a numeric character (0-9).</li>
|
||
|
* <li>*: represents an alphanumeric character (A-Z,a-z,0-9).</li>
|
||
|
* <li>?: anything listed after '?' within the mask is considered optional user input.</li>
|
||
|
* </ul>
|
||
|
* Additional characters can be defined by specifying the {@link 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 {@link 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;
|
||
|
|
||
|
/**
|
||
|
* Executes the widget.
|
||
|
* This method registers all needed client scripts and renders
|
||
|
* the text field.
|
||
|
*/
|
||
|
public function run()
|
||
|
{
|
||
|
if($this->mask=='')
|
||
|
throw new CException(Yii::t('yii','Property CMaskedTextField.mask cannot be empty.'));
|
||
|
|
||
|
list($name,$id)=$this->resolveNameID();
|
||
|
if(isset($this->htmlOptions['id']))
|
||
|
$id=$this->htmlOptions['id'];
|
||
|
else
|
||
|
$this->htmlOptions['id']=$id;
|
||
|
if(isset($this->htmlOptions['name']))
|
||
|
$name=$this->htmlOptions['name'];
|
||
|
|
||
|
$this->registerClientScript();
|
||
|
|
||
|
if($this->hasModel())
|
||
|
echo CHtml::activeTextField($this->model,$this->attribute,$this->htmlOptions);
|
||
|
else
|
||
|
echo CHtml::textField($name,$this->value,$this->htmlOptions);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Registers the needed CSS and JavaScript.
|
||
|
*/
|
||
|
public function registerClientScript()
|
||
|
{
|
||
|
$id=$this->htmlOptions['id'];
|
||
|
$miOptions=$this->getClientOptions();
|
||
|
$options=$miOptions!==array() ? ','.CJavaScript::encode($miOptions) : '';
|
||
|
$js='';
|
||
|
if(is_array($this->charMap))
|
||
|
$js.='jQuery.mask.definitions='.CJavaScript::encode($this->charMap).";\n";
|
||
|
$js.="jQuery(\"#{$id}\").mask(\"{$this->mask}\"{$options});";
|
||
|
|
||
|
$cs=Yii::app()->getClientScript();
|
||
|
$cs->registerCoreScript('maskedinput');
|
||
|
$cs->registerScript('Yii.CMaskedTextField#'.$id,$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 CJavaScriptExpression)
|
||
|
$options['completed']=$this->completed;
|
||
|
else
|
||
|
$options['completed']=new CJavaScriptExpression($this->completed);
|
||
|
}
|
||
|
|
||
|
return $options;
|
||
|
}
|
||
|
}
|