#session #cakephp #model #authentication
#сеанс #cakephp #Модель #аутентификация
Вопрос:
Возникли проблемы с поиском четкого ответа на, казалось бы, простой вопрос.
Я извлекаю даты из базы данных с помощью find (). У меня есть смещение часового пояса пользователя (-5, -6 и т.д.) В переменных сеанса (предоставленных аутентификацией). Я хочу использовать обратный вызов afterFind () для обновления времени в соответствии с часовым поясом пользователя перед отображением, а затем обратный вызов beforeSave () для настройки обратно на GMT при повторном сохранении.
Как мне получить доступ к переменным аутентификации внутри функции afterFind в модели?
Спасибо!
Ответ №1:
Поскольку Auth-компонент является расширением контроллера, не существует «естественного» способа включить это в вашу модель.
Вы могли бы сделать App::import('Controller', 'Users')
или где бы вы это ни делали.
Вы можете увидеть, как вы можете использовать эту функцию здесь: Используя App::import
Но я действительно думаю, что, поскольку это всего лишь вопрос отображения некоторой информации, помощник был бы лучшим решением для вашей проблемы (для обслуживания «V» в MVC).
Вы могли бы написать помощник, который берет вашу дату (я думаю, вы используете либо DATE
либо DATETIME
в своей базе данных) и преобразует ее в правильный часовой пояс.
function convert_timezone($time)
$timezone = $this->Session->read('Auth.timezone');
date_default_timezone_set($timezone); //set the correct timezone which we read from the Session
return gmdate("M d Y H:i:s", strtotime($time)); //using strtotime to convert the time from the database to a timestamp
}
Пожалуйста, взгляните на эти информационные ссылки о том, как написать свой собственный помощник, функцию gmdate и помощник сеанса из CakePHP.
Комментарии:
1. Да, после экспериментов с этими вещами кажется, что использование afterFind и beforeSave — не лучший способ сделать это. Я пытаюсь манипулировать слишком большим количеством данных, и мне приходится использовать App:: import () повсюду и сеять хаос в MVC. В итоге я создал компонент, который будет манипулировать данными в контроллерах, прежде чем отправлять их в представление. Спасибо!