Форматирование телефонных номеров в формах
Если вы хотите отформатировать номер телефона внутри ActiveForm
, вы можете использовать \yii\widgets\MaskInput
следующим образом
<?=
$form->field($model, 'landline_phone')->widget(\yii\widgets\MaskedInput::className(), [
'mask' => '(999)-999-99-99'
]);
?>
или без ActiveForm
echo \yii\widgets\MaskedInput::widget([
'name' => 'phone',
'mask' => '(999)-999-99-99',
]);
Примечание: при сохранении поля phone
вы должны сохранить его как число только в базе данных, например 1234567890
, поэтому перед сохранением вы можете использовать $this->landline_phone= preg_replace('/[^0-9]+/', '', $this->landline_phone);
внутри beforeSave()
.
Форматирование телефонных номеров как текста
Extending the \yii\i18n\Formatter
Но если вы хотите напечатать номер телефона в текстовом формате в вышеприведенном формате, тогда хорошим способом будет расширение yii\i18n\Formatter
и создание собственного компонента / помощника в произнесите common\components\
или app\components\
со следующим кодом.
Примечание: соответственно измените namespace
для класса
<?php
namespace common\components;
use yii\i18n\Formatter;
class FormatterHelper extends Formatter {
public function asPhone($value) {
return preg_replace("/^(\d{3})(\d{3})(\d{2})(\d{2})$/", "($1)-$2-$3-$4", $value);
}
}
, а затем в common\config\main.php
или app\config\web.php
добавить следующее в components
.
'formatter' => [
'class' => '\common\components\FormatterHelper',
'locale' => 'en-US',
'dateFormat' => 'yyyy-MM-dd',
'datetimeFormat' => 'yyyy-MM-dd HH:mm:ss',
'decimalSeparator' => '.',
'thousandSeparator' => ',',
'currencyCode' => 'USD'
],
тогда вы можете использовать его, как показано ниже
echo Yii::$app->formatter->asPhone('123456789')
и он выведет следующее в виде текста
(123)-456-78-90
Using \yii\widgets\MaskedInputAssets
Другой самый простой и легкий способ - зарегистрировать доступное MaskedInputAssets
, которое использует RobinHerbots/Inputmask
в комплекте и использовать javascript для маскировки текста
<?php
\yii\widgets\MaskedInputAsset::register($this);
$js = <<<SCRIPT
var selector = document.getElementById("mask");
var im = new Inputmask("(999)-999-99-99");
im.mask(selector);
SCRIPT;
// Register tooltip/popover initialization javascript
$this->registerJs ( $js , \yii\web\View::POS_READY);
?>
<div id="mask">
1234567890
</div>