使用者基礎資料修改(暱稱、密碼等)
===
在nav導覽列上新增兩個按鍵分別為userinfo以及teaminfo,各別代表使用者的資訊與隊伍的資訊

若是在學生個人使用的情況下,一個team會對應到一個user,在競賽的環境下才會是一個team對應到多個user。
為了保留競賽的特性,將user資訊與team的資訊分開,管理者可以彈性開放部份能更改的資訊給使用者,若是在課程中為了方便辨識學生的名稱,可以讓他們更改team的名稱以及user的密碼 ; 若是在競賽中為了保持參賽資料的一致就不能開放此功能,避免名稱不同成績對不上的情況發生。
### user 資料修改

### team 資料修改

透過symfony form component來做改動
程式碼
===
### 後端
#### user部分
透過修改此檔案```webapp/src/Controller/Team/MiscController.php```
```php=
//新增user資訊更改
//透過symfony annotation來新增路由資訊
/**
* @Route("/changeuserinfo", name="team_changeuserinfo")
*/
//在controller中新增改變user資訊的action
public function changeUserInfoAction(Request $request){
//在使用者登入後取得目前使用者與隊伍相關的資訊
$user = $this->dj->getUser();
$team = $user->getTeam();
$teamId = $team->getTeamid();
if (!$team) {
throw new NotFoundHttpException(sprintf('Team with ID %s not found', $teamId));
}
//利用symfony form 建立相關資訊
//這裡利用了官方RepeatedType,來驗證使用者輸入的密碼是否兩次都相同
$form_passwd = $this->createFormBuilder($user)
->add('plainPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'required' => false,
'first_options' => array('label' => 'New password'),
'second_options' => array('label' => 'Confirm new password'),
'invalid_message' => 'The password fields must match.',
))
->add('save', SubmitType::class)
->getForm();
$form_passwd->handleRequest($request);
if ($form_passwd->isSubmitted() && $form_passwd->isValid()) {
$this->saveEntity($this->em, $this->eventLogService, $this->dj, $user,
$user->getUserid(),false);
//透過內建的驗證器將密碼加密並儲存到資料庫
//If we save the currently logged in used, update the login token
if ($user->getUserid() === $this->dj->getUser()->getUserid()) {
$token = new UsernamePasswordToken(
$user,
null,
'main',
$user->getRoles()
);
$this->tokenStorage->setToken($token);
}
return $this->redirect($this->generateUrl(
'team_index'
));
}
// 將資料渲染至change_user_info.html前端頁面
return $this->render('team/partials/change_user_info.html.twig', [
'team' => $team,
'user' => $user,
'form_passwd' => $form_passwd->createView()
]);
}
```
#### team部分
```webapp/src/Controller/Team/MiscController.php```
```php=
//新增team資訊更改
//透過symfony annotation來新增路由資訊
/**
* @Route("/changeteaminfo", name="team_changeteaminfo")
*/
//
public function changeTeamInfoAction(Request $request){
//取得使用者以及隊伍相關資料
$user = $this->dj->getUser();
$team = $user->getTeam();
$teamId = $team->getTeamid();
$contest = $this->dj->getCurrentContest($teamId);
if (!$team) {
throw new NotFoundHttpException(sprintf('Team with ID %s not found', $teamId));
}
//針對想要修改的屬性將其新增至表單中
$teaminfo_form = $this->createFormBuilder($team)
->add('name', TextType::class)
->add('save', SubmitType::class)
->getForm();
$teaminfo_form->handleRequest($request);
if ($teaminfo_form->isSubmitted() && $teaminfo_form->isValid()) {
$this->saveEntity($this->em, $this->eventLogService, $this->dj, $team,
$team->getName(), false);
return $this->redirect($this->generateUrl(
'team_index'
));
}
//將相關資料渲染至change_team_info此頁面中
return $this->render('team/partials/change_team_info.html.twig', [
'team' => $team,
'user' => $user,
'teaminfo_form' => $teaminfo_form->createView()
]);
}
```
### 前端
使用twig模板繼承的方式,透過更改```{% block content %}```
來進行前端的顯示
#### user部分
在```/webapp/templates/team/partials```
建立新檔案```change_user_info.html.twig```,並新增此頁面
```twig=
{% extends "team/base.html.twig" %}
{% block title %}Contest problems - {{ parent() }}
{% endblock %}
{% block content %}
{# 後端透過controller將form_passwd的資料傳遞給此頁面,透過twig form顯示form #}
<div class="row">
<div class="col-lg-4">
{{form(form_passwd)}}
</div>
</div>
{% endblock %}
```
#### team部分
在```/webapp/templates/team/partials```
建立新檔案```change_team_info.html.twig```,並新增以下內容
```twig=
{% extends "team/base.html.twig" %}
{% block title %}Contest problems - {{ parent() }}
{% endblock %}
{% block content %}
{# 後端透過controller將teaminfo_form的資料傳遞給此頁面,透過twig form顯示form #}
<div class="row">
<div class="col-lg-4">
{{form(teaminfo_form)}}
</div>
</div>
{% endblock %}
```