Redesign profile page

Added new fields:
- First name
- Last name
- Nickname
This commit is contained in:
Jay Trees 2022-04-07 10:31:23 +02:00
parent 0585061164
commit 74306ec5be
5 changed files with 140 additions and 209 deletions

View file

@ -6,7 +6,7 @@
* @author Jay Trees <github.jay@grandel.anonaddy.me>
*/
define('VERSION', '0.4.0');
define('VERSION', '0.5.0');
define('ROOT', __DIR__);
define('DEFAULT_LOCALE', 'en_GB');

View file

@ -133,7 +133,10 @@ switch ($step) {
`last_login` DATETIME NOT NULL DEFAULT NOW(),
`power` INT NOT NULL DEFAULT 0,
`birthdate` DATE NULL DEFAULT NULL,
`locale` VARCHAR(5) NOT NULL DEFAULT "' . DEFAULT_LOCALE . '"
`locale` VARCHAR(5) NOT NULL DEFAULT "' . DEFAULT_LOCALE . '",
`name_first` VARCHAR(32) NULL DEFAULT NULL,
`name_last` VARCHAR(32) NULL DEFAULT NULL,
`name_nick` VARCHAR(32) NULL DEFAULT NULL
);');
$database->query('CREATE INDEX `idx_password` ON `users` (`password`);');

View file

