Added profile editing

Signed-off-by: Flashwave <me@flash.moe>
This commit is contained in:
flash 2015-08-08 02:37:56 +02:00
parent 31072687c8
commit d6648f311c
5 changed files with 206 additions and 7 deletions

View file

@ -37,7 +37,8 @@
"20150725", "20150725",
"20150728", "20150728",
"20150730", "20150730",
"20150731" "20150731",
"20150807"
] ]
@ -1619,6 +1620,19 @@
"change": "Fixed pending friend requests function returning mutual friends instead of requests." "change": "Fixed pending friend requests function returning mutual friends instead of requests."
} }
],
"20150807": [
{
"type": "ADD",
"change": "Added profile changing frontend."
},
{
"type": "ADD",
"change": "Added profile changing backend."
}
] ]
} }

View file

@ -814,6 +814,7 @@ class Users {
$fields[$field['id']] = $field; $fields[$field['id']] = $field;
$fields[$field['id']]['ident'] = Main::cleanString($field['name'], true, true); $fields[$field['id']]['ident'] = Main::cleanString($field['name'], true, true);
$fields[$field['id']]['addit'] = json_decode($field['additional'], true);
} }
@ -892,6 +893,30 @@ class Users {
} }
// Updating the profile data of a user
public static function updateUserProfileFields($id, $data) {
// We retrieve the current content from the database
$current = self::getUser($id)['userData'];
// Merge the arrays
$data = array_merge($current, ['profileFields' => $data]);
// Encode the json
$data = json_encode($data);
// Store it in the database
Database::update('users', [
[
'userData' => $data
],
[
'id' => [$id, '=']
]
]);
}
// Getting the profile page of a user // Getting the profile page of a user
public static function getProfilePage($id, $inputIsData = false) { public static function getProfilePage($id, $inputIsData = false) {

View file

@ -10,7 +10,33 @@
<div class="settings-explanation"> <div class="settings-explanation">
These are the external account links etc. on your profile, shouldn't need any additional explanation for this one. These are the external account links etc. on your profile, shouldn't need any additional explanation for this one.
</div> </div>
<form enctype="multipart/form-data" method="post" action="{{ sakura.currentpage }}">
<input type="hidden" name="sessid" value="{{ php.sessionid }}" />
<input type="hidden" name="timestamp" value="{{ php.time }}" />
<input type="hidden" name="mode" value="profile" />
{% for field in profile.fields %}
<div class="profile-field">
<div>
<h2>{{ field.name }}</h2>
</div>
<div>
<input type="{{ field.formtype }}" name="profile_{{ field.ident }}" class="inputStyling" placeholder="{{ field.description }}"{% if profile.user[field.ident].value %} value="{{ profile.user[field.ident].value }}"{% endif %} />
</div>
{% if field.addit %}
{% for id,addit in field.addit %}
<div>
<input type="{{ addit[0] }}" id="{{ id }}" name="profile_additional_{{ id }}" />
<label for="{{ id }}" style="font-size: 10px;">{{ addit[1]|raw }}</label>
</div>
{% endfor %}
{% endif %}
</div>
{% endfor %}
<div class="profile-save">
<input type="submit" value="Save" name="submit" class="inputStyling" />
<input type="reset" value="Reset" name="reset" class="inputStyling" />
</div>
</form>
</div> </div>
<div class="clear"></div> <div class="clear"></div>
</div> </div>

View file

@ -1342,11 +1342,14 @@ a.gotop.exit {
margin: 0 2px 40px; margin: 0 2px 40px;
float: left; float: left;
border-radius: 3px; border-radius: 3px;
box-shadow: inset 0 0 1px #9475B2;
background: #E4CFFF;
} }
.settings .friends-list > div:not(:last-child):hover { .settings .friends-list > div:not(:last-child):hover {
margin-bottom: 6px; margin-bottom: 6px;
background: #C2AFFE; background: #C2AFFE;
box-shadow: inset 0 0 2px #9475B2;
} }
.settings .friends-list > div > .friends-list-data { .settings .friends-list > div > .friends-list-data {
@ -1541,7 +1544,8 @@ button.inputStyling:active {
input[type="text"].inputStyling, input[type="text"].inputStyling,
input[type="password"].inputStyling, input[type="password"].inputStyling,
input[type="date"].inputStyling { input[type="date"].inputStyling,
input[type="url"].inputStyling {
padding: 3px 4px; padding: 3px 4px;
border: 1px solid #CCC; border: 1px solid #CCC;
box-shadow: inset #DDD 0 0 5px; box-shadow: inset #DDD 0 0 5px;
@ -1550,13 +1554,15 @@ input[type="date"].inputStyling {
input[type="text"].inputStyling.red, input[type="text"].inputStyling.red,
input[type="password"].inputStyling.red, input[type="password"].inputStyling.red,
input[type="date"].inputStyling.red { input[type="date"].inputStyling.red,
input[type="url"].inputStyling.red {
box-shadow: inset 0px 0px 7px #EB5959; box-shadow: inset 0px 0px 7px #EB5959;
} }
input[type="text"].inputStyling.green, input[type="text"].inputStyling.green,
input[type="password"].inputStyling.green, input[type="password"].inputStyling.green,
input[type="date"].inputStyling.green { input[type="date"].inputStyling.green,
input[type="url"].inputStyling.green {
box-shadow: inset 0px 0px 7px #A9EC8B; box-shadow: inset 0px 0px 7px #A9EC8B;
} }

View file

@ -201,6 +201,134 @@ if(isset($_REQUEST['request-notifications']) && $_REQUEST['request-notifications
Templates::render('errors/information.tpl', $renderData); Templates::render('errors/information.tpl', $renderData);
exit; exit;
} elseif(isset($_POST['submit']) && isset($_POST['submit'])) {
// Continue
$continue = true;
// Check if the user is logged in
if(!Users::checkLogin() || !$continue) {
$renderData['page'] = [
'title' => 'Settings',
'redirect' => '/authenticate',
'message' => 'You must be logged in to edit your settings.',
'success' => 0
];
// Break
$continue = false;
}
// Check session variables
if(!isset($_REQUEST['timestamp']) || $_REQUEST['timestamp'] < time() - 1000 || !isset($_REQUEST['sessid']) || $_REQUEST['sessid'] != session_id() || !$continue) {
$renderData['page'] = [
'title' => 'Session expired',
'redirect' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/settings',
'message' => 'Your session has expired, please refresh the page and try again.',
'success' => 0
];
// Break
$continue = false;
}
// Change settings
if($continue) {
// Switch to the correct mode
switch($_POST['mode']) {
// Profile
case 'profile':
// Get profile fields and create storage var
$fields = Users::getProfileFields();
$store = [];
// Go over each field
foreach($fields as $field) {
// Add to the store array
if(isset($_POST['profile_'. $field['ident']]) && !empty($_POST['profile_'. $field['ident']])) {
$store[$field['ident']] = $_POST['profile_'. $field['ident']];
}
// Check if there's additional values we should keep in mind
if(isset($field['additional']) && !empty($field['additional'])) {
// Decode the json
$field['additional'] = json_decode($field['additional'], true);
// Go over each additional value
foreach($field['additional'] as $addKey => $addVal) {
// Skip if the value is empty
if(!isset($_POST['profile_additional_'. $addKey]) || empty($_POST['profile_additional_'. $addKey]))
continue;
// Add to the array
$store[$addKey] = $_POST['profile_additional_'. $addKey];
}
}
}
// Update database
Users::updateUserProfileFields(Session::$userId, $store);
// Set render data
$renderData['page'] = [
'title' => 'Profile update',
'redirect' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/settings',
'message' => 'Your profile has been updated!',
'success' => 1
];
break;
// Fallback
default:
// Set render data
$renderData['page'] = [
'title' => 'Unknown action',
'redirect' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/settings',
'message' => 'The requested method does not exist.',
'success' => 0
];
break;
}
}
// Print page contents or if the AJAX request is set only display the render data
print isset($_REQUEST['ajax']) ?
(
$renderData['page']['title']
. '|'
. $renderData['page']['message']
. '|'
. $renderData['page']['success']
. '|'
. $renderData['page']['redirect']
) :
Templates::render('errors/information.tpl', $renderData);
exit;
} }
if(Users::checkLogin()) { if(Users::checkLogin()) {
@ -242,8 +370,8 @@ if(Users::checkLogin()) {
// Profile // Profile
case 'profile': case 'profile':
$renderData['profile'] = [ $renderData['profile'] = [
'user' => Users::getUser(Session::$userId), 'user' => Users::getUserProfileFields(Session::$userId),
'fields' => Database::fetch('profilefields') 'fields' => Users::getProfileFields()
]; ];
break; break;