fcnNames = array(); $this->registerAll(); } abstract protected function registerAll(); protected function registerFcn($fcnName, $methodName) { $this->fcnNames[$fcnName] = $methodName; } public function handle($fcnName, $user, $post) { if(empty($this->fcnNames[$fcnName])) throw new Exception(); $method = $this->fcnNames[$fcnName]; $this->$method($user, $post); } protected function checkLen($value, $len, $msg) { if(strlen($value) < 5) throw new InvalidUserDataException($msg); } } class ClubsHelperControllerUser extends AbstractClubsHelperController { /** * @param string $fcnName * @param CommonClubsModelUser $user * @param JInput $post * @throws Exception * @return string */ public function parse($fcnName, $user, $post) { switch($fcnName) { case 'name': $this->editName($user, $post); break; case 'username': $this->editUsername($user, $post); break; case 'address': $this->editAddress($user, $post); break; case 'city': $this->editCity($user, $post); break; case 'mail': $this->editMail($user, $post); break; case 'phone': $this->editPhone($user, $post); break; case 'mobile': $this->editMobile($user, $post); break; default: throw new Exception(); } return "index.php?option=com_clubs&view=part&type=user.$fcnName"; } protected function registerAll() { $this->registerFcn('name', 'editName'); $this->registerFcn('username', 'editUsername'); $this->registerFcn('address', 'editAddress'); $this->registerFcn('city', 'editCity'); $this->registerFcn('mail', 'editMail'); $this->registerFcn('phone', 'editPhone'); $this->registerFcn('mobile', 'editMobile'); } protected function editName($user, $post) { $name = trim($post->getString('value')); $this->checkLen($name, 5, "Der Name muss mindestens 5 Zeichen lang sein."); $user->setName($name); $user->save(); } protected function editUsername($user, $post) { $username = $post->getString('value'); $validator = new ClubsHelperValidator(); $res = $validator->validateUsername($user, $username); $this->checkLen($username, 5, 'Der Benutzername muss mindestens 5 Zeichen lang sein.'); switch($res) { case ClubsHelperValidator::USERNAME_VALID: $user->setUsername($username); $user->save(); return; case ClubsHelperValidator::USERNAME_NOT_FREE: throw new InvalidUserDataException('Der Benutzername ist bereits vergeben.'); case ClubsHelperValidator::USERNAME_NOT_OK: throw new InvalidUserDataException('Der Benutzername ist nicht korrekt formaitert. Er muss mit einem Buchstaben beginnen.'); default: throw new Exception(); } } protected function editAddress($user, $post) { $address = trim($post->getString('value')); $this->checkLen($address, 10, 'Die Adresse muss mindestens 10 Zeichen lang sein.'); $parts = array_filter(explode("\n", str_replace("\r", "\n", $address))); if(count($parts) < 2) throw new InvalidUserDataException('Die Adresse muss mindestens aus 2 Zeilen bestehen.'); $addr = join("\n", $parts); $user->setAddress($addr); $user->save(); } protected function editCity($user, $post) { $city = trim($post->getString('value')); $this->checkLen($city, 4, 'Die Stadt muss aus mindestens 4 Zeichen bestehen.'); $user->setCity($city); $user->save(); } protected function editMail($user, $post) { $mail = trim($post->getString('value')); $this->checkLen($mail, 8, "Die Mail-Adresse muss aus mindestens 8 Zeichen bestehen."); if(! preg_match('/..*@..*\...*/', $mail)) throw new InvalidUserDataException('Die Mail-Adresse hat kein gültiges Format.'); $user->setMail($mail); $user->save(); } protected function editPhone($user, $post) { $phone = trim($post->getString('value')); if(strlen($phone) == 0) { $user->setPhone(null); $user->save(); return; } $validator = new ClubsHelperValidator(); $phonePlain = ''; $phoneDigits = ''; $valid = $validator->validatePhoneNumber($phone, $phonePlain, $phoneDigits); $this->checkLen($phoneDigits, 6, 'Die Telefonnummer muss mindestens 6 Ziffern umfassen.'); if(! $valid) throw new InvalidUserDataException('Keine gültige Telefonnummer gegeben. Erlaubte Zeichen sind 0-9, -, + und Leerzeichen. Bitte Vorwahl mit angeben.'); $user->setPhone($phonePlain); $user->save(); } protected function editMobile($user, $post) { $mobile = trim($post->getString('value')); if(strlen($mobile) == 0) { $user->setMobile(null); $user->save(); return; } $validator = new ClubsHelperValidator(); $mobilePlain = ''; $mobileDigits = ''; $valid = $validator->validatePhoneNumber($mobile, $mobilePlain, $mobileDigits); $this->checkLen($mobileDigits, 6, 'Die Handynummer muss mindestens 6 Ziffern umfassen.'); if(! $valid) throw new InvalidUserDataException('Keine gültige Handynummer gegeben. Erlaubte Zeichen sind 0-9, -, + und Leerzeichen. Bitte Vorwahl mit angeben.'); $user->setMobile($mobilePlain); $user->save(); } } class ClubsHelperControllerClub extends AbstractClubsHelperController { protected function registerAll() {} } class ClubsControllerParts extends BaseController { public function edit() { $auth = new ClubsHelperAuth(); $user = $auth->getCurrentUser(); $app = Factory::getApplication(); $post = $app->input->post; try { $ret = $this->callMethod($user, $post); echo new JsonResponse($ret); } catch(UserException $e) { echo new JsonResponse($e); } } /** * @param CommonClubsModelUser $user * @param JInput $post */ private function callMethod($user, $post) { $partname = $post->getCmd('partname'); if(! preg_match('/.*\..*/', $partname)) throw new Exception(); list($objname, $fcnName) = explode('.', $partname, 2); switch($objname) { case 'user': $obj = new ClubsHelperControllerUser(); $obj->handle($fcnName, $user, $post); break; case 'club': $obj = new ClubsHelperControllerClub(); $obj->handle($fcnName, $user, $post); // TODO User!?!?! break; default: throw new Exception(); } return "index.php?option=com_clubs&view=part&type=$partname"; } }