• Как в Yii2 узнать часовой пояс пользователя?

    @AlexKuznec Автор вопроса
    В общем, на данный момент нашел 2 более-менее готовых решения:

    1) Геолокация по IP.
    Плюсы: реализовано для Yii2, можно узнать страну, регион и город пользователя, что кроме часового пояса дает нам информацию о предполагаемом языке и валюте пользователя. Хотя, браузеры собирают языковые предпочтения пользователя, так что при их наличии лучше использовать их.
    Минусы: сложность системы, не гарантирует верный результат, есть небольшая плата при высоких нагрузках (легко окупится рекламой на сайте).
    https://github.com/marciocamello/yii2-sypexgeo/

    2) Определение часового пояса через JavaScript на стороне клиента.
    Плюсы: просто, бесплатно.
    Минусы: не найдено реализаций для Yii2, работает только при корректных настройках времени у пользователя и актуальной базы данных о часовых поясах (у меня, к примеру, для Барнаула отображаются устаревшие данные).

    Я взял вот эту библиотечку:
    https://github.com/barbushin/dater

    и встроил в Yii2 следующим образом (если предложите вариант получше - буду благодарен):
    в конфигурации:
    'components' => [
    'timezoneDetector' => [
    'class' => 'Dater\TimezoneDetector',
    ]
    ],

    'on ' . yii\base\Application::EVENT_BEFORE_REQUEST => function ($event) {
    $clientTimezone = Yii::$app->timezoneDetector->getClientTimezone(); // часовой пояс пользователя
    if (isset($clientTimezone)) Yii::$app->timeZone = $clientTimezone;
    },

    и в шаблоне layouts/main.php
    < head>
    ...
    <?= Yii::$app->timezoneDetector->getHtmlJsCode() // определение часового пояса пользователя ?>
    ...
    < /head>

    вставка в шаблон приложения дополнительного кода мне не нравится, так как хотел написать поведение для Yii2, но следующий код у меня работать не стал (пробовал на разные события цеплять)
    'on ' . yii\base\Application::EVENT_AFTER_REQUEST => function ($event) {
    Yii::$app->view->registerJs(Yii::$app->timezoneDetector->getHtmlJsCode(), yii\web\View::POS_HEAD);
    }
    Ответ написан
    Комментировать
  • Почему TimestampBehavior в Yii2 выбрасывает ошибку?

    @AlexKuznec
    Я по мануалу добавил в класс модели:

    public function behaviors()
    {
    return [
    TimestampBehavior::className(),
    ];
    }

    всё работает, 'created_at' и 'updated_at' являются полями по умолчанию, их можно не указывать. заполняются текущим временем по UTC также по умолчанию
    Ответ написан