/** * Get Auth result * * @param \Phire\Table\UserTypes $type * @return string */ public function getAuthResult($type) { $result = null; if (!$this->isValid()) { $result = $this->getResultMessage(); } else { $user = $this->getUser(); $session = Table\UserSessions::findBy(array('user_id' => $user['id'])); if (!$type->multiple_sessions && isset($session->id)) { $result = 'Multiple sessions are not allowed. Someone is already logged on from ' . $session->ip . '.'; } else { if (!$type->mobile_access && \Pop\Web\Mobile::isMobileDevice()) { $result = 'Mobile access is not allowed.'; } else { if (!$user['verified']) { $result = 'The user is not verified.'; } else { if ($type->id != $user['type_id']) { $userType = Table\UserTypes::findById($user['type_id']); if (isset($userType->id) && !$userType->global_access) { $result = 'The user is not allowed in this area.'; } } } } } } return $result; }
/** * Get all roles method * * @param string $sort * @param string $page * @return void */ public function getAll($sort = null, $page = null) { $order = $this->getSortOrder($sort, $page); $order['field'] = $order['field'] == 'id' ? DB_PREFIX . 'user_sessions.id' : $order['field']; // Create SQL object to get session data $sql = Table\UserSessions::getSql(); $sql->select(array(0 => DB_PREFIX . 'user_sessions.id', 1 => DB_PREFIX . 'user_types.type', 2 => DB_PREFIX . 'users.username', 3 => DB_PREFIX . 'user_sessions.ip', 4 => DB_PREFIX . 'user_sessions.user_id', 5 => DB_PREFIX . 'user_sessions.ua', 6 => DB_PREFIX . 'user_sessions.start', 7 => DB_PREFIX . 'users.type_id'))->join(DB_PREFIX . 'users', array('user_id', 'id'), 'LEFT JOIN')->join(DB_PREFIX . 'user_types', array(DB_PREFIX . 'users.type_id', 'id'), 'LEFT JOIN')->orderBy($order['field'], $order['order']); if (null !== $order['limit']) { $sql->select()->limit($order['limit'])->offset($order['offset']); } $searchByMarked = null; $searchByAry = array(); $types = Table\UserTypes::findAll(); foreach ($types->rows as $type) { $searchByAry[$type->id] = $type->type; } if (isset($_GET['search_by'])) { $count = Table\UserSessions::getCountOfType((int) $_GET['search_by']); $searchByMarked = (int) $_GET['search_by']; $sql->select()->where()->equalTo('type_id', (int) $_GET['search_by']); } else { $count = Table\UserSessions::getCount(); } // Execute SQL query $sessions = Table\UserSessions::execute($sql->render(true)); if ($this->data['acl']->isAuth('Phire\\Controller\\Phire\\User\\SessionsController', 'remove')) { $removeCheckbox = '<input type="checkbox" name="remove_sessions[]" id="remove_sessions[{i}]" value="[{id}]" />'; $removeCheckAll = '<input type="checkbox" id="checkall" name="checkall" value="remove_sessions" />'; $submit = array('class' => 'remove-btn', 'value' => $this->i18n->__('Remove')); } else { $removeCheckbox = ' '; $removeCheckAll = ' '; $submit = array('class' => 'remove-btn', 'value' => $this->i18n->__('Remove'), 'style' => 'display: none;'); } if ($this->data['acl']->isAuth('Phire\\Controller\\Phire\\User\\IndexController', 'edit')) { $username = '******' . BASE_PATH . APP_URI . '/users/edit/[{user_id}]">[{username}]</a>'; } else { $username = '******'; } $options = array('form' => array('id' => 'session-remove-form', 'action' => BASE_PATH . APP_URI . '/users/sessions/remove', 'method' => 'post', 'process' => $removeCheckbox, 'submit' => $submit), 'table' => array('headers' => array('id' => '<a href="' . BASE_PATH . APP_URI . '/users/sessions?sort=id">#</a>', 'type' => '<a href="' . BASE_PATH . APP_URI . '/users/sessions?sort=type">' . $this->i18n->__('Type') . '</a>', 'username' => '<a href="' . BASE_PATH . APP_URI . '/users/sessions?sort=type">' . $this->i18n->__('Username') . '</a>', 'ip' => $this->i18n->__('IP'), 'ua' => $this->i18n->__('User Agent'), 'started' => '<a href="' . BASE_PATH . APP_URI . '/users/sessions?sort=start">' . $this->i18n->__('Started') . '</a>', 'process' => $removeCheckAll), 'class' => 'data-table', 'cellpadding' => 0, 'cellspacing' => 0, 'border' => 0), 'separator' => '', 'date' => $this->config->datetime_format, 'exclude' => array('type_id', 'user_id', 'start', 'process' => array('id' => $this->data['user']->sess_id)), 'username' => $username, 'indent' => ' '); $sessAry = array(); foreach ($sessions->rows as $session) { $session->started = date($this->config->datetime_format, strtotime($session->start)) . ' (' . \Pop\Feed\Format\AbstractFormat::calculateTime($session->start) . ')'; $sessAry[] = $session; } if (isset($sessAry[0])) { $this->data['table'] = Html::encode($sessAry, $options, $this->config->pagination_limit, $this->config->pagination_range, $count); $this->data['searchBy'] = new \Pop\Form\Element\Select('search_by', $searchByAry, $searchByMarked); } }
/** * Prepare view method * * @param string $template * @param array $data * @return void */ public function prepareView($template = null, array $data = array()) { $site = \Phire\Table\Sites::getSite(); if (null !== $template) { $template = $this->getCustomView($template, $site); } $sess = \Pop\Web\Session::getInstance(); $config = \Phire\Table\Config::getSystemConfig(); $i18n = \Phire\Table\Config::getI18n(); $this->live = (bool) $config->live; $jsVars = null; $this->view = View::factory($template, $data); $this->view->set('base_path', $site->base_path)->set('content_path', CONTENT_PATH); // Check for an override Phire theme for the header/footer if (file_exists($site->document_root . $site->base_path . CONTENT_PATH . '/extensions/themes/phire/header.phtml') && file_exists($site->document_root . $site->base_path . CONTENT_PATH . '/extensions/themes/phire/footer.phtml')) { $this->view->set('phireHeader', $site->document_root . $site->base_path . CONTENT_PATH . '/extensions/themes/phire/header.phtml')->set('phireFooter', $site->document_root . $site->base_path . CONTENT_PATH . '/extensions/themes/phire/footer.phtml'); // Else, just use the default header/footer } else { $this->view->set('phireHeader', $site->document_root . $site->base_path . APP_PATH . '/vendor/Phire/view/phire/header.phtml')->set('phireFooter', $site->document_root . $site->base_path . APP_PATH . '/vendor/Phire/view/phire/footer.phtml'); } if (isset($this->view->assets)) { $jsVars = '?lang=' . $config->default_language; } if (isset($sess->user)) { if (isset($this->sess->user->last_action)) { $this->sess->user->last_action = date('Y-m-d H:i:s'); } // Set the timeout warning, giving a 30 second buffer to act if (isset($this->view->assets)) { if (isset($this->view->acl) && $this->view->acl->getType()->session_expiration > 0 && $this->view->acl->getType()->timeout_warning) { $exp = $this->view->acl->getType()->session_expiration * 60 - 30; $uri = $site->base_path . (strtolower($this->view->acl->getType()->type) != 'user' ? '/' . strtolower($this->view->acl->getType()->type) : APP_URI); $jsVars .= '&_exp=' . $exp . '&_base=' . urlencode($uri); } } $this->view->set('user', $sess->user)->set('role', \Phire\Table\UserRoles::getRole($sess->user->role_id))->set('globalAccess', $sess->user->global_access); if (isset($this->view->phireNav) && isset($this->view->acl) && $this->view->acl->hasRole($this->view->role->getName())) { $this->view->phireNav->setConfig(array('top' => array('node' => 'ul', 'id' => 'phire-nav'))); $this->view->phireNav->setAcl($this->view->acl); $this->view->phireNav->setRole($this->view->role); $tree = $this->view->phireNav->getTree(); // If the sub-children haven't been added yet if (isset($tree[0])) { // And any user types to the main phire nav $userTypes = \Phire\Table\UserTypes::findAll('id ASC'); if (isset($userTypes->rows)) { foreach ($userTypes->rows as $type) { $perm = 'index_' . $type->id; if ($this->view->acl->isAuth('Phire\\Controller\\Phire\\User\\IndexController', 'index') && $this->view->acl->isAuth('Phire\\Controller\\Phire\\User\\IndexController', 'index_' . $type->id)) { $perm = 'index'; } $this->view->phireNav->addLeaf('Users', array('name' => ucwords(str_replace('-', ' ', $type->type)), 'href' => 'index/' . $type->id, 'acl' => array('resource' => 'Phire\\Controller\\Phire\\User\\IndexController', 'permission' => $perm)), 1); } } // Set the language $tree = $this->view->phireNav->getTree(); foreach ($tree as $key => $value) { if (isset($value['name'])) { $tree[$key]['name'] = $i18n->__($value['name']); if (isset($value['children']) && count($value['children']) > 0) { foreach ($value['children'] as $k => $v) { if ($v['name'] == 'Fields' && isset($tree[$key]['children'][$k]['children'][0]['name'])) { $tree[$key]['children'][$k]['children'][0]['name'] = $i18n->__($tree[$key]['children'][$k]['children'][0]['name']); } $tree[$key]['children'][$k]['name'] = $i18n->__($v['name']); } } } } $this->view->phireNav->setTree($tree); } $this->view->phireNav->rebuild(); $this->view->phireNav->nav()->setIndent(' '); } } if (isset($this->view->assets)) { $this->view->assets = str_replace('jax.3.2.0.min.js', 'jax.3.2.0.min.js' . $jsVars, $this->view->assets); } if (isset($sess->errors)) { $this->view->set('errors', $sess->errors); } // Set config object and system/site default data $this->view->set('i18n', $i18n)->set('system_title', $config->system_title)->set('system_email', $config->system_email)->set('site_title', $config->site_title)->set('base_path', $config->base_path)->set('separator', $config->separator)->set('default_language', $config->default_language)->set('datetime_format', $config->datetime_format); }
/** * Send password reminder to user * * @param string $email * @param \Pop\Config $config * @return void */ public function sendReminder($email, $config) { $encOptions = $config->encryptionOptions->asArray(); $user = Table\Users::findBy(array('email' => $email)); if (isset($user->id)) { $type = Table\UserTypes::findById($user->type_id); if ($type->password_encryption == Auth\Auth::ENCRYPT_NONE) { $newPassword = $this->password; $newEncPassword = $newPassword; $msg = $this->i18n->__('Your username and password is:'); } else { $newPassword = (string) String::random(8, String::ALPHANUM); $newEncPassword = self::encryptPassword($newPassword, $type->password_encryption, $encOptions); $msg = $this->i18n->__('Your password has been reset for security reasons. Your username and new password is:'); } // Save new password $user->password = $newEncPassword; $user->save(); // Get base path and domain $basePath = strtolower($type->type) != 'user' ? BASE_PATH . '/' . strtolower($type->type) : BASE_PATH . APP_URI; $domain = str_replace('www.', '', $_SERVER['HTTP_HOST']); // Set recipient $rcpt = array('name' => $user->username, 'email' => $user->email, 'username' => $user->username, 'password' => $newPassword, 'login' => 'http://' . $_SERVER['HTTP_HOST'] . $basePath . '/login', 'domain' => $domain, 'message' => $msg); if (file_exists($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/extensions/themes/phire/mail/forgot.txt')) { $mailTmpl = file_get_contents($_SERVER['DOCUMENT_ROOT'] . BASE_PATH . CONTENT_PATH . '/extensions/themes/phire/mail/forgot.txt'); } else { $mailTmpl = file_get_contents(__DIR__ . '/../../../view/phire/mail/forgot.txt'); } $mailTmpl = str_replace(array('Dear', 'Here is your password for', 'You can login at:', 'Thank You'), array($this->i18n->__('Dear'), $this->i18n->__('Here is your password for'), $this->i18n->__('You can login at:'), $this->i18n->__('Thank You')), $mailTmpl); // Send reminder $mail = new Mail($domain . ' - ' . $this->i18n->__('Password Reset'), $rcpt); $mail->from(Table\Config::findById('reply_email')->value); $mail->setText($mailTmpl); $mail->send(); } }
/** * Get the init field values * * @param int $rid * @param \Pop\Config $config * @return array */ protected function getInitFields($rid = 0, $config = null) { // Get types for the user role $typesAry = array(); $types = UserTypes::findAll('id ASC'); foreach ($types->rows as $type) { $typesAry[$type->id] = $type->type; } // Create initial fields $fields1 = array('name' => array('type' => 'text', 'label' => $this->i18n->__('Name'), 'required' => true, 'attributes' => array('size' => 75, 'style' => 'width: 600px;'))); if ($rid != 0) { $fields1['name']['attributes']['onkeyup'] = "phire.updateTitle('#user-role-title', this);"; } // Get any existing field values $fields2 = array(); $fieldGroups = array(); $model = str_replace('Form', 'Model', get_class($this)); $newFields = \Phire\Model\Field::getByModel($model, 0, $rid); if ($newFields['hasFile']) { $this->hasFile = true; } foreach ($newFields as $key => $value) { if (is_numeric($key)) { $fieldGroups[] = $value; } } // Get available resources with their corresponding permissions $resources = \Phire\Model\UserRole::getResources($config); $classes = array('0' => '(' . $this->i18n->__('All') . ')'); $classTypes = array(); $classActions = array(); foreach ($resources as $key => $resource) { $classes[$key] = $resource['name']; $classTypes[$key] = array('0' => '(' . $this->i18n->__('All') . ')'); $classActions[$key] = array('0' => '(' . $this->i18n->__('All') . ')'); foreach ($resource['types'] as $id => $type) { if ((int) $id != 0) { $classTypes[$key][$id] = $type; } } foreach ($resource['actions'] as $permAction) { $classActions[$key][$permAction] = $permAction; } } asort($classes); // Get any current resource/permission fields if ($rid != 0) { $role = UserRoles::findById($rid); $permissions = null !== $role->permissions ? unserialize($role->permissions) : array(); $i = 1; foreach ($permissions as $permission) { if (strpos($permission['permission'], '_') !== false) { $permAry = explode('_', $permission['permission']); $p = $permAry[0]; $t = $permAry[1]; } else { $p = $permission['permission']; $t = '0'; } $fields2['resource_cur_' . $i] = array('type' => 'select', 'label' => " ", 'value' => $classes, 'marked' => $permission['resource'], 'attributes' => array('onchange' => 'phire.changePermissions(this);', 'style' => 'display: block;')); $fields2['permission_cur_' . $i] = array('type' => 'select', 'value' => $classActions[$permission['resource']], 'marked' => $p, 'attributes' => array('style' => 'display: block; width: 150px;')); $fields2['type_cur_' . $i] = array('type' => 'select', 'value' => $classTypes[$permission['resource']], 'marked' => $t, 'attributes' => array('style' => 'display: block; width: 150px;')); $fields2['allow_cur_' . $i] = array('type' => 'select', 'value' => array('1' => $this->i18n->__('allow'), '0' => $this->i18n->__('deny')), 'marked' => $permission['allow'], 'attributes' => array('style' => 'display: block; width: 150px;')); $fields2['rm_resource_' . $i] = array('type' => 'checkbox', 'value' => array($rid . '_' . $permission['resource'] . '_' . $permission['permission'] => $this->i18n->__('Remove') . '?')); $i++; } } // Create new resource/permission fields $fields3 = array('resource_new_1' => array('type' => 'select', 'label' => '<span class="label-pad-2"><a href="#" onclick="phire.addResource(); return false;">[+]</a> ' . $this->i18n->__('Resource') . '</span><span class="label-pad-2">' . $this->i18n->__('Action') . '</span><span class="label-pad-2">' . $this->i18n->__('Type') . '</span><span class="label-pad-2">' . $this->i18n->__('Permission') . '</span>', 'attributes' => array('onchange' => 'phire.changePermissions(this);', 'style' => 'display: block; margin: 3px 0 3px 0;'), 'value' => $classes), 'permission_new_1' => array('type' => 'select', 'attributes' => array('style' => 'display: block; width: 150px; margin: 3px 0 3px 0;'), 'value' => array('0' => '(' . $this->i18n->__('All') . ')')), 'type_new_1' => array('type' => 'select', 'attributes' => array('style' => 'display: block; width: 150px; margin: 3px 0 3px 0;'), 'value' => array('0' => '(' . $this->i18n->__('All') . ')')), 'allow_new_1' => array('type' => 'select', 'attributes' => array('style' => 'display: block; width: 150px; margin: 3px 0 3px 0;'), 'value' => array('1' => $this->i18n->__('allow'), '0' => $this->i18n->__('deny')))); $fields4 = array('submit' => array('type' => 'submit', 'value' => $this->i18n->__('SAVE'), 'attributes' => array('class' => 'save-btn')), 'update' => array('type' => 'button', 'value' => $this->i18n->__('UPDATE'), 'attributes' => array('onclick' => "return phire.updateForm('#user-role-form', true);", 'class' => 'update-btn')), 'type_id' => array('type' => 'select', 'required' => true, 'label' => $this->i18n->__('User Type'), 'value' => $typesAry, 'attributes' => array('style' => 'width: 200px;')), 'id' => array('type' => 'hidden', 'value' => 0), 'update_value' => array('type' => 'hidden', 'value' => 0)); $allFields = array($fields4, $fields1); if (count($fieldGroups) > 0) { foreach ($fieldGroups as $fg) { $allFields[] = $fg; } } $allFields[] = $fields3; $allFields[] = $fields2; return $allFields; }
/** * User add method * * @return void */ public function add() { $this->prepareView('add.phtml', array('assets' => $this->project->getAssets(), 'acl' => $this->project->getService('acl'), 'phireNav' => $this->project->getService('phireNav'))); // Select user type if (null === $this->request->getPath(1)) { $this->view->set('title', $this->view->i18n->__('Users') . ' ' . $this->view->separator . ' ' . $this->view->i18n->__('Select Type')); $form = new Form\User($this->request->getBasePath() . $this->request->getRequestUri(), 'post', '0', false, 0, $this->project->getService('acl')); // If form is submitted if ($this->request->isPost()) { $form->setFieldValues($this->request->getPost(), array('strip_tags' => null, 'htmlentities' => array(ENT_QUOTES, 'UTF-8'))); // If form is valid, redirect to the second part of the form if ($form->isValid()) { Response::redirect($this->request->getBasePath() . $this->request->getRequestUri() . '/' . $form->type_id); // Else, re-render the form with errors } else { $this->view->set('form', $form); $this->send(); } // Else, render the form } else { $this->view->set('form', $form); $this->send(); } // Else, add user } else { $type = Table\UserTypes::findById($this->request->getPath(1)); // If user type is valid if (isset($type->id)) { $this->view->set('title', $this->view->i18n->__('Users') . ' ' . $this->view->separator . ' ' . ucwords(str_replace('-', ' ', $type->type)) . ' ' . $this->view->separator . ' ' . $this->view->i18n->__('Add'))->set('typeId', $type->id); $form = new Form\User($this->request->getBasePath() . $this->request->getRequestUri(), 'post', $type->id, false, 0); // If form is submitted if ($this->request->isPost()) { $form->setFieldValues($this->request->getPost(), array('strip_tags' => null, 'htmlentities' => array(ENT_QUOTES, 'UTF-8'))); // If form is valid, save new user if ($form->isValid()) { $user = new Model\User(); $user->save($form, $this->project->module('Phire')); $this->view->set('id', $user->id); if (null !== $this->request->getPost('update_value') && $this->request->getPost('update_value') == '1') { Response::redirect($this->request->getBasePath() . '/edit/' . $user->id . '?saved=' . time()); } else { if (null !== $this->request->getQuery('update')) { $this->sendJson(array('redirect' => $this->request->getBasePath() . '/edit/' . $user->id . '?saved=' . time(), 'updated' => '', 'form' => 'user-form')); } else { Response::redirect($this->request->getBasePath() . '/index/' . $this->request->getPath(1) . '?saved=' . time()); } } // Else, re-render form with errors } else { if (null !== $this->request->getQuery('update')) { $this->sendJson($form->getErrors()); } else { $this->view->set('form', $form); $this->send(); } } // Else, render form } else { $this->view->set('form', $form); $this->send(); } // Else, redirect } else { Response::redirect($this->request->getBasePath() . '/add'); } } }
/** * Initialize the ACL object, checking for user types and user roles * * @return void */ protected function initAcl() { // Get the user type from either session or the URI $sess = \Pop\Web\Session::getInstance(); $type = str_replace(BASE_PATH, '', $_SERVER['REQUEST_URI']); // If the URI matches the system user URI if (substr($type, 0, strlen(APP_URI)) == APP_URI) { $type = 'user'; // Else, set user type } else { $type = substr($type, 1); if (strpos($type, '/') !== false) { $type = substr($type, 0, strpos($type, '/')); } } // Create the type object and pass it to the Acl object if (isset($sess->user->type_id)) { $typeObj = \Phire\Table\UserTypes::findById($sess->user->type_id); } else { $typeObj = \Phire\Table\UserTypes::findBy(array('type' => $type)); } $this->getService('acl')->setType($typeObj); // Set the roles for this user type in the Acl object $perms = \Phire\Table\UserRoles::getAllRoles($typeObj->id); if (count($perms['roles']) > 0) { foreach ($perms['roles'] as $role) { $this->getService('acl')->addRole($role); } } // Set up the ACL object's resources and permissions if (count($perms['resources']) > 0) { foreach ($perms['resources'] as $role => $perm) { if (count($perm['allow']) > 0) { foreach ($perm['allow'] as $resource => $p) { $this->getService('acl')->addResource($resource); if (count($p) > 0) { $this->getService('acl')->allow($role, $resource, $p); } else { $this->getService('acl')->allow($role, $resource); } } } else { $this->getService('acl')->allow($role); } if (count($perm['deny']) > 0) { foreach ($perm['deny'] as $resource => $p) { $this->getService('acl')->addResource($resource); if (count($p) > 0) { $this->getService('acl')->deny($role, $resource, $p); } else { $this->getService('acl')->deny($role, $resource); } } } } } }
/** * Remove user role * * @param array $post * @return void */ public function remove(array $post) { if (isset($post['remove_roles'])) { foreach ($post['remove_roles'] as $id) { $role = Table\UserRoles::findById($id); if (isset($role->id)) { $role->delete(); } $sql = Table\UserTypes::getSql(); if ($sql->getDbType() == \Pop\Db\Sql::SQLITE) { $sql->update(array('default_role_id' => null))->where()->equalTo('default_role_id', $role->id); Table\UserTypes::execute($sql->render(true)); } FieldValue::remove($id); } } }
/** * Get the init field values * * @param int $tid * @param boolean $profile * @param int $uid * @param string $action * @param boolean $register * @return array */ protected function getInitFields($tid = 0, $profile = false, $uid = 0, $action, $register = false) { $type = Table\UserTypes::findById($tid); $fields1 = array(); // Continue setting up initial user fields $fields1['email1'] = array('type' => 'text', 'label' => $this->i18n->__('Email'), 'required' => true, 'attributes' => array('size' => 30), 'validators' => new Validator\Email()); if ($type->email_verification) { $fields1['email2'] = array('type' => 'text', 'label' => $this->i18n->__('Re-Type Email'), 'required' => true, 'attributes' => array('size' => 30), 'validators' => new Validator\Email()); } // If not email as username, create username field if (!$type->email_as_username) { $fields2 = array('username' => array('type' => 'text', 'label' => $this->i18n->__('Username'), 'required' => true, 'attributes' => array('size' => 30), 'validators' => array(new Validator\AlphaNumeric(), new Validator\LengthGte(4)))); if ($uid != 0) { $fields2['username']['attributes']['onkeyup'] = "phire.updateTitle('#username-title', this);"; } } else { $fields2 = array(); if ($uid != 0) { $fields1['email1']['attributes']['onkeyup'] = "phire.updateTitle('#username-title', this);"; } } // Continue setting up initial user fields if ($type->login) { $fields3 = array('password1' => array('type' => 'password', 'label' => $this->i18n->__('Enter Password'), 'required' => true, 'attributes' => array('size' => 30), 'validators' => new Validator\LengthGte(6)), 'password2' => array('type' => 'password', 'label' => $this->i18n->__('Re-Type Password'), 'required' => true, 'attributes' => array('size' => 30), 'validators' => new Validator\LengthGte(6))); } else { $fields3 = array(); } $fieldGroups = array(); $dynamicFields = false; $model = str_replace('Form', 'Model', get_class($this)); $newFields = \Phire\Model\Field::getByModel($model, $tid, $uid); if ($newFields['dynamic']) { $dynamicFields = true; } if ($newFields['hasFile']) { $this->hasFile = true; } foreach ($newFields as $key => $value) { if (is_numeric($key)) { $fieldGroups[] = $value; } } $fields4 = array(); if ($register) { $site = Table\Sites::getSite(); if ($type->use_csrf) { $fields4['csrf'] = array('type' => 'csrf', 'value' => \Pop\Filter\String::random(8)); } if ($type->use_captcha) { $fields4['captcha'] = array('type' => 'captcha', 'label' => $this->i18n->__('Enter Code'), 'captcha' => '<br /><img id="captcha-image" src="' . $site->base_path . '/captcha" /><br /><a class="reload-link" href="#" onclick="document.getElementById(\'captcha-image\').src = \'' . $site->base_path . '/captcha?reload=1\';return false;">' . $this->i18n->__('Reload') . '</a>', 'attributes' => array('size' => 5)); } } // Finish the initial fields $fields4['submit'] = array('type' => 'submit', 'value' => strpos($action, '/register') !== false ? $this->i18n->__('REGISTER') : $this->i18n->__('SAVE'), 'attributes' => array('class' => strpos($action, '/install/user') !== false || $profile ? 'update-btn' : 'save-btn')); if ($profile) { $fields4['submit']['label'] = ' '; $fields4['submit']['attributes']['style'] = 'width: 250px;'; $fields4['profile'] = array('type' => 'hidden', 'value' => 1); $sess = \Pop\Web\Session::getInstance(); if (isset($sess->reset_pwd)) { $fields4['reset_pwd'] = array('type' => 'hidden', 'value' => 1); } } if (!$profile) { $fields4['update'] = array('type' => 'button', 'value' => $this->i18n->__('Update'), 'attributes' => array('onclick' => "return phire.updateForm('#user-form', " . ($this->hasFile || $dynamicFields ? 'true' : 'false') . ");", 'class' => 'update-btn')); } $fields4['type_id'] = array('type' => 'hidden', 'value' => $tid); $fields4['id'] = array('type' => 'hidden', 'value' => 0); if (!$profile) { $fields4['update_value'] = array('type' => 'hidden', 'value' => 0); } // If not profile if (!$profile) { // Get roles for user type $rolesAry = array('0' => '(' . $this->i18n->__('Blocked') . ')'); if ($tid != 0) { $roles = Table\UserRoles::findBy(array('type_id' => $tid), 'id ASC'); foreach ($roles->rows as $role) { $rolesAry[$role->id] = $role->name; } } $siteIds = array('0' => $_SERVER['HTTP_HOST']); $sites = Table\Sites::findAll(); foreach ($sites->rows as $site) { $siteIds[(string) $site->id] = $site->domain; } $fields4['role_id'] = array('type' => 'select', 'required' => true, 'label' => $this->i18n->__('User Role'), 'value' => $rolesAry, 'marked' => $type->default_role_id); $fields4['verified'] = array('type' => 'select', 'label' => $this->i18n->__('Verified'), 'value' => array('1' => $this->i18n->__('Yes'), '0' => $this->i18n->__('No')), 'marked' => '0'); $fields4['failed_attempts'] = array('type' => 'text', 'label' => $this->i18n->__('Failed Attempts'), 'attributes' => array('size' => 3)); $fields4['site_ids'] = array('type' => 'checkbox', 'label' => $this->i18n->__('Allowed Sites'), 'value' => $siteIds); } if (strpos($action, '/install/user') !== false || $profile) { $allFields = array($fields1, $fields2, $fields3); if (count($fieldGroups) > 0) { foreach ($fieldGroups as $fg) { $allFields[] = $fg; } } $allFields[] = $fields4; } else { $allFields = array($fields4, $fields1, $fields2, $fields3); if (count($fieldGroups) > 0) { foreach ($fieldGroups as $fg) { $allFields[] = $fg; } } } return $allFields; }