From fc85e6b3229a699cac5b34f31efdb0a8ee7d66d2 Mon Sep 17 00:00:00 2001 From: Christian Wolf Date: Wed, 5 Jun 2019 16:02:36 +0200 Subject: [PATCH] Made user controller working mostly. Not everything is tested but seems good --- src/admin/abstract/controller.php | 24 +++- src/admin/common/abstract/model.php | 25 +++- src/admin/common/abstract/model/factory.php | 10 +- .../controllermappings/{cmp.php => cmd.php} | 0 src/admin/common/models/factory/user.php | 16 +-- src/admin/common/models/user.php | 36 +++++- src/admin/controllers/club.php | 2 +- src/admin/controllers/user.php | 108 ++++++++++++------ 8 files changed, 170 insertions(+), 51 deletions(-) rename src/admin/common/controllermappings/{cmp.php => cmd.php} (100%) diff --git a/src/admin/abstract/controller.php b/src/admin/abstract/controller.php index e80f41c..0856cbe 100644 --- a/src/admin/abstract/controller.php +++ b/src/admin/abstract/controller.php @@ -59,9 +59,9 @@ abstract class AbstractClubsController extends BaseController try { // Fetch the posted data - $values = $this->loadData(); + $values = $this->loadData($this->additionalData()); - $this->filterRawCheck($values); + $this->filterRaw($values); // Check the input data if( ! $this->requiredDataIsAvailable($values) ) @@ -70,7 +70,9 @@ abstract class AbstractClubsController extends BaseController if( ! $this->rawDataIsValid($values) ) throw new DataParsingException(); - $obj->setValues($values, true); + $obj->applyAndMergeValues($values, true); + + $this->filterObject($obj, $values); // Do some additional tests by the controller if( ! $this->objectValid($obj) ) @@ -103,7 +105,12 @@ abstract class AbstractClubsController extends BaseController } } - protected function loadData() + protected function additionalData() + { + return array(); + } + + protected function loadData($additionalData) { $values = array(); $factory = $this->getFactory(); @@ -114,10 +121,17 @@ abstract class AbstractClubsController extends BaseController $values[$column->getAlias()] = $column->getFilter()->getFilteredValue($input, $column->getAlias()); } + foreach($additionalData as $k => $v) + { + $values[$k] = $v->getFilteredValue($input, $k); + } + return $values; } - protected function filterRawCheck(&$values){} + protected function filterRaw(&$values){} + + protected function filterObject($obj){} protected function objectValid($obj) { diff --git a/src/admin/common/abstract/model.php b/src/admin/common/abstract/model.php index 806263c..e0859c5 100644 --- a/src/admin/common/abstract/model.php +++ b/src/admin/common/abstract/model.php @@ -48,6 +48,27 @@ abstract class AbstractCommonClubsModel $this->values = $values; } + public function applyAndMergeValues($values, $unpack = true) + { + $vals = $this->getValues(); + + if($unpack) + $vals = $this->packExternalReferencesAsKeys($vals); + + foreach($this->getFactory()->getAttributes() as $column) + { + if(array_key_exists($column->getAlias(), $values)) + { + $vals[$column->getAlias()] = $values[$column->getAlias()]; + } + } + + if($unpack) + $vals = $this->unpackExternalReferencesFromKeys($vals); + + $this->setValues($vals, false); + } + protected function setValue($key, $value) { if(is_null($this->values)) @@ -134,6 +155,7 @@ abstract class AbstractCommonClubsModel $vals[$alias] = $a->packValue($vals[$alias]); } + // XXX Joins return $vals; } @@ -144,7 +166,8 @@ abstract class AbstractCommonClubsModel foreach($factory->getAttributes() as $a) { $alias = $a->getAlias(); - $vals[$alias] = $a->unpackValue($vals[$alias]); + if(isset($vals[$alias])) + $vals[$alias] = $a->unpackValue($vals[$alias]); } $joins = $factory->getJoins(); diff --git a/src/admin/common/abstract/model/factory.php b/src/admin/common/abstract/model/factory.php index 73a2514..434b72a 100644 --- a/src/admin/common/abstract/model/factory.php +++ b/src/admin/common/abstract/model/factory.php @@ -141,10 +141,16 @@ abstract class AbstractCommonClubsModelFactory * @param int $id * @return AbstractCommonClubsModel */ - public function loadById($id) { + public function loadById($id, $throwErr = true) + { $arr = $this->loadElements("main.id = " . ((int)$id) ); if(sizeof($arr) == 0) - throw new ElementNotFoundException(); + { + if($throwErr) + throw new ElementNotFoundException(); + else + return null; + } return $arr[0]; } diff --git a/src/admin/common/controllermappings/cmp.php b/src/admin/common/controllermappings/cmd.php similarity index 100% rename from src/admin/common/controllermappings/cmp.php rename to src/admin/common/controllermappings/cmd.php diff --git a/src/admin/common/models/factory/user.php b/src/admin/common/models/factory/user.php index 0341c30..3694cc0 100644 --- a/src/admin/common/models/factory/user.php +++ b/src/admin/common/models/factory/user.php @@ -8,14 +8,14 @@ class CommonClubsModelFactoryUser extends AbstractCommonClubsModelFactory public function fetchAttributes() { return array( - new CommonClubsModelColumnString('user'), - new CommonClubsModelColumnString('name'), - new CommonClubsModelColumnString('password'), - new CommonClubsModelColumnString('address'), - new CommonClubsModelColumnString('city'), - new CommonClubsModelColumnString('mail'), - new CommonClubsModelColumnString('phone'), - new CommonClubsModelColumnString('mobile') + new CommonClubsModelColumnString('user', new CommonClubsControllerMappingCmd('Benutzername')), + new CommonClubsModelColumnString('name', new CommonClubsControllerMappingString('Bürgerlicher Name')), + new CommonClubsModelColumnString('password', new CommonClubsControllerMappingString('Passwort', false)), + new CommonClubsModelColumnString('address', new CommonClubsControllerMappingString('Adresse')), + new CommonClubsModelColumnString('city', new CommonClubsControllerMappingString('Stadt')), + new CommonClubsModelColumnString('mail', new CommonClubsControllerMappingString('E-Mail')), + new CommonClubsModelColumnString('phone', new CommonClubsControllerMappingString('Telefonnummer', false)), + new CommonClubsModelColumnString('mobile', new CommonClubsControllerMappingString('Handynummer', false)) ); } diff --git a/src/admin/common/models/user.php b/src/admin/common/models/user.php index 62f880e..0ad1b5e 100644 --- a/src/admin/common/models/user.php +++ b/src/admin/common/models/user.php @@ -114,6 +114,12 @@ class CommonClubsModelUser extends AbstractCommonClubsModel $this->setValue('password', $hash); } + public function isPasswordSet() + { + $password = $this->getValues()['password']; + return isset($password) && strlen($password) > 0; + } + public function getPositions() { return $this->fetchAssociatedElements(new CommonClubsModelFactoryUserassoc(), 'userid'); @@ -139,7 +145,7 @@ class CommonClubsModelUser extends AbstractCommonClubsModel return true; } - public function isUsernameSuitable($user) + public function isUsernameFree($user) { $factory = new CommonClubsModelFactoryUser(); $users = $factory->loadElements(null, null, function($q) use ($user){ @@ -167,5 +173,33 @@ class CommonClubsModelUser extends AbstractCommonClubsModel $db->execute(); } + public function dataIsValid() + { + if(! parent::dataIsValid()) + return false; + + if(! $this->usernameIsValid()) + { + return false; + } + + return true; + } + + private function usernameIsValid() + { + $factory = $this->getFactory(); + $medb = $factory->loadById($this->getId(), false); + + if($medb !== null && $medb->getUserName() === $this->getUsername()) + // No change was made + return true; + + if(! $this->isUsernameFree($this->getUsername()) ) + return false; + + return true; + } + } \ No newline at end of file diff --git a/src/admin/controllers/club.php b/src/admin/controllers/club.php index 2983c69..b6114c3 100644 --- a/src/admin/controllers/club.php +++ b/src/admin/controllers/club.php @@ -28,7 +28,7 @@ class ClubsControllerClub extends AbstractClubsController ); } - protected function filterRawCheck(&$values) + protected function filterRaw(&$values) { if(is_null($values['charitable'])) $values['charitable'] = false; diff --git a/src/admin/controllers/user.php b/src/admin/controllers/user.php index b2a2a67..4fd6a49 100644 --- a/src/admin/controllers/user.php +++ b/src/admin/controllers/user.php @@ -18,7 +18,7 @@ class ClubsControllerUser extends AbstractClubsController return ClubsUser::isUserNameFree($username, $id); } - protected function getNameOfElement() + protected function getSingleBaseName() { return 'user'; } @@ -38,49 +38,44 @@ class ClubsControllerUser extends AbstractClubsController ); } - /** - * {@inheritDoc} - * @see AbstractClubsController::checkData() - */ - protected function rawDataIsValid($values, $isNew, $obj) + + protected function rawDataIsValid($values) { - if(! parent::rawDataIsValid($values, $isNew, $obj)) + if(! parent::rawDataIsValid($values)) return false; - // TODO Auto-generated method stub - if(isset($values['pwd']) && strlen($values['pwd']) > 0) + if($this->passwordIsSet($values)) { - $pwd = $values['pwd']; - $pwdConfirm = $values['pwdConfirm']; - - if(trim($pwd) != trim($pwdConfirm)) - { - Factory::getApplication()->enqueueMessage('Die Passwörter stimmen nicht überein.', 'error'); + if( ! $this->passwordIsValid($values)) return false; - } - - if(! ClubsUser::checkPasswordStrength(trim($pwd))) - { - Factory::getApplication()->enqueueMessage('Das Passwort ist zu schwach.', 'error'); - return false; - } - - } - else - { - if($isNew) - { - Factory::getApplication()->enqueueMessage('Für einen neuen Benutzer muss ein Passwort vergeben werden.', 'error'); - return false; - } } - if(! $this->checkUserName(trim($values['user']), $obj)) + return true; + } + + private function passwordIsSet($values) + { + return isset($values['pwd']) && strlen($values['pwd']) > 0; + } + + private function passwordIsValid($values) + { + $pwd = $values['pwd']; + $pwdConfirm = $values['pwdConfirm']; + + if(trim($pwd) != trim($pwdConfirm)) { - Factory::getApplication()->enqueueMessage('Username ' . $$values['user'] . ' ist nicht gültig.', 'error'); + Factory::getApplication()->enqueueMessage('Die Passwörter stimmen nicht überein.', 'error'); return false; } + // FIXME Check password strength +// if(! ClubsUser::checkPasswordStrength(trim($pwd))) +// { +// Factory::getApplication()->enqueueMessage('Das Passwort ist zu schwach.', 'error'); +// return false; +// } + return true; } @@ -112,8 +107,55 @@ class ClubsControllerUser extends AbstractClubsController $this->applyDataToObject($obj, $values, $mapping); } + + protected function getFactory() + { + return new CommonClubsModelFactoryUser(); + } + /** + * + * {@inheritDoc} + * @see AbstractClubsController::filterObject() + * @param CommonClubsModelUser $obj + */ + protected function filterObject($obj, $values) + { +// if($obj->isNew() && (empty($values['pwd']) || strlen($values['pwd']) == 0) ) + + if(isset($values['pwd']) && strlen($values['pwd']) > 0) + { + $obj->setPassword($values['pwd']); + } + } + + /** + * {@inheritDoc} + * @see AbstractClubsController::objectValid() + * @param CommonClubsModelUser $obj + */ + protected function objectValid($obj) + { + if(! $obj->isPasswordSet()) + { + Factory::getApplication()->enqueueMessage('Kein Passwort wurde vergeben.', 'error'); + return false; + } + + return true; + } + protected function filterRaw(&$values) + { + unset($values['password']); + } + protected function additionalData() + { + return array( + 'pwd' => new CommonClubsControllerMappingString('Passwort'), + 'pwdConfirm' => new CommonClubsControllerMappingString('Passwortwiederholung') + ); + } }