tao-test/app/tao/actions/form/class.Users.php

261 lines
10 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2008-2010 (original work) Deutsche Institut für Internationale Pädagogische Forschung (under the project TAO-TRANSFER);
* 2009-2012 (update and modification) Public Research Centre Henri Tudor (under the project TAO-SUSTAIN & TAO-DEV);
*
*/
use oat\generis\model\GenerisRdf;
use oat\generis\model\user\PasswordConstraintsService;
use oat\tao\helpers\ApplicationHelper;
use oat\generis\model\user\UserRdf;
use oat\oatbox\user\UserLanguageServiceInterface;
use oat\tao\model\controller\SignedFormInstance;
/**
* This container initialize the user edition form.
*
* @access public
* @author Joel Bout, <joel.bout@tudor.lu>
* @package tao
*/
class tao_actions_form_Users extends SignedFormInstance
{
// --- ASSOCIATIONS ---
// --- ATTRIBUTES ---
/**
* Short description of attribute user
*
* @access protected
* @var Resource
*/
protected $user;
/**
* Short description of attribute formName
*
* @access protected
* @var string
*/
protected $formName = '';
// --- OPERATIONS ---
/**
* Short description of method __construct
*
* @access public
* @author Joel Bout, <joel.bout@tudor.lu>
*
* @param core_kernel_classes_Class $clazz
* @param core_kernel_classes_Resource $user
* @param boolean $forceAdd
* @param array $options
*
* @throws common_exception_Error
*/
public function __construct(
core_kernel_classes_Class $clazz,
core_kernel_classes_Resource $user = null,
$forceAdd = false,
$options = []
) {
if (empty($clazz)) {
throw new Exception('Set the user class in the parameters');
}
$this->formName = 'user_form';
$service = tao_models_classes_UserService::singleton();
if (!empty($user)) {
$this->user = $user;
$options['mode'] = 'edit';
} else {
if (isset($_POST[$this->formName . '_sent']) && isset($_POST['uri'])) {
$this->user = new core_kernel_classes_Resource(tao_helpers_Uri::decode($_POST['uri']));
} else {
$this->user = $service->createInstance($clazz, $service->createUniqueLabel($clazz));
}
$options['mode'] = 'add';
}
if ($forceAdd) {
$options['mode'] = 'add';
}
$userLangService = \oat\oatbox\service\ServiceManager::getServiceManager()->get(UserLanguageServiceInterface::class);
if (!$userLangService->isDataLanguageEnabled()) {
$options['excludedProperties'][] = UserRdf::PROPERTY_DEFLG;
}
$options['topClazz'] = GenerisRdf::CLASS_GENERIS_USER;
parent::__construct($clazz, $this->user, $options);
}
/**
* Short description of method getUser
*
* @access public
* @author Joel Bout, <joel.bout@tudor.lu>
* @return core_kernel_classes_Resource
*/
public function getUser()
{
return $this->user;
}
/**
* Short description of method initForm
*
* @access protected
* @author Joel Bout, <joel.bout@tudor.lu>
* @return mixed
*/
protected function initForm()
{
parent::initForm();
$this->form->setName($this->formName);
$actions = tao_helpers_form_FormFactory::getCommonActions('top');
$this->form->setActions($actions, 'top');
$this->form->setActions($actions, 'bottom');
}
/**
* Short description of method initElements
*
* @access protected
* @author Joel Bout, <joel.bout@tudor.lu>
*/
protected function initElements()
{
if (!isset($this->options['mode'])) {
throw new Exception("Please set a mode into container options ");
}
parent::initElements();
//login field
$loginElement = $this->form->getElement(tao_helpers_Uri::encode(GenerisRdf::PROPERTY_USER_LOGIN));
if ($this->options['mode'] === 'add') {
$loginElement->addValidators([
tao_helpers_form_FormFactory::getValidator('NotEmpty'),
tao_helpers_form_FormFactory::getValidator('Callback', [
'object' => tao_models_classes_UserService::singleton(),
'method' => 'loginAvailable',
'message' => __('This Login is already in use')
])
]);
} else {
$loginElement->setAttributes(['readonly' => 'readonly', 'disabled' => 'disabled']);
}
//set default lang to the languages fields
$langService = tao_models_classes_LanguageService::singleton();
$userLangService = \oat\oatbox\service\ServiceManager::getServiceManager()->get(UserLanguageServiceInterface::class);
if ($userLangService->isDataLanguageEnabled()) {
$dataLangElt = $this->form->getElement(tao_helpers_Uri::encode(GenerisRdf::PROPERTY_USER_DEFLG));
$dataLangElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty'));
$dataUsage = new core_kernel_classes_Resource(tao_models_classes_LanguageService::INSTANCE_LANGUAGE_USAGE_DATA);
$dataOptions = [];
foreach ($langService->getAvailableLanguagesByUsage($dataUsage) as $lang) {
$dataOptions[tao_helpers_Uri::encode($lang->getUri())] = $lang->getLabel();
}
$dataLangElt->setOptions($dataOptions);
}
$uiLangElt = $this->form->getElement(tao_helpers_Uri::encode(GenerisRdf::PROPERTY_USER_UILG));
$uiLangElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty'));
$guiUsage = new core_kernel_classes_Resource(tao_models_classes_LanguageService::INSTANCE_LANGUAGE_USAGE_GUI);
$guiOptions = [];
foreach ($langService->getAvailableLanguagesByUsage($guiUsage) as $lang) {
$guiOptions[tao_helpers_Uri::encode($lang->getUri())] = $lang->getLabel();
}
$uiLangElt->setOptions($guiOptions);
// roles field
$property = new core_kernel_classes_Property(GenerisRdf::PROPERTY_USER_ROLES);
$roles = $property->getRange()->getInstances(true);
$rolesOptions = [];
foreach ($roles as $r) {
$rolesOptions[tao_helpers_Uri::encode($r->getUri())] = $r->getLabel();
}
asort($rolesOptions);
$userService = tao_models_classes_UserService::singleton();
$rolesOptions = $userService->getPermittedRoles($userService->getCurrentUser(), $rolesOptions);
$rolesElt = $this->form->getElement(tao_helpers_Uri::encode($property->getUri()));
$rolesElt->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty'));
$rolesElt->setOptions($rolesOptions);
// password field
$this->form->removeElement(tao_helpers_Uri::encode(GenerisRdf::PROPERTY_USER_PASSWORD));
if ($this->options['mode'] === 'add') {
$pass1Element = tao_helpers_form_FormFactory::getElement('password1', 'Hiddenbox');
$pass1Element->setDescription(__('Password'));
$pass1Element->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty'));
$pass1Element->addValidators(PasswordConstraintsService::singleton()->getValidators());
$pass1Element->setBreakOnFirstError(false);
$this->form->addElement($pass1Element);
$pass2Element = tao_helpers_form_FormFactory::getElement('password2', 'Hiddenbox');
$pass2Element->setDescription(__('Repeat password'));
$pass2Element->addValidators([
tao_helpers_form_FormFactory::getValidator('NotEmpty'),
tao_helpers_form_FormFactory::getValidator('Password', ['password2_ref' => $pass1Element]),
]);
$this->form->addElement($pass2Element);
} else {
if (ApplicationHelper::isDemo()) {
$warning = tao_helpers_form_FormFactory::getElement('warningpass', 'Label');
$warning->setValue(__('Unable to change passwords in demo mode'));
$this->form->addElement($warning);
$this->form->createGroup("pass_group", __("Change the password"), ['warningpass']);
} else {
$pass2Element = tao_helpers_form_FormFactory::getElement('password2', 'Hiddenbox');
$pass2Element->setDescription(__('New password'));
$pass2Element->addValidators(PasswordConstraintsService::singleton()->getValidators());
$pass2Element->setBreakOnFirstError(false);
$this->form->addElement($pass2Element);
$pass3Element = tao_helpers_form_FormFactory::getElement('password3', 'Hiddenbox');
$pass3Element->setDescription(__('Repeat new password'));
$pass3Element->addValidators([
tao_helpers_form_FormFactory::getValidator('Password', ['password2_ref' => $pass2Element]),
]);
$this->form->addElement($pass3Element);
$this->form->createGroup("pass_group", __("Change the password"), ['password2', 'password3']);
if (empty($_POST[$pass2Element->getName()]) && empty($_POST[$pass3Element->getName()])) {
$pass2Element->setForcedValid();
$pass3Element->setForcedValid();
}
}
}
}
}