PageRenderTime 64ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/protected/modules/users/models/User.php

https://bitbucket.org/graaaf/erso
PHP | 406 lines | 337 code | 69 blank | 0 comment | 5 complexity | 8ead4e2fbf1af19636d418c77e7d88c5 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-3.0, LGPL-2.1, BSD-3-Clause, BSD-2-Clause
  1. <?php
  2. class User extends ActiveRecordModel
  3. {
  4. const PAGE_SIZE = 10;
  5. const NEW_PASSWORD_LENGTH = 10;
  6. const STATUS_ACTIVE = 'active';
  7. const STATUS_NEW = 'new';
  8. const STATUS_BLOCKED = 'blocked';
  9. const GENDER_MAN = "man";
  10. const GENDER_WOMAN = "woman";
  11. const SETTING_CHANGE_PASSWORD_REQUEST_MAIL_SUBJECT = 'change_password_request_mail_subject';
  12. const SETTING_CHANGE_PASSWORD_REQUEST_MAIL_BODY = 'change_password_request_mail_body';
  13. const SETTING_ACTIVATE_REQUEST_DONE_MESSAGE = 'activate_request_done_message';
  14. const SETTING_REGISTRATION_MAIL_SUBJECT = 'registration_mail_subject';
  15. const SETTING_REGISTRATION_DONE_MESSAGE = 'registration_done_message';
  16. const SETTING_REGISTRATION_MAIL_BODY = 'registration_mail_body';
  17. const SCENARIO_CHANGE_PASSWORD_REQUEST = 'ChangePasswordRequest';
  18. const SCENARIO_ACTIVATE_REQUEST = 'ActivateRequest';
  19. const SCENARIO_CHANGE_PASSWORD = 'ChangePassword';
  20. const SCENARIO_REGISTRATION = 'Registration';
  21. const SCENARIO_UPDATE = 'Update';
  22. const SCENARIO_CREATE = 'Create';
  23. const SCENARIO_LOGIN = 'Login';
  24. const SCENARIO_CABINET = 'Cabinet';
  25. const EMAIL_EVENT_TYPE_REGISTRATION = 'email_event_type_registration';
  26. const EMAIL_EVENT_TYPE_CHANGE_PASSWORD = 'email_event_type_change_password';
  27. public $password_c;
  28. public $nativePassword;
  29. public $captcha;
  30. public $remember_me = false;
  31. public $activate_error;
  32. public $activate_code;
  33. public function name()
  34. {
  35. return 'Пользователи';
  36. }
  37. public static function model($className = __CLASS__)
  38. {
  39. return parent::model($className);
  40. }
  41. public function tableName()
  42. {
  43. return 'users';
  44. }
  45. public static $status_list = array(
  46. self::STATUS_ACTIVE => "Активный",
  47. self::STATUS_NEW => "Новый",
  48. self::STATUS_BLOCKED => "Заблокирован"
  49. );
  50. public static $gender_list = array(
  51. self::GENDER_MAN => "Мужской",
  52. self::GENDER_WOMAN => "Женский"
  53. );
  54. public function getName()
  55. {
  56. return implode(' ', array(
  57. $this->last_name,
  58. $this->first_name,
  59. $this->patronymic
  60. ));
  61. }
  62. public function getUserDir()
  63. {
  64. $dir = "upload/users/".$this->id."/";
  65. $path = $_SERVER["DOCUMENT_ROOT"].$dir;
  66. if (!file_exists($path))
  67. {
  68. mkdir($path);
  69. chmod($path, 0777);
  70. }
  71. return $dir;
  72. }
  73. public function rules()
  74. {
  75. return array(
  76. array(
  77. 'captcha',
  78. 'application.extensions.recaptcha.EReCaptchaValidator',
  79. 'privateKey' => '6LcsjsMSAAAAAHGMdF84g3szTZZe0VVwMof5bD7Y',
  80. 'on' => array(
  81. self::SCENARIO_ACTIVATE_REQUEST,
  82. )
  83. ),
  84. array(
  85. 'email',
  86. 'required',
  87. 'on' => array(
  88. self::SCENARIO_ACTIVATE_REQUEST,
  89. self::SCENARIO_CHANGE_PASSWORD_REQUEST,
  90. self::SCENARIO_CREATE,
  91. self::SCENARIO_LOGIN,
  92. self::SCENARIO_REGISTRATION,
  93. self::SCENARIO_UPDATE
  94. )
  95. ),
  96. array(
  97. 'first_name',
  98. 'required',
  99. 'on' => array(self::SCENARIO_REGISTRATION)
  100. ),
  101. array(
  102. 'first_name, last_name, patronymic',
  103. 'length',
  104. 'max' => 60
  105. ),
  106. array(
  107. 'first_name, last_name, patronymic',
  108. 'RuLatAlphaValidator'
  109. ),
  110. array(
  111. 'password_c, password',
  112. 'required',
  113. 'on' => array(
  114. self::SCENARIO_REGISTRATION,
  115. self::SCENARIO_CHANGE_PASSWORD,
  116. self::SCENARIO_UPDATE,
  117. self::SCENARIO_CREATE
  118. )
  119. ),
  120. array(
  121. 'password',
  122. 'required',
  123. 'on' => array(
  124. self::SCENARIO_LOGIN,
  125. self::SCENARIO_REGISTRATION,
  126. )
  127. ),
  128. array(
  129. 'password',
  130. 'length',
  131. 'min' => 3,
  132. 'on' => array(
  133. self::SCENARIO_REGISTRATION,
  134. self::SCENARIO_CHANGE_PASSWORD,
  135. self::SCENARIO_UPDATE,
  136. self::SCENARIO_CREATE
  137. ),
  138. 'tooShort' => 'Вы ввели слишком простой пароль. Пароль не может быть короче 3-х символов.',
  139. ),
  140. array(
  141. 'email',
  142. 'email',
  143. ),
  144. array(
  145. 'email',
  146. 'unique',
  147. 'attributeName' => 'email',
  148. 'className' => 'User',
  149. 'on' => self::SCENARIO_REGISTRATION
  150. ),
  151. array(
  152. 'password_c',
  153. 'compare',
  154. 'compareAttribute' => 'password',
  155. 'on' => array(
  156. self::SCENARIO_REGISTRATION,
  157. self::SCENARIO_CHANGE_PASSWORD,
  158. self::SCENARIO_UPDATE,
  159. self::SCENARIO_CREATE
  160. )
  161. ),
  162. array(
  163. 'phone',
  164. 'PhoneValidator'
  165. ),
  166. array(
  167. 'birthdate',
  168. 'date',
  169. 'format' => 'dd.mm.yyyy',
  170. 'message' => 'Верный формат даты (дд.мм.гггг) используйте календарь.',
  171. 'on' => self::SCENARIO_REGISTRATION
  172. ),
  173. array(
  174. 'first_name, last_name, patronymic',
  175. 'length',
  176. 'min' => 2
  177. ),
  178. array(
  179. 'email',
  180. 'length',
  181. 'max' => 150,
  182. 'min' => 10,
  183. ),
  184. array(
  185. 'gender',
  186. 'in',
  187. 'range' => array_keys(self::$gender_list)
  188. ),
  189. array(
  190. 'status',
  191. 'in',
  192. 'range' => array_keys(self::$status_list)
  193. ),
  194. array(
  195. 'birthdate,activate_code',
  196. 'safe'
  197. ),
  198. array(
  199. 'email',
  200. 'filter',
  201. 'filter' => 'trim'
  202. ),
  203. array(
  204. 'id, email, birthdate, gender, status, date_create',
  205. 'safe',
  206. 'on'=> 'search'
  207. ),
  208. );
  209. }
  210. public function relations()
  211. {
  212. return array(
  213. 'assignment' => array(
  214. self::HAS_ONE,
  215. 'AuthAssignment',
  216. 'userid'
  217. ),
  218. 'role' => array(
  219. self::HAS_ONE,
  220. 'AuthItem',
  221. 'itemname',
  222. 'through' => 'assignment'
  223. )
  224. );
  225. }
  226. public function search()
  227. {
  228. $criteria = new CDbCriteria;
  229. $criteria->compare('id', $this->id, true);
  230. $criteria->compare('email', $this->email, true);
  231. $criteria->compare('first_name', $this->first_name, true);
  232. $criteria->compare('last_name', $this->last_name, true);
  233. $criteria->compare('patronymic', $this->patronymic, true);
  234. $criteria->compare('birthdate', $this->birthdate, true);
  235. $criteria->compare('gender', $this->gender, true);
  236. $criteria->compare('status', $this->status, true);
  237. $criteria->compare('date_create', $this->date_create, true);
  238. $criteria->with = 'role';
  239. return new ActiveDataProvider(get_class($this), array(
  240. 'criteria' => $criteria,
  241. 'sort' => array(
  242. 'attributes' => array(
  243. 'role' => array(
  244. 'asc' => 'role.name',
  245. 'desc' => 'role.name DESC'
  246. ),
  247. '*'
  248. )
  249. )
  250. ));
  251. }
  252. public function attributeLabels()
  253. {
  254. $attrs = array_merge(parent::attributeLabels(), array(
  255. "password_c" => "Пароль еще раз",
  256. "remember_me" => "Запомни меня",
  257. "captcha" => "Введите код",
  258. "role" => "Роль"
  259. ));
  260. return $attrs;
  261. }
  262. public function generateActivateCode()
  263. {
  264. $this->activate_code = md5($this->id.$this->name.$this->email.time(true).rand(5, 10));
  265. }
  266. public function getRole()
  267. {
  268. $assigment = AuthAssignment::model()->findByAttributes(array(
  269. 'userid' => $this->id
  270. ));
  271. if (!$assigment)
  272. {
  273. $assigment = new AuthAssignment();
  274. $assigment->itemname = AuthItem::ROLE_DEFAULT;
  275. $assigment->userid = $this->id;
  276. $assigment->save();
  277. }
  278. return $assigment->role;
  279. }
  280. public function isRootRole()
  281. {
  282. return $this->role->name == AuthItem::ROLE_ROOT;
  283. }
  284. public function sendActivationMail()
  285. {
  286. $mailler_letter = MailerLetter::model();
  287. $subject = Setting::model()->getValue(self::SETTING_REGISTRATION_MAIL_SUBJECT);
  288. $subject = $mailler_letter->compileText($subject);
  289. $body = Setting::model()->getValue(self::SETTING_REGISTRATION_MAIL_BODY);
  290. $body = $mailler_letter->compileText($body, array('user' => $this));
  291. MailerModule::sendMail($this->email, $subject, $body);
  292. }
  293. public function activateAccountUrl()
  294. {
  295. $url = 'http://'.$_SERVER['HTTP_HOST'];
  296. $url .= Yii::app()->controller->url('/activateAccount/'.$this->activate_code.'/'.md5($this->email));
  297. return $url;
  298. }
  299. public function changePasswordUrl()
  300. {
  301. $url = 'http://'.$_SERVER['HTTP_HOST'];
  302. $url .= Yii::app()->controller->url('/changePassword/'.$this->password_change_code.'/'.md5($this->email));
  303. return $url;
  304. }
  305. public function generateNewPassword()
  306. {
  307. $chars = array_merge(range(0,9), range('a','z'), range('A','Z'));
  308. shuffle($chars);
  309. return implode(array_slice($chars, 0, self::NEW_PASSWORD_LENGTH));
  310. }
  311. public function sendNoticeEmail( $eventType=null )
  312. {
  313. if (is_null($eventType))
  314. {
  315. return false;
  316. }
  317. switch ($eventType)
  318. {
  319. case self::EMAIL_EVENT_TYPE_REGISTRATION:
  320. $subjectType = self::SETTING_REGISTRATION_MAIL_SUBJECT;
  321. $bodyType = self::SETTING_REGISTRATION_MAIL_BODY;
  322. break;
  323. case self::EMAIL_EVENT_TYPE_CHANGE_PASSWORD:
  324. $subjectType = self::SETTING_CHANGE_PASSWORD_REQUEST_MAIL_SUBJECT;
  325. $bodyType = self::SETTING_CHANGE_PASSWORD_REQUEST_MAIL_BODY;
  326. break;
  327. default: return false;
  328. }
  329. $mailer_letter = MailerLetter::model();
  330. $settings = Setting::model()->findCodesValues();
  331. $subject = $mailer_letter->compileText($settings[$subjectType], array('user' => $this));
  332. $body = $mailer_letter->compileText($settings[$bodyType], array('user' => $this));
  333. $emailFrom = Setting::model()->getValue(MailerModule::SETTING_FROM_EMAIL);
  334. MailHelper::send($this->email, $subject, $body, $emailFrom);
  335. return true;
  336. }
  337. }