@ -8,49 +8,96 @@
use wishthis\{Page, User};
if (isset($_POST['user-id'])) {
$set = array();
$page = new Page(__FILE__, __('Profile'));
if (isset($_POST['user-id'], $_POST['section'])) {
$set = array();
$formFieldsString = array(
array(
'column' => 'name_first',
'key' => 'user-name-first',
'label' => __('First name'),
),
array(
'column' => 'name_last',
'key' => 'user-name-last',
'label' => __('Last name'),
),
array(
'column' => 'name_nick',
'key' => 'user-name-nick',
'label' => __('Nickname'),
),
array(
'column' => 'email',
'key' => 'user-email',
'label' => __('Email'),
),
array(
'column' => 'locale',
'key' => 'user-locale',
'label' => __('Language'),
),
);
$loginRequired = false;
if (!empty($_POST['user-email'])) {
$set[] = '`email` = "' . $_POST['user-email'] . '"';
foreach ($formFieldsString as $field) {
if (!empty($_POST[$field['key']]) && $_POST[$field['key']] !== $user->{$field['column']}) {
$set[] = '`' . $field['column'] . '` = "' . $_POST[$field['key']] . '"';
$user->{$field['column']} = $_POST[$field['key']];
$page->messages[] = Page::success(
sprintf(
__('%s successfully updated!'),
'<strong>' . $field['label'] . '</strong>'
),
__('Success')
);
}
}
if (!empty($_POST['user-password']) && !empty($_POST['user-password-repeat'])) {
$set[] = '`password` = "' . User::generatePassword($_POST['user-password']) . '"';
if (!empty($_POST['user-email']) && $_POST['user-email'] !== $user->email) {
$loginRequired = true;
}
if ($_POST['user-birthdate']) {
$user->birthdate = date('Y-m-d', strtotime($_POST['user-birthdate']));
$set[] = '`birthdate` = "' . $user->birthdate . '"';
} else {
if (isset($_POST['user-birthdate'])) {
if (empty($_POST['user-birthdate'])) {
$user->birthdate = null;
$set[] = '`birthdate` = NULL';
} else {
$user->birthdate = date('Y-m-d', strtotime($_POST['user-birthdate']));
$set[] = '`birthdate` = "' . $user->birthdate . '"';
}
}
$set[] = '`locale` = "' . $_POST['user-locale'] . '"';
if (
!empty($_POST['user-password'])
&& !empty($_POST['user-password-repeat'])
&& $_POST['user-password'] === $_POST['user-password-repeat']
) {
$set[] = '`password` = "' . User::generatePassword($_POST['user-password']) . '"';
$loginRequired = true;
}
$database
->query('UPDATE `users`
SET ' . implode(',', $set) . '
WHERE `id` = ' . $_POST['user-id']);
if ($_POST['user-email'] !== $_SESSION['user']['email']) {
$loginRequired = true;
}
if ($loginRequired) {
session_destroy();
$page->messages[] = Page::warning(
__('It is required for you to login again.'),
__('Success')
);
}
}
redirect('/?page=profile');
}
$page = new Page(__FILE__, __('Profile'));
$page->header();
$page->bodyStart();
$page->navigation();
@ -60,20 +107,22 @@ $page->navigation();
<div class="ui container">
<h1 class="ui header"><?= $page->title ?></h1>
<?= $page->messages() ?>
<div class="ui stackable grid">
<div class="four wide column">
<div class="ui vertical pointing fluid menu profile">
<div class="item" data-tab="personal">
<h4 class="ui header">Personal</h4>
<p>Information regarding yourself</p>
<h4 class="ui header"><?= __('Personal') ?></h4>
<p><?= __('Information regarding yourself') ?></p>
</div>
<div class="item" data-tab="password">
<h4 class="ui header">Password</h4>
<p>Change your password</p>
<h4 class="ui header"><?= __('Password') ?></h4>
<p><?= __('Change your password') ?></p>
</div>
<div class="item" data-tab="language">
<h4 class="ui header">Language</h4>
<p>Your language preferences</p>
<div class="item" data-tab="preferences">
<h4 class="ui header"><?= __('Preferences') ?></h4>
<p><?= __('Improve your withthis experience') ?></p>
</div>
</div>
</div>
@ -84,48 +133,35 @@ $page->navigation();
<form class="ui form" method="POST">
<input type="hidden" name="user-id" value="<?= $user->id ?>" />
<input type="hidden" name="section" value="personal" />
<div class="three fields">
<div class="field">
<label><?= __('First name') ?></label>
<input type="text" name="user-name-first" value="" />
<input type="text" name="user-name-first" value="<?= $user->name_first ?>" />
</div>
<div class="field">
<label><?= __('Last name') ?></label>
<input type="text" name="user-name-last" value="" />
<input type="text" name="user-name-last" value="<?= $user->name_last ?>" />
</div>
<div class="field">
<label><?= __('Nickname') ?></label>
<input type="text" name="user-name-nick" value="" />
<input type="text" name="user-name-nick" value="<?= $user->name_nick ?>" />
</div>
</div>
<div class="two fields">
<div class="field">
<label><?= __('Email') ?></label>
<input type="email" name="user-email" value="<?= $user->email ?>" />
</div>
<div class="two fields">
<div class="field">
<label><?= __('Password') ?></label>
<input type="password" name="user-password" autocomplete="new-password" />
</div>
<div class="field">
<label><?= __('Password (repeat)') ?></label>
<input type="password" name="user-password-repeat" autocomplete="new-password" />
</div>
</div>
<div class="two fields">
<div class="field">
<label><?= __('Birthdate') ?></label>
@ -140,24 +176,6 @@ $page->navigation();
</div>
</div>
</div>
<div class="field">
<label><?= __('Language') ?></label>
<select class="ui search dropdown" name="user-locale">
<?php if (!in_array('en', $locales)) { ?>
<option value="<?= 'en' ?>"><?= \Locale::getDisplayName('en', $user->locale) ?></option>
<?php } ?>
<?php foreach ($locales as $locale) { ?>
<?php if ($locale === $user->locale) { ?>
<option value="<?= $locale ?>" selected><?= \Locale::getDisplayName($locale, $user->locale) ?></option>
<?php } else { ?>
<option value="<?= $locale ?>"><?= \Locale::getDisplayName($locale, $user->locale) ?></option>
<?php } ?>
<?php } ?>
</select>
</div>
</div>
<div class="ui error message"></div>
@ -177,32 +195,7 @@ $page->navigation();
<form class="ui form" method="POST">
<input type="hidden" name="user-id" value="<?= $user->id ?>" />
<div class="three fields">
<div class="field">
<label><?= __('First name') ?></label>
<input type="text" name="user-name-first" value="" />
</div>
<div class="field">
<label><?= __('Last name') ?></label>
<input type="text" name="user-name-last" value="" />
</div>
<div class="field">
<label><?= __('Nickname') ?></label>
<input type="text" name="user-name-nick" value="" />
</div>
</div>
<div class="field">
<label><?= __('Email') ?></label>
<input type="email" name="user-email" value="<?= $user->email ?>" />
</div>
<input type="hidden" name="section" value="password" />
<div class="two fields">
<div class="field">
@ -218,41 +211,6 @@ $page->navigation();
</div>
</div>
<div class="two fields">
<div class="field">
<label><?= __('Birthdate') ?></label>
<div class="ui calendar">
<div class="ui input left icon">
<i class="calendar icon"></i>
<input type="text"
name="user-birthdate"
placeholder="<?= __('Pick a date') ?>"
value="<?= $user->birthdate ?>"
/>
</div>
</div>
</div>
<div class="field">
<label><?= __('Language') ?></label>
<select class="ui search dropdown" name="user-locale">
<?php if (!in_array('en', $locales)) { ?>
<option value="<?= 'en' ?>"><?= \Locale::getDisplayName('en', $user->locale) ?></option>
<?php } ?>
<?php foreach ($locales as $locale) { ?>
<?php if ($locale === $user->locale) { ?>
<option value="<?= $locale ?>" selected><?= \Locale::getDisplayName($locale, $user->locale) ?></option>
<?php } else { ?>
<option value="<?= $locale ?>"><?= \Locale::getDisplayName($locale, $user->locale) ?></option>
<?php } ?>
<?php } ?>
</select>
</div>
</div>
<div class="ui error message"></div>
<input class="ui primary button"
@ -265,68 +223,14 @@ $page->navigation();
</div>
</div>
<div class="ui tab" data-tab="password">
<div class="ui tab" data-tab="preferences">
<div class="ui segment">
<form class="ui form" method="POST">
<input type="hidden" name="user-id" value="<?= $user->id ?>" />
<div class="three fields">
<div class="field">
<label><?= __('First name') ?></label>
<input type="text" name="user-name-first" value="" />
</div>
<div class="field">
<label><?= __('Last name') ?></label>
<input type="text" name="user-name-last" value="" />
</div>
<div class="field">
<label><?= __('Nickname') ?></label>
<input type="text" name="user-name-nick" value="" />
</div>
</div>
<div class="field">
<label><?= __('Email') ?></label>
<input type="email" name="user-email" value="<?= $user->email ?>" />
</div>
<input type="hidden" name="section" value="preferences" />
<div class="two fields">
<div class="field">
<label><?= __('Password') ?></label>
<input type="password" name="user-password" autocomplete="new-password" />
</div>
<div class="field">
<label><?= __('Password (repeat)') ?></label>
<input type="password" name="user-password-repeat" autocomplete="new-password" />
</div>
</div>
<div class="two fields">
<div class="field">
<label><?= __('Birthdate') ?></label>
<div class="ui calendar">
<div class="ui input left icon">
<i class="calendar icon"></i>
<input type="text"
name="user-birthdate"
placeholder="<?= __('Pick a date') ?>"
value="<?= $user->birthdate ?>"
/>
</div>
</div>
</div>
<div class="field">
<label><?= __('Language') ?></label>
@ -360,10 +264,6 @@ $page->navigation();
</div>
</div>
<div class="ui segment">
asdf
</div>
</div>
</main>

View file

@ -8,29 +8,50 @@
use wishthis\{Page, User};
$page = new Page(__FILE__, __('Update'), 100);
/**
* Update
*/
if ('POST' === $_SERVER['REQUEST_METHOD']) {
/**
* Database
*/
$versions_directory = ROOT . '/src/update';
$versions_contents = scandir($versions_directory);
$versions = array();
/** 0.5.0 *//*
if (-1 === version_compare($options->version, '0.5.0')) {
$database->query('ALTER TABLE `users`
ADD `status` VARCHAR(32) NOT NULL AFTER `url`
;');
}*/
foreach ($versions_contents as $filename) {
$filepath = $versions_directory . '/' . $filename;
$pathinfo = pathinfo($filepath);
if ('sql' === $pathinfo['extension']) {
$versions[] = array(
'version' => str_replace('-', '.', $pathinfo['filename']),
'filepath' => $filepath,
);
}
}
foreach ($versions as $version) {
if (-1 !== version_compare(VERSION, $version['version'])) {
$sql = file_get_contents($version['filepath']);
if ($sql) {
$database->query($sql);
$page->messages[] = Page::info(
sprintf(
__('Database successfully migrated to %s.'),
'v' . $version['version']
)
);
}
}
}
/** Update version */
$options->setOption('version', VERSION);
$options->setOption('updateAvailable', false);
redirect('/?page=home');
}
$page = new Page(__FILE__, __('Update'), 100);
$page->header();
$page->bodyStart();
$page->navigation();
@ -40,6 +61,8 @@ $page->navigation();
<div class="ui container">
<h1 class="ui header"><?= $page->title ?></h1>
<?= $page->messages() ?>
<div class="ui segment">
<h2 class="ui header"><?= __('Database migration') ?></h2>
<p><?= __('Thank you for updating withthis! To complete this update, some changes are required to the database structure.') ?></p>

5
src/update/0-5-0.sql Normal file
View file

@ -0,0 +1,5 @@
ALTER TABLE `users`
ADD COLUMN `name_first` VARCHAR(32) NULL DEFAULT NULL,
ADD COLUMN `name_last` VARCHAR(32) NULL DEFAULT NULL,
ADD COLUMN `name_nick` VARCHAR(32) NULL DEFAULT NULL
;