/** * Редактирование расширенного профиля слушателя. */ public function action_profile_extended_by_student() { /* Подгружаем менеджер ссылок */ $links = Resources::getInstance()->links; /* Создаём экземпляры необходимых моделей */ $user = Model_User::create(); $region = Model_Region::create(); $locality = Model_Locality::create(); /* Получаем данные пользователя */ $udata = (object) $user->getAuth(); /* Создаём объект формы расширенного профиля */ $action = $links->get('student.extended-profile'); $form = Form_Profile_Student_Extended::create($action); $this->set('form', $form); $request = $this->getRequest(); $method = $form->method(); /* Если данных формы нет в запросе, */ if (empty($request->{$method})) { /* и профиль слушателя уже заполнен, */ if ($user->isExtendedProfileSet($udata->user_id)) { /* то загружаем данные базового профиля */ $info = $user->getUserInfo($udata->user_id); /* И выводим их в форме */ $form->setValue('surname', $info['surname']); $form->setValue('name', $info['name']); $form->setValue('patronymic', $info['patronymic']); /* Загружаем расширенный профиль */ $profile = $user->getExtendedProfile($udata->user_id); /* И наполняем форму данными из него */ $profile->passport->toForm($form); $profile->edu_doc->toForm($form); $profile->phones->toForm($form); /* Получаем по идентификаторам название региона и города */ $r_name = $region->getName($profile->passport->regionId); $l_name = $locality->getFullName($profile->passport->cityId); /* Передаём их в форму */ $form->setValue('region', $r_name); $form->setValue('city', $l_name); } /* Отображаем страничку с формой */ $this->render(); } /* Если же в запросе содержатся заполненные поля формы, */ if (!$form->validate($request, $region, $locality)) { /* проверяем их и выводим ошибки */ $this->render(); } /* Если данные прошли проверку, заполняем ими контейнеры */ $snp = (object) array('surname' => $form->surname->value, 'name' => $form->name->value, 'patronymic' => $form->patronymic->value); $passport = Model_User_Passport::create()->fromForm($form); $edu_doc = Model_User_EduDoc::create()->fromForm($form); $phones = Model_User_Phones::create()->fromForm($form); /* Обновляем фамилию-имя-отчество */ $user->updateSNP($udata->user_id, $snp); /* Сохраняем паспортные данные */ if (!$user->savePassport($udata->user_id, $passport)) { $msg = 'Ошибка при сохранении паспортных данных'; $alias = 'student.extended-profile'; $this->flash($msg, $links->get($alias), false); } /* Если в форме нет данных о документе об образовании, */ if (empty($edu_doc->type)) { /* то удаляем возможные записи, если раньше они были внесены */ $user->deleteEduDoc($udata->user_id); } elseif (!$user->saveEduDoc($udata->user_id, $edu_doc)) { $msg = 'Ошибка при сохранении данных документа об образовании'; $alias = 'student.extended-profile'; $this->flash($msg, $links->get($alias), false); } /* Если в форме нет данных о телефонах */ if (empty($phones->mobile) && empty($phones->stationary)) { /* удаляем возможные записи из базы */ $user->deletePhones($udata->user_id); } elseif (!$user->savePhones($udata->user_id, $phones)) { $msg = 'Ошибка при сохранении телефонов'; $alias = 'student.extended-profile'; $this->flash($msg, $links->get($alias), false); } /* Выводим сообщение об успешном редактировании профиля */ $this->flash('Ваш профиль успешно обновлён', $links->get('student.apply'), false); }
/** * Получение данных расширенной анкеты слушателя. * * @param int $user_id Идентификатор пользователя. * @return stdClass Данные расширенного профиля слушателя. */ public function getExtendedProfile($user_id) { $aliasing = array('passport' => array('p', array('series', 'number', 'birthday', 'given_by', 'given_date', 'region_id', 'city_id', 'street', 'house', 'flat')), 'edu_doc' => array('ed', array('type', 'custom_type', 'number', 'exit_year', 'speciality', 'qualification')), 'phone' => array('ph', array('stationary', 'mobile'))); $columns = array(); foreach ($aliasing as $column_prefix => $tbl) { foreach ($tbl[1] as $column) { $columns[] = sprintf('%s.%s AS %s_%s', $tbl[0], $column, $column_prefix, $column); } } $sql = ' SELECT ' . implode(', ' . CRLF, $columns) . ' FROM ' . $this->_tables['users'] . ' u LEFT JOIN ' . $this->_tables['passports'] . ' p ON p.user_id = u.user_id LEFT JOIN ' . $this->_tables['edu_docs'] . ' ed ON ed.user_id = u.user_id LEFT JOIN ' . $this->_tables['phones'] . ' ph ON ph.user_id = u.user_id WHERE u.user_id = :uid AND u.role = :role '; $values = array(':uid' => $user_id, ':role' => self::ROLE_STUDENT); $stmt = $this->prepare($sql); $stmt->execute($values); $profile = $stmt->fetch(Db_PdO::FETCH_ASSOC); $passport = Model_User_Passport::create()->fromRow($profile); $edu_doc = Model_User_EduDoc::create()->fromRow($profile); $phones = Model_User_Phones::create()->fromRow($profile); return (object) array('passport' => $passport, 'edu_doc' => $edu_doc, 'phones' => $phones); }