Yii2: отобразить маску телефона как текст - PullRequest
0 голосов
/ 14 мая 2018

Подскажите, как сделать вывод на телефон читабельным?

Он хранится в базе данных как 1234567890, но вам нужно отобразить пользователя - (123) 456-78-90.

Я не хочу делать сад, конечно, уже есть готовые решения.

В контроллере

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

In View show-phone.php

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

1 Ответ

0 голосов
/ 14 мая 2018

Форматирование телефонных номеров в формах

Если вы хотите отформатировать номер телефона внутри 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>
    
...