summaryrefslogtreecommitdiff
path: root/framework/web/widgets/CMaskedTextField.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/web/widgets/CMaskedTextField.php')
-rw-r--r--framework/web/widgets/CMaskedTextField.php113
1 files changed, 113 insertions, 0 deletions
diff --git a/framework/web/widgets/CMaskedTextField.php b/framework/web/widgets/CMaskedTextField.php
new file mode 100644
index 0000000..f7bf40f
--- /dev/null
+++ b/framework/web/widgets/CMaskedTextField.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * CMaskedTextField class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 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>
+ * @version $Id: CMaskedTextField.php 3515 2011-12-28 12:29:24Z mdomba $
+ * @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(is_string($this->completed))
+ {
+ if(strncmp($this->completed,'js:',3))
+ $options['completed']='js:'.$this->completed;
+ else
+ $options['completed']=$this->completed;
+ }
+ return $options;
+ }
+} \ No newline at end of file