Version 1.4.3: Unique user email and user error messages
This commit is contained in:
parent
f59f8b5934
commit
90420a7500
4 changed files with 109 additions and 52 deletions
|
@ -19,7 +19,6 @@ class SettingsController extends Controller
|
|||
{
|
||||
$user = new User();
|
||||
$settings = $this->c->get('settings');
|
||||
# $users = $user->getUsers();
|
||||
$route = $request->getAttribute('route');
|
||||
$navigation = $this->getNavigation();
|
||||
|
||||
|
@ -30,7 +29,6 @@ class SettingsController extends Controller
|
|||
'acl' => $this->c->acl,
|
||||
'navigation' => $navigation,
|
||||
'content' => $content,
|
||||
# 'users' => $users,
|
||||
'route' => $route->getName()
|
||||
));
|
||||
}
|
||||
|
@ -587,52 +585,46 @@ class SettingsController extends Controller
|
|||
return $response->withRedirect($this->c->router->pathFor('user.show', ['username' => $_SESSION['user']] ));
|
||||
}
|
||||
|
||||
$validate = new Validation();
|
||||
|
||||
if($validate->username($args['username']))
|
||||
# get settings
|
||||
$settings = $this->c->get('settings');
|
||||
|
||||
# get user with userdata
|
||||
$user = new User();
|
||||
$userdata = $user->getSecureUser($args['username']);
|
||||
|
||||
if(!$userdata)
|
||||
{
|
||||
# get settings
|
||||
$settings = $this->c->get('settings');
|
||||
|
||||
# get user with userdata
|
||||
$user = new User();
|
||||
$userdata = $user->getSecureUser($args['username']);
|
||||
|
||||
$username = $userdata['username'];
|
||||
|
||||
# instantiate field-builder
|
||||
$fieldsModel = new Fields();
|
||||
|
||||
# get the field-definitions
|
||||
$fieldDefinitions = $this->getUserFields($userdata['userrole']);
|
||||
|
||||
# prepare userdata for field-builder
|
||||
$userSettings['users']['user'] = $userdata;
|
||||
|
||||
# generate the input form
|
||||
$userform = $fieldsModel->getFields($userSettings, 'users', 'user', $fieldDefinitions);
|
||||
|
||||
$route = $request->getAttribute('route');
|
||||
$navigation = $this->getNavigation();
|
||||
|
||||
# set navigation active
|
||||
$navigation['Users']['active'] = true;
|
||||
|
||||
return $this->render($response, 'settings/user.twig', array(
|
||||
'settings' => $settings,
|
||||
'acl' => $this->c->acl,
|
||||
'navigation' => $navigation,
|
||||
'usersettings' => $userSettings, // needed for image url in form, will overwrite settings for field-template
|
||||
'userform' => $userform, // field model, needed to generate frontend-field
|
||||
'userdata' => $userdata, // needed to fill form with data
|
||||
# 'userrole' => false, // not needed ?
|
||||
# 'username' => $args['username'], // not needed ?
|
||||
'route' => $route->getName() // needed to set link active
|
||||
));
|
||||
$this->c->flash->addMessage('error', 'User does not exists');
|
||||
return $response->withRedirect($this->c->router->pathFor('user.account'));
|
||||
}
|
||||
|
||||
$this->c->flash->addMessage('error', 'User does not exists');
|
||||
return $response->withRedirect($this->c->router->pathFor('user.account'));
|
||||
|
||||
# instantiate field-builder
|
||||
$fieldsModel = new Fields();
|
||||
|
||||
# get the field-definitions
|
||||
$fieldDefinitions = $this->getUserFields($userdata['userrole']);
|
||||
|
||||
# prepare userdata for field-builder
|
||||
$userSettings['users']['user'] = $userdata;
|
||||
|
||||
# generate the input form
|
||||
$userform = $fieldsModel->getFields($userSettings, 'users', 'user', $fieldDefinitions);
|
||||
|
||||
$route = $request->getAttribute('route');
|
||||
$navigation = $this->getNavigation();
|
||||
|
||||
# set navigation active
|
||||
$navigation['Users']['active'] = true;
|
||||
|
||||
return $this->render($response, 'settings/user.twig', array(
|
||||
'settings' => $settings,
|
||||
'acl' => $this->c->acl,
|
||||
'navigation' => $navigation,
|
||||
'usersettings' => $userSettings, // needed for image url in form, will overwrite settings for field-template
|
||||
'userform' => $userform, // field model, needed to generate frontend-field
|
||||
'userdata' => $userdata, // needed to fill form with data
|
||||
'route' => $route->getName() // needed to set link active
|
||||
));
|
||||
}
|
||||
|
||||
public function listUser($request, $response)
|
||||
|
@ -796,7 +788,12 @@ class SettingsController extends Controller
|
|||
return $response->withRedirect($redirectRoute);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# change error-array for formbuilder
|
||||
$errors = $_SESSION['errors'];
|
||||
unset($_SESSION['errors']);
|
||||
$_SESSION['errors']['user'] = $errors;#
|
||||
|
||||
$this->c->flash->addMessage('error', 'Please correct your input');
|
||||
return $response->withRedirect($redirectRoute);
|
||||
}
|
||||
|
|
|
@ -8,10 +8,10 @@ class User extends WriteYaml
|
|||
{
|
||||
$userDir = __DIR__ . '/../../settings/users';
|
||||
|
||||
/* check if plugins directory exists */
|
||||
/* check if users directory exists */
|
||||
if(!is_dir($userDir)){ return array(); }
|
||||
|
||||
/* get all plugins folder */
|
||||
/* get all user files */
|
||||
$users = array_diff(scandir($userDir), array('..', '.'));
|
||||
|
||||
$cleanUser = array();
|
||||
|
@ -23,6 +23,43 @@ class User extends WriteYaml
|
|||
|
||||
return $cleanUser;
|
||||
}
|
||||
|
||||
# returns array of emails of all users
|
||||
public function getUserMails()
|
||||
{
|
||||
$userDir = __DIR__ . '/../../settings/users';
|
||||
|
||||
/* check if users directory exists */
|
||||
if(!is_dir($userDir)){ return array(); }
|
||||
|
||||
/* get all user files */
|
||||
$users = array_diff(scandir($userDir), array('..', '.'));
|
||||
|
||||
$usermails = array();
|
||||
|
||||
foreach($users as $key => $user)
|
||||
{
|
||||
if($user == '.logins'){ continue; }
|
||||
|
||||
$contents = file_get_contents($userDir . DIRECTORY_SEPARATOR . $user);
|
||||
|
||||
if($contents === false){ continue; }
|
||||
|
||||
$searchfor = 'email:';
|
||||
|
||||
# escape special characters in the query
|
||||
$pattern = preg_quote($searchfor, '/');
|
||||
|
||||
# finalise the regular expression, matching the whole line
|
||||
$pattern = "/^.*$pattern.*\$/m";
|
||||
|
||||
# search, and store first occurence in $matches
|
||||
if(preg_match($pattern, $contents, $match)){
|
||||
$usermails[] = trim(str_replace("email:", "", $match[0]));
|
||||
}
|
||||
}
|
||||
return $usermails;
|
||||
}
|
||||
|
||||
public function getUser($username)
|
||||
{
|
||||
|
|
|
@ -36,6 +36,26 @@ class Validation
|
|||
return false;
|
||||
}, 'only jpg, jpeg, png, webp, allowed');
|
||||
|
||||
# checks if email is available if user is created
|
||||
Validator::addRule('emailAvailable', function($field, $value, array $params, array $fields) use ($user)
|
||||
{
|
||||
$usermails = $user->getUserMails();
|
||||
if(in_array(trim($value), $usermails)){ return false; }
|
||||
return true;
|
||||
}, 'taken');
|
||||
|
||||
# checks if email is available if userdata is updated
|
||||
Validator::addRule('emailChanged', function($field, $value, array $params, array $fields) use ($user)
|
||||
{
|
||||
$userdata = $user->getSecureUser($fields['username']);
|
||||
if($userdata['email'] == $value){ return true; } # user has not updated his email
|
||||
|
||||
$usermails = $user->getUserMails();
|
||||
if(in_array(trim($value), $usermails)){ return false; }
|
||||
return true;
|
||||
}, 'taken');
|
||||
|
||||
# checks if username is free when create new user
|
||||
Validator::addRule('userAvailable', function($field, $value, array $params, array $fields) use ($user)
|
||||
{
|
||||
$userdata = $user->getUser($value);
|
||||
|
@ -43,6 +63,7 @@ class Validation
|
|||
return true;
|
||||
}, 'taken');
|
||||
|
||||
# checks if user exists when userdata is updated
|
||||
Validator::addRule('userExists', function($field, $value, array $params, array $fields) use ($user)
|
||||
{
|
||||
$userdata = $user->getUser($value);
|
||||
|
@ -189,6 +210,7 @@ class Validation
|
|||
$v->rule('noHTML', 'lastname')->message(" contains HTML");
|
||||
$v->rule('lengthBetween', 'lastname', 2, 40);
|
||||
$v->rule('email', 'email')->message("e-mail is invalid");
|
||||
$v->rule('emailAvailable', 'email')->message("Email already taken");
|
||||
$v->rule('in', 'userrole', $userroles);
|
||||
|
||||
return $this->validationResult($v);
|
||||
|
@ -206,6 +228,7 @@ class Validation
|
|||
$v->rule('noHTML', 'lastname')->message(" contains HTML");
|
||||
$v->rule('lengthBetween', 'lastname', 2, 40);
|
||||
$v->rule('email', 'email')->message("e-mail is invalid");
|
||||
$v->rule('emailChanged', 'email')->message("Email already taken");
|
||||
$v->rule('in', 'userrole', $userroles);
|
||||
|
||||
return $this->validationResult($v);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
{% block title %}{{ __('User') }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
|
||||
<div class="formWrapper">
|
||||
|
||||
<form id="userform" method="POST" action="{{ path_for('user.update') }}" enctype="multipart/form-data">
|
||||
|
@ -22,13 +22,13 @@
|
|||
<fieldset class="subfield">
|
||||
<legend>{{ field.legend }}</legend>
|
||||
{% for field in field.fields %}
|
||||
{% include '/partials/fields.twig' with { 'settings': usersettings, 'object' : 'users', 'itemName' : 'user', 'class' : 'large' } %}
|
||||
{% include '/partials/fields.twig' with { 'settings': usersettings, 'object' : 'users', 'itemName' : 'user', 'class' : 'large', 'errors': errors } %}
|
||||
{% endfor %}
|
||||
</fieldset>
|
||||
|
||||
{% else %}
|
||||
|
||||
{% include '/partials/fields.twig' with { 'settings': usersettings, 'object' : 'users', 'itemName' : 'user', 'class' : 'large' } %}
|
||||
{% include '/partials/fields.twig' with { 'settings': usersettings, 'object' : 'users', 'itemName' : 'user', 'class' : 'large', 'errors': errors } %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue