Yii2:将 phone 掩码显示为文本

Yii2 : Display the phone mask as text

告诉我如何以可读的方式制作 phone 输出?

它在数据库中存储为 1234567890,但您需要显示用户 - (123) 456-78-90

我不想做花园,显然,通常已经有现成的解决方案。

在控制器中

public function actionShowPhone()
{
 $phone = "1234567890";
 return $this->render('show-phone', ['phone' => $phone,]);
}

在视图中显示-phone.php

<?= Html::encode($phone) ?>

格式化 phone 表单中的数字

如果您希望在 ActiveForm 中格式化 phone 数字,您可以按以下方式使用 \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().

将 Phone 数字格式化为文本

  • Extending the \yii\i18n\Formatter

    但是如果你想以上述格式将 phone 数字打印为文本,那么一个好方法是扩展 yii\i18n\Formatter 并创建自定义 component/helper 让我们说 common\components\app\components\ 使用以下代码。

    注意:相应地为 class 更改 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})$/", "()---", $value);
        }
    
    }
    

    然后在 common\config\main.phpapp\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>