diff --git a/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocument.php b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocument.php new file mode 100644 index 000000000000..5139d5dcb12c --- /dev/null +++ b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocument.php @@ -0,0 +1,98 @@ + + */ +class ilTermsOfServiceDocument extends ActiveRecord +{ + const TABLE_NAME = 'tos_documents'; + + /** + * @var string + * @db_has_field true + * @db_fieldtype integer + * @db_length 4 + * @db_is_primary true + * @con_sequence true + */ + protected $id; + + /** + * @var int + * @con_has_field true + * @con_fieldtype integer + * @con_length 4 + */ + protected $creation_ts = 0; + + /** + * @var int + * @con_has_field true + * @con_fieldtype integer + * @con_length 4 + */ + protected $modification_ts = 0; + + /** + * @var int + * @con_has_field true + * @con_fieldtype integer + * @con_length 4 + */ + protected $owner_usr_id = 0; + + /** + * @var int + * @con_has_field true + * @con_fieldtype integer + * @con_length 4 + */ + protected $sorting = 0; + + /** + * @var string + * @db_has_field true + * @db_fieldtype text + * @db_length 255 + */ + protected $title = ''; + + /** + * @var string + * @db_has_field true + * @db_fieldtype text + * @db_length 255 + */ + protected $last_modified_usr_id = ''; + + /** + * @inheritdoc + */ + static function returnDbTableName() + { + return self::TABLE_NAME; + } + + /** + * @inheritdoc + */ + public function create() + { + $this->setCreationTs(time()); + $this->setModificationTs(time()); + + parent::create(); + } + + /** + * @inheritdoc + */ + public function update() + { + $this->setModificationTs(time()); + + parent::update(); + } +} \ No newline at end of file diff --git a/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentFormGUI.php b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentFormGUI.php new file mode 100644 index 000000000000..68d524a146a3 --- /dev/null +++ b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentFormGUI.php @@ -0,0 +1,153 @@ + + */ +class ilTermsOfServiceDocumentFormGUI extends \ilPropertyFormGUI +{ + /** @var \ilTermsOfServiceDocument */ + protected $document; + + /** @var \ilObjUser */ + protected $user; + + /** @var \\ILIAS\FileUpload\FileUpload */ + protected $fileUpload; + + /** @var string */ + protected $formAction; + + /** @var string */ + protected $saveCommand; + + /** @var string */ + protected $cancelCommand; + + /** @var $bool */ + protected $isEditable = false; + + /** @var string */ + protected $translatedError = ''; + + /** + * ilTermsOfServiceDocumentFormGUI constructor. + * @param \ilTermsOfServiceDocument $document + * @param \ilObjUser $user + * @param \ILIAS\FileUpload\FileUpload $fileUpload + * @param ilLanguage $lng + * @param string $formAction + * @param string $saveCommand + * @param string $cancelCommand + * @param bool $isEditable + */ + public function __construct( + \ilTermsOfServiceDocument $document, + \ilObjUser $user, + \ILIAS\FileUpload\FileUpload $fileUpload, + string $formAction = '', + string $saveCommand = 'saveDocument', + string $cancelCommand = 'showDocuments', + bool $isEditable = false + ) { + $this->document = $document; + $this->user = $user; + $this->fileUpload = $fileUpload; + $this->formAction = $formAction; + $this->saveCommand = $saveCommand; + $this->cancelCommand = $cancelCommand; + $this->isEditable = $isEditable; + + parent::__construct(); + + $this->initForm(); + } + + /** + * + */ + protected function initForm() + { + $this->setTitle($this->lng->txt('tos_form_new_doc_head')); + $this->setFormAction($this->formAction); + + $title = new \ilTextInputGUI($this->lng->txt('tos_form_document_title'), 'title'); + $title->setInfo($this->lng->txt('tos_form_document_title_info')); + $title->setRequired(true); + $title->setDisabled(!$this->isEditable); + $title->setValue($this->document->getText()); + $title->setMaxLength(255); + $this->addItem($title); + + $document = new \ilFileInputGUI($this->lng->txt('tos_form_document'), 'document'); + $document->setInfo($this->lng->txt('tos_form_document_info')); + if (!$this->document->getId()) { + $document->setRequired(true); + } + $document->setDisabled(!$this->isEditable); + $document->setSuffixes(['html']); + $this->addItem($document); + + if ($this->isEditable) { + $this->addCommandButton($this->saveCommand, $this->lng->txt('save')); + } + + $this->addCommandButton($this->cancelCommand, $this->lng->txt('cancel')); + } + + /** + * @return bool + */ + public function hasTranslatedError(): bool + { + return strlen($this->translatedError); + } + + /** + * @return string + */ + public function getTranslatedError(): string + { + return $this->translatedError; + } + + /** + * @return bool + */ + public function saveObject() :bool + { + if (!$this->fillObject()) { + $this->setValuesByPost(); + return false; + } + + $this->document->save(); + + return true; + } + + /** + * + */ + protected function fillObject(): bool + { + if (!$this->checkInput()) { + return false; + } + + if (!$this->fileUpload->hasUploads()) { + return false; + } + + $this->document->setTitle($this->getInput('title')); + + if ($this->document->getId() > 0) { + $this->document->setLastModifiedUsrId($this->user->getId()); + } else { + $this->document->setOwnerUsrId($this->user->getId()); + } + + return true; + } +} \ No newline at end of file diff --git a/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentGUI.php b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentGUI.php new file mode 100644 index 000000000000..c8055406e637 --- /dev/null +++ b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentGUI.php @@ -0,0 +1,318 @@ + + */ +class ilTermsOfServiceDocumentGUI implements \ilTermsOfServiceControllerEnabled +{ + /** @var \ilObjTermsOfService */ + protected $tos; + + /** @var \ilTemplate */ + protected $tpl; + + /** @var \ilCtrl */ + protected $ctrl; + + /** @var \ilLanguage */ + protected $lng; + + /** @var \ilRbacSystem */ + protected $rbacsystem; + + /** @var \ilErrorHandling */ + protected $error; + + /** @var \ilObjUser */ + protected $user; + + /** @var \ilLogger */ + protected $log; + + /** @var ILIAS\UI\Factory */ + protected $uiFactory; + + /** @var ILIAS\UI\Renderer */ + protected $uiRenderer; + + /** @var ServerRequestInterface */ + protected $request; + + /** @var \ilToolbarGUI */ + protected $toolbar; + + /** @var FileUpload */ + protected $fileUpload; + + /** + * ilTermsOfServiceDocumentGUI constructor. + * @param \ilObjTermsOfService $tos + * @param \ilTemplate $tpl + * @param \ilObjUser $user + * @param \ilCtrl $ctrl + * @param \ilLanguage $lng + * @param \ilRbacSystem $rbacsystem + * @param \ilErrorHandling $error + * @param \ilLogger $log + * @param \ilToolbarGUI $toolbar + * @param ServerRequestInterface $request + * @param \ILIAS\UI\Factory $uiFactory + * @param \ILIAS\UI\Renderer $uiRenderer + * @param FileUpload $fileUpload + */ + public function __construct( + \ilObjTermsOfService $tos, + \ilTemplate $tpl, + \ilObjUser $user, + \ilCtrl $ctrl, + \ilLanguage $lng, + \ilRbacSystem $rbacsystem, + \ilErrorHandling $error, + \ilLogger $log, + \ilToolbarGUI $toolbar, + ServerRequestInterface $request, + ILIAS\UI\Factory $uiFactory, + ILIAS\UI\Renderer $uiRenderer, + FileUpload $fileUpload + ) + { + $this->tos = $tos; + $this->tpl = $tpl; + $this->ctrl = $ctrl; + $this->lng = $lng; + $this->rbacsystem = $rbacsystem; + $this->error = $error; + $this->user = $user; + $this->log = $log; + $this->toolbar = $toolbar; + $this->request = $request; + $this->uiFactory = $uiFactory; + $this->uiRenderer = $uiRenderer; + $this->fileUpload = $fileUpload; + } + + /** + * + */ + public function executeCommand() + { + $nextClass = $this->ctrl->getNextClass($this); + $cmd = $this->ctrl->getCmd(); + + if (!$this->rbacsystem->checkAccess('read', $this->tos->getRefId())) { + $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); + } + + switch (strtolower($nextClass)) { + default: + if ($cmd == '' || !method_exists($this, $cmd)) { + $cmd = 'showDocuments'; + } + $this->$cmd(); + break; + } + } + + /** + * + */ + protected function confirmReset() + { + if (!$this->rbacsystem->checkAccess('write', $this->tos->getRefId())) { + $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); + } + + $confirmation = new \ilConfirmationGUI(); + $confirmation->setFormAction($this->ctrl->getFormAction($this, 'confirmReset')); + $confirmation->setConfirm($this->lng->txt('confirm'), 'reset'); + $confirmation->setCancel($this->lng->txt('cancel'), 'showDocuments'); + $confirmation->setHeaderText($this->lng->txt('tos_sure_reset_tos')); + + $this->tpl->setContent($confirmation->getHTML()); + } + + /** + * + */ + protected function reset() + { + if (!$this->rbacsystem->checkAccess('write', $this->tos->getRefId())) { + $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); + } + + $this->tos->resetAll(); + + $this->log->info('Terms of service reset by ' . $this->user->getId() . ' [' . $this->user->getLogin() . ']'); + \ilUtil::sendSuccess($this->lng->txt('tos_reset_successful')); + + $this->showDocuments(); + } + + /** + * + */ + protected function showDocuments() + { + $addDocumentBtn = \ilLinkButton::getInstance(); + $addDocumentBtn->setPrimary(true); + $addDocumentBtn->setUrl($this->ctrl->getLinkTarget($this, 'showAddDocumentForm')); + $addDocumentBtn->setCaption('tos_add_document_btn_label'); + $this->toolbar->addStickyItem($addDocumentBtn); + + $documentTableGui = new \ilTermsOfServiceDocumentTableGUI( + $this, + 'showDocuments', + $this->uiFactory, + $this->uiRenderer + ); + $documentTableGui->setProvider(new ilTermsOfServiceDocumentTableDataProvider()); + $documentTableGui->populate(); + + $this->tpl->setVariable('MESSAGE', $this->getResetMessageBoxHtml()); + $this->tpl->setContent($documentTableGui->getHTML()); + } + + /** + * @return string + */ + protected function getResetMessageBoxHtml(): string + { + if ($this->tos->getLastResetDate() && $this->tos->getLastResetDate()->get(IL_CAL_UNIX) != 0) { + $status = \ilDatePresentation::useRelativeDates(); + \ilDatePresentation::setUseRelativeDates(false); + $resetText = sprintf( + $this->lng->txt('tos_last_reset_date'), + \ilDatePresentation::formatDate($this->tos->getLastResetDate()) + ); + \ilDatePresentation::setUseRelativeDates($status); + } else { + $resetText = $this->lng->txt('tos_never_reset'); + } + + $buttons = []; + if ($this->rbacsystem->checkAccess('write', $this->tos->getRefId())) { + $buttons = [ + $this->uiFactory + ->button() + ->standard($this->lng->txt('tos_reset_tos_for_all_users'), $this->ctrl->getLinkTarget($this, 'confirmReset')) + ]; + } + + return $this->uiRenderer->render( + $this->uiFactory->messageBox() + ->info($resetText) + ->withButtons($buttons) + ); + } + + /** + * @param ilTermsOfServiceDocument $document + * @return ilTermsOfServiceDocumentFormGUI + */ + protected function getDocumentForm(ilTermsOfServiceDocument $document): \ilTermsOfServiceDocumentFormGUI + { + if ($document->getId() > 0) { + $this->ctrl->setParameter($this, 'tos_id', $document->getId()); + } + + $form = new \ilTermsOfServiceDocumentFormGUI( + $document, + $this->user, + $this->fileUpload, + $this->ctrl->getFormAction($this, 'saveAddDocumentForm'), + 'saveAddDocumentForm', + 'showDocuments', + $this->rbacsystem->checkAccess('write', $this->tos->getRefId()) + ); + + return $form; + } + + /** + * + */ + protected function saveAddDocumentForm() + { + if (!$this->rbacsystem->checkAccess('write', $this->tos->getRefId())) { + $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); + } + + $form = $this->getDocumentForm(new ilTermsOfServiceDocument()); + if ($form->saveObject()) { + \ilUtil::sendSuccess($this->lng->txt('saved_successfully'), true); + $this->ctrl->redirect($this, 'settings'); + } else if ($form->hasTranslatedError()) { + \ilUtil::sendFailure($form->getTranslatedError()); + } + + $this->tpl->setContent($form->getHTML()); + } + + /** + * + */ + protected function showAddDocumentForm() + { + $form = $this->getDocumentForm(new ilTermsOfServiceDocument()); + $this->tpl->setContent($form->getHTML()); + } + + /** + * + */ + protected function showEditDocumentForm() + { + $form = $this->getDocumentForm(new ilTermsOfServiceDocument()); + $this->tpl->setContent($form->getHTML()); + + // TODO + } + + /** + * + */ + protected function saveEditDocumentForm() + { + // TODO + } + + /** + * + */ + protected function showDocumentDeletionConfirmation() + { + //tos#:#tos_sure_delete_documents_s#:#Are you sure you want to delete the document? + //tos#:#tos_sure_delete_documents_p#:#Are you sure you want to delete the selected documents? + + } + + /** + * + */ + protected function deleteDocuments() + { + // TODO + //tos#:#tos_deleted_documents_s#:#The document has been deleted. + //tos#:#tos_deleted_documents_p#:#The documents have been deleted. + } + + protected function saveDocumentSorting() + { + + } + + + + /** + * + */ + protected function showCriteria() + { + // TODO + } +} \ No newline at end of file diff --git a/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentTableDataProvider.php b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentTableDataProvider.php new file mode 100644 index 000000000000..733e028bf568 --- /dev/null +++ b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentTableDataProvider.php @@ -0,0 +1,22 @@ + + */ +class ilTermsOfServiceDocumentTableDataProvider implements \ilTermsOfServiceTableDataProvider +{ + /** + * @inheritdoc + */ + public function getList(array $params, array $filter): array + { + $items = \ilTermsOfServiceDocument::orderBy('sorting')->get(); + + return [ + 'items' => $items, + 'cnt' => count($items) + ]; + } +} \ No newline at end of file diff --git a/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentTableGUI.php b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentTableGUI.php new file mode 100644 index 000000000000..86978d1d7541 --- /dev/null +++ b/Services/TermsOfService/classes/Document/class.ilTermsOfServiceDocumentTableGUI.php @@ -0,0 +1,227 @@ + + */ +class ilTermsOfServiceDocumentTableGUI extends \ilTermsOfServiceTableGUI +{ + /** @var ILIAS\UI\Factory */ + protected $uiFactory; + + /** @var ILIAS\UI\Renderer */ + protected $uiRenderer; + + /** @var int */ + protected $factor = 10; + + /** @var int */ + protected $i = 1; + + /** + * ilTermsOfServiceDocumentTableGUI constructor. + * @param \ilTermsOfServiceControllerEnabled $a_parent_obj + * @param string $command + * @param \ILIAS\UI\Factory $uiFactory + * @param \ILIAS\UI\Renderer $uiRenderer + */ + public function __construct( + \ilTermsOfServiceControllerEnabled $a_parent_obj, + string $command, + ILIAS\UI\Factory $uiFactory, + ILIAS\UI\Renderer $uiRenderer + ) { + $this->uiFactory = $uiFactory; + $this->uiRenderer = $uiRenderer; + + $this->setId('tos_documents'); + $this->setFormName('tos_documents'); + + parent::__construct($a_parent_obj, $command); + + $this->setTitle($this->lng->txt('tos_tbl_docs_title')); + $this->setFormAction($this->ctrl->getFormAction($this->getParentObject(), $command)); + + $this->setDefaultOrderDirection('ASC'); + $this->setDefaultOrderField('sorting'); + $this->setExternalSorting(true); + $this->setExternalSegmentation(true); + $this->setLimit(PHP_INT_MAX); + + $this->setRowTemplate('tpl.tos_documents_row.html', 'Services/TermsOfService'); + + $this->setSelectAllCheckbox('tos_id[]'); + $this->addMultiCommand('showDocumentDeletionConfirmation', $this->lng->txt('delete')); + + $this->addCommandButton('saveDocumentSorting', $this->lng->txt('sorting_save')); + } + + /** + * @inheritdoc + */ + protected function getColumnDefinition(): array + { + $i = 0; + + return [ + ++$i => [ + 'field' => 'chb', + 'txt' => '', + 'default' => true, + 'optional' => false, + 'sortable' => false, + 'is_checkbox' => true, + 'width' => '1%' + ], + ++$i => [ + 'field' => 'sorting', + 'txt' => $this->lng->txt('tos_tbl_docs_head_sorting'), + 'default' => true, + 'optional' => false, + 'sortable' => false, + 'width' => '5%' + ], + ++$i => [ + 'field' => 'title', + 'txt' => $this->lng->txt('tos_tbl_docs_head_title'), + 'default' => true, + 'optional' => false, + 'sortable' => false, + 'width' => '25%' + ], + ++$i => [ + 'field' => 'modification_ts', + 'txt' => $this->lng->txt('tos_tbl_docs_head_last_change'), + 'default' => true, + 'optional' => false, + 'sortable' => false + ], + ++$i => [ + 'field' => 'criteria', + 'txt' => $this->lng->txt('tos_tbl_docs_head_criteria'), + 'default' => true, + 'optional' => false, + 'sortable' => false + ], + ++$i => [ + 'field' => 'actions', + 'txt' => $this->lng->txt('actions'), + 'default' => true, + 'optional' => false, + 'sortable' => false, + 'width' => '10%' + ], + ]; + } + + /** + * @param array $data + * @return array + */ + protected function preProcessData(array &$data) + { + foreach ($data['items'] as $key => $document) { + /** ilTermsOfServiceDocument $document */ + + // TODO: Get all relevant data + $data['items'][$key] = [ + 'id' => $document->getId(), + 'title' => $document->getTitle(), + 'modification_ts' => $document->getModificationTs(), + 'content' => '12345' + ]; + } + } + + + /** + * @inheritdoc + */ + protected function prepareRow(array &$row) + { + $row['chb'] = \ilUtil::formCheckbox( + false, + 'tos_id[]', + $row['id'] + ); + + $row['criteria'] = ''; + + $this->ctrl->setParameter($this->getParentObject(), 'tos_id', $row['id']); + + $actions = new \ilAdvancedSelectionListGUI(); + $actions->setId('tos_doc_' . $row['id']); + $actions->setListTitle($this->lng->txt('actions')); + $actions->addItem( + $this->lng->txt('edit'), + '', + $this->ctrl->getLinkTarget($this->getParentObject(), 'showEditDocumentForm') + ); + $actions->addItem( + $this->lng->txt('tos_tbl_docs_action_edit_criteria'), + '', + $this->ctrl->getLinkTarget($this->getParentObject(), 'showCriteria') + ); + $actions->addItem( + $this->lng->txt('delete'), + '', + $this->ctrl->getLinkTarget($this->getParentObject(), 'showDocumentDeletionConfirmation') + ); + $row['actions'] = $actions->getHtml(); + + $this->ctrl->setParameter($this->getParentObject(), 'tos_id', null); + + parent::prepareRow($row); + } + + /** + * @inheritdoc + */ + protected function formatCellValue(string $column, array $row): string + { + if ('modification_ts' === $column) { + return \ilDatePresentation::formatDate(new \ilDateTime($row[$column], IL_CAL_UNIX)); + } else if ('sorting' === $column) { + $sortingField = new \ilTextInputGUI('', 'sorting[' . $row['id'] . ']'); + $sortingField->setValue(($this->i++) * $this->factor); + $sortingField->setMaxLength(5); + $sortingField->setSize(4); + + return $sortingField->render('toolbar'); + } else if ('title' === $column) { + $modal = $this->uiFactory + ->modal() + ->lightbox([ + new class($row) implements \ILIAS\UI\Component\Modal\LightboxPage + { + protected $row = []; + public function __construct(array $row) + { + $this->row = $row; + } + public function getTitle() + { + return $this->row['title']; + } + public function getDescription() + { + return ''; + } + public function getComponent() + { + return new \ILIAS\UI\Implementation\Component\Legacy\Legacy($this->row['content']); + } + } + ]); + + $titleLink = $this->uiFactory + ->button() + ->shy($row[$column], '#') + ->withOnClick($modal->getShowSignal()); + return $this->uiRenderer->render([$titleLink, $modal]); + } + + return parent::formatCellValue($column, $row); + } +} \ No newline at end of file diff --git a/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryGUI.php b/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryGUI.php new file mode 100644 index 000000000000..e20f4348916b --- /dev/null +++ b/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryGUI.php @@ -0,0 +1,195 @@ + + */ +class ilTermsOfServiceAcceptanceHistoryGUI implements \ilTermsOfServiceControllerEnabled +{ + /** @var \ilTermsOfServiceTableDataProviderFactory */ + protected $factory; + + /** @var \ilObjTermsOfService */ + protected $tos; + + /** @var \ilTemplate */ + protected $tpl; + + /** @var \ilCtrl */ + protected $ctrl; + + /** @var \ilLanguage */ + protected $lng; + + /** @var \ilRbacSystem */ + protected $rbacsystem; + + /** @var \ilErrorHandling */ + protected $error; + + /** @var ILIAS\UI\Factory */ + protected $uiFactory; + + /** @var ILIAS\UI\Renderer */ + protected $uiRenderer; + + /** @var ServerRequestInterface */ + protected $request; + + /** + * ilTermsOfServiceDocumentGUI constructor. + * @param \ilObjTermsOfService $tos + * @param \ilTemplate $tpl + * @param \ilCtrl $ctrl + * @param \ilLanguage $lng + * @param \ilRbacSystem $rbacsystem + * @param \ilErrorHandling $error + * @param ServerRequestInterface $request + * @param \ILIAS\UI\Factory $uiFactory + * @param \ILIAS\UI\Renderer $uiRenderer + * @param \ilTermsOfServiceTableDataProviderFactory $factory + */ + public function __construct( + \ilObjTermsOfService $tos, + \ilTemplate $tpl, + \ilCtrl $ctrl, + \ilLanguage $lng, + \ilRbacSystem $rbacsystem, + \ilErrorHandling $error, + ServerRequestInterface $request, + ILIAS\UI\Factory $uiFactory, + ILIAS\UI\Renderer $uiRenderer, + ilTermsOfServiceTableDataProviderFactory $factory + ) { + $this->tos = $tos; + $this->tpl = $tpl; + $this->ctrl = $ctrl; + $this->lng = $lng; + $this->rbacsystem = $rbacsystem; + $this->error = $error; + $this->request = $request; + $this->uiFactory = $uiFactory; + $this->uiRenderer = $uiRenderer; + $this->factory = $factory; + } + + /** + * + */ + public function executeCommand() + { + $nextClass = $this->ctrl->getNextClass($this); + $cmd = $this->ctrl->getCmd(); + + if ( + !$this->rbacsystem->checkAccess('read', '', $this->tos->getRefId()) || + !$this->rbacsystem->checkAccess('read', '', USER_FOLDER_ID) + ) { + $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); + } + + switch (strtolower($nextClass)) { + default: + if ($cmd == '' || !method_exists($this, $cmd)) { + $cmd = 'showAcceptanceHistory'; + } + $this->$cmd(); + break; + } + } + + /** + * @return ilTermsOfServiceAcceptanceHistoryTableGUI + * @throws ilTermsOfServiceMissingDatabaseAdapterException + * @throws ilTermsOfServiceMissingLanguageAdapterException + */ + protected function getAcceptanceHistoryTable(): \ilTermsOfServiceAcceptanceHistoryTableGUI + { + $table = new \ilTermsOfServiceAcceptanceHistoryTableGUI( + $this, + 'showAcceptanceHistory', + $this->uiFactory, + $this->uiRenderer + ); + $table->setProvider($this->factory->getByContext(ilTermsOfServiceTableDataProviderFactory::CONTEXT_ACCEPTANCE_HISTORY)); + + return $table; + } + + /** + * + */ + protected function showAcceptanceHistory() + { + $table = $this->getAcceptanceHistoryTable(); + + $table->populate(); + + $this->tpl->setContent($table->getHTML()); + } + + + /** + * + */ + protected function applyAcceptanceHistoryFilter() + { + $table = $this->getAcceptanceHistoryTable(); + $table->resetOffset(); + $table->writeFilterToSession(); + + $this->showAcceptanceHistory(); + } + + /** + * + */ + protected function resetAcceptanceHistoryFilter() + { + $table = $this->getAcceptanceHistoryTable(); + $table->resetOffset(); + $table->resetFilter(); + + $this->showAcceptanceHistory(); + } + + /** + * + */ + protected function getAcceptedContentAsynch() + { + $response = new \ilTermsOfServiceJsonResponse(); + + if (!isset($_GET['tosv_id'])) { + $response->setStatus(\ilTermsOfServiceJsonResponse::STATUS_FAILURE); + echo $response; + } + + $entity = \ilTermsOfServiceHelper::getById(ilUtil::stripSlashes($_GET['tosv_id'])); + $response->setBody($entity->getText()); + + echo $response; + exit(); + } + + /** + * Show auto complete results + */ + protected function addUserAutoComplete() + { + $auto = new \ilUserAutoComplete(); + $auto->setSearchFields(array('login', 'firstname', 'lastname', 'email')); + $auto->enableFieldSearchableCheck(false); + $auto->setMoreLinkAvailable(true); + + if ($_REQUEST['fetchall']) { + $auto->setLimit(ilUserAutoComplete::MAX_ENTRIES); + } + + echo $auto->getList($_REQUEST['term']); + exit(); + } +} \ No newline at end of file diff --git a/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryProvider.php b/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryProvider.php new file mode 100644 index 000000000000..9d0b3d46faa4 --- /dev/null +++ b/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryProvider.php @@ -0,0 +1,115 @@ + + */ +class ilTermsOfServiceAcceptanceHistoryProvider extends \ilTermsOfServiceTableDatabaseDataProvider +{ + /** + * @inheritdoc + */ + protected function getSelectPart(array $params, array $filter): string + { + $fields = array( + 'tos_acceptance_track.tosv_id', + 'ud.usr_id', + 'ud.login', + 'ud.firstname', + 'ud.lastname', + 'tos_acceptance_track.ts', + 'tos_versions.src', + 'tos_versions.text' + ); + + return implode(', ', $fields); + } + + /** + * @inheritdoc + */ + protected function getFromPart(array $params, array $filter): string + { + $joins = array( + 'INNER JOIN tos_acceptance_track ON tos_acceptance_track.usr_id = ud.usr_id', + 'INNER JOIN tos_versions ON tos_versions.id = tos_acceptance_track.tosv_id', + ); + + return 'usr_data ud ' . implode(' ', $joins); + } + + /** + * @inheritdoc + */ + protected function getWherePart(array $params, array $filter): string + { + $where = array(); + + if (isset($filter['query']) && strlen($filter['query'])) { + $where[] = '(' . implode(' OR ', array( + $this->db->like('ud.login', 'text', '%' . $filter['query'] . '%'), + $this->db->like('ud.firstname', 'text', '%' . $filter['query'] . '%'), + $this->db->like('ud.lastname', 'text', '%' . $filter['query'] . '%'), + $this->db->like('ud.email', 'text', '%' . $filter['query'] . '%') + )) . ')'; + } + + if (isset($filter['period']) && is_array($filter['period'])) { + $where[] = '(' . implode(' AND ', array( + 'tos_acceptance_track.ts >= ' . $this->db->quote($filter['period']['start'], 'integer'), + 'tos_acceptance_track.ts <= ' . $this->db->quote($filter['period']['end'], 'integer') + )) . ')'; + } + + return implode(' AND ', $where); + } + + /** + * @inheritdoc + */ + protected function getGroupByPart(array $params, array $filter): string + { + return ''; + } + + /** + * @inheritdoc + */ + protected function getHavingPart(array $params, array $filter): string + { + return ''; + } + + /** + * @inheritdoc + */ + protected function getOrderByPart(array $params, array $filter): string + { + if (isset($params['order_field'])) { + if (!is_string($params['order_field'])) { + throw new InvalidArgumentException('Please provide a valid order field.'); + } + + if (!in_array($params['order_field'], array('login', 'firstname', 'lastname', 'src', 'ts'))) { + throw new InvalidArgumentException('Please provide a valid order field.'); + } + + if ($params['order_field'] == 'ts') { + $params['order_field'] = 'tos_acceptance_track.ts'; + } + + if (!isset($params['order_direction'])) { + $params['order_direction'] = 'ASC'; + } else { + if (!in_array(strtolower($params['order_direction']), array('asc', 'desc'))) { + throw new InvalidArgumentException('Please provide a valid order direction.'); + } + } + + return $params['order_field'] . ' ' . $params['order_direction']; + } + + return ''; + } +} diff --git a/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryTableGUI.php b/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryTableGUI.php new file mode 100644 index 000000000000..10c025973fef --- /dev/null +++ b/Services/TermsOfService/classes/History/class.ilTermsOfServiceAcceptanceHistoryTableGUI.php @@ -0,0 +1,188 @@ + + */ +class ilTermsOfServiceAcceptanceHistoryTableGUI extends \ilTermsOfServiceTableGUI +{ + /** @var ILIAS\UI\Factory */ + protected $uiFactory; + + /** @var ILIAS\UI\Renderer */ + protected $uiRenderer; + + /** + * ilTermsOfServiceAcceptanceHistoryTableGUI constructor. + * @param \ilTermsOfServiceControllerEnabled $controller + * @param string $command + * @param \ILIAS\UI\Factory $uiFactory + * @param \ILIAS\UI\Renderer $uiRenderer + */ + public function __construct( + \ilTermsOfServiceControllerEnabled $controller, + string $command, + ILIAS\UI\Factory $uiFactory, + ILIAS\UI\Renderer $uiRenderer + ) { + $this->uiFactory = $uiFactory; + $this->uiRenderer = $uiRenderer; + + $this->setId('tos_acceptance_history'); + $this->setFormName('tos_acceptance_history'); + + parent::__construct($controller, $command); + + $this->setTitle($this->lng->txt('tos_acceptance_history')); + $this->setFormAction($this->ctrl->getFormAction($controller, 'applyAcceptanceHistoryFilter')); + + $this->setDefaultOrderDirection('DESC'); + $this->setDefaultOrderField('ts'); + $this->setExternalSorting(true); + $this->setExternalSegmentation(true); + + \iljQueryUtil::initjQuery(); + \ilYuiUtil::initPanel(); + \ilYuiUtil::initOverlay(); + + $this->setShowRowsSelector(true); + + $this->setRowTemplate('tpl.tos_acceptance_history_table_row.html', 'Services/TermsOfService'); + + $this->initFilter(); + $this->setFilterCommand('applyAcceptanceHistoryFilter'); + $this->setResetCommand('resetAcceptanceHistoryFilter'); + } + + /** + * @inheritdoc + */ + protected function getColumnDefinition(): array + { + $i = 0; + + return [ + ++$i => [ + 'field' => 'ts', + 'txt' => $this->lng->txt('tos_acceptance_datetime'), + 'default' => true, + 'optional' => false, + 'sortable' => true + ], + ++$i => [ + 'field' => 'login', + 'txt' => $this->lng->txt('login'), + 'default' => true, + 'optional' => false, + 'sortable' => true + ], + ++$i => [ + 'field' => 'firstname', + 'txt' => $this->lng->txt('firstname'), + 'default' => false, + 'optional' => true, + 'sortable' => true + ], + ++$i => [ + 'field' => 'lastname', + 'txt' => $this->lng->txt('lastname'), + 'default' => false, + 'optional' => true, + 'sortable' => true + ], + ++$i => [ + 'field' => 'src', + 'txt' => $this->lng->txt('tos_agreement_document'), + 'default' => true, + 'optional' => false, + 'sortable' => true + ], + ]; + } + + /** + * @inheritdoc + */ + protected function formatCellValue(string $column, array $row): string + { + if ('ts' === $column) { + return \ilDatePresentation::formatDate(new \ilDateTime($row[$column], IL_CAL_UNIX)); + } else if ('src' === $column) { + $modal = $this->uiFactory + ->modal() + ->lightbox([ + new class($row) implements \ILIAS\UI\Component\Modal\LightboxPage + { + protected $row = []; + public function __construct(array $row) + { + $this->row = $row; + } + public function getTitle() + { + // TODO: Or $this->lng->txt('tos_agreement_document') + return $this->row['src']; + } + public function getDescription() + { + return ''; + } + public function getComponent() + { + return new \ILIAS\UI\Implementation\Component\Legacy\Legacy($this->row['text']); + } + } + ]); + + $titleLink = $this->uiFactory + ->button() + ->shy($row[$column], '#') + ->withOnClick($modal->getShowSignal()); + return $this->uiRenderer->render([$titleLink, $modal]); + } + + return parent::formatCellValue($column, $row); + } + + /** + * @inheritdoc + */ + public function numericOrdering($column) + { + if ('ts' === $column) { + return true; + } + + return false; + } + + /** + * @inheritdoc + */ + public function initFilter() + { + $ul = new ilTextInputGUI( + $this->lng->txt('login') . '/' . $this->lng->txt('email') . '/' . $this->lng->txt('name'), + 'query' + ); + $ul->setDataSource($this->ctrl->getLinkTarget($this->getParentObject(), 'addUserAutoComplete', '', true)); + $ul->setSize(20); + $ul->setSubmitFormOnEnter(true); + $this->addFilterItem($ul); + $ul->readFromSession(); + $this->filter['query'] = $ul->getValue(); + + $this->tpl->addJavaScript("./Services/Form/js/Form.js"); + $duration = new \ilDateDurationInputGUI($this->lng->txt('tos_period'), 'period'); + $duration->setRequired(true); + $duration->setStartText($this->lng->txt('tos_period_from')); + $duration->setEndText($this->lng->txt('tos_period_until')); + $duration->setStart(new \ilDateTime(strtotime('-1 year', time()), IL_CAL_UNIX)); + $duration->setEnd(new \ilDateTime(time(), IL_CAL_UNIX)); + $duration->setShowTime(true); + $this->addFilterItem($duration, true); + $duration->readFromSession(); + $this->optional_filter['period'] = $duration->getValue(); + } +} diff --git a/Services/TermsOfService/classes/class.ilObjTermsOfServiceGUI.php b/Services/TermsOfService/classes/class.ilObjTermsOfServiceGUI.php index f743689dd2a6..14f7419a8d7c 100644 --- a/Services/TermsOfService/classes/class.ilObjTermsOfServiceGUI.php +++ b/Services/TermsOfService/classes/class.ilObjTermsOfServiceGUI.php @@ -1,116 +1,44 @@ - * @version $Id$ * @ilCtrl_Calls ilObjTermsOfServiceGUI: ilPermissionGUI + * @ilCtrl_Calls ilObjTermsOfServiceGUI: ilTermsOfServiceDocumentGUI + * @ilCtrl_Calls ilObjTermsOfServiceGUI: ilTermsOfServiceAcceptanceHistoryGUI * @ilCtrl_isCalledBy ilObjTermsOfServiceGUI: ilAdministrationGUI */ class ilObjTermsOfServiceGUI extends ilObject2GUI { - /** - * @var ilLanguage - */ - public $lng; - - /** - * @var ilCtrl - */ - public $ctrl; + /** @var ILIAS\DI\Container */ + protected $dic; - /** - * @var ilObjTermsOfService - */ - public $object; - - /** - * @var ilTabsGUI - */ - public $tabs_gui; - - /** - * @var ilTermsOfServiceTableDataProviderFactory - */ - public $factory; - - /** - * @var ilRbacSystem - */ + /** @var \ilRbacSystem */ protected $rbacsystem; - /** - * @var ilErrorHandling - */ + /** @var \ilErrorHandling */ protected $error; - - /** - * @var ilToolbarGUI - */ - protected $toolbar; - - /** - * @var ilObjUser - */ - protected $user; - - /** - * @var ilLog - */ - protected $log; - - /** - * @var ILIAS\UI\Factory - */ - protected $uiFactory; - - /** - * @var ILIAS\UI\Renderer - */ - protected $uiRenderer; /** - * @param int $a_id - * @param int $a_id_type - * @param int $a_parent_node_id + * @inheritdoc */ public function __construct($a_id = 0, $a_id_type = self::REPOSITORY_NODE_ID, $a_parent_node_id = 0) { - /** - * @var $lng ilLanguage - * @var $ilDB ilDBInterface - */ global $DIC; - $this->lng = $DIC['lng']; + $this->dic = $DIC; + $this->lng = $DIC['lng']; $this->rbacsystem = $DIC['rbacsystem']; - $this->error = $DIC['ilErr']; - $this->log = $DIC['ilLog']; - $this->toolbar = $DIC['ilToolbar']; - $this->user = $DIC['ilUser']; - - $this->uiFactory = $DIC->ui()->factory(); - $this->uiRenderer = $DIC->ui()->renderer(); + $this->error = $DIC['ilErr']; parent::__construct($a_id, $a_id_type, $a_parent_node_id); $this->lng->loadLanguageModule('tos'); $this->lng->loadLanguageModule('meta'); - - $this->factory = new ilTermsOfServiceTableDataProviderFactory(); - $this->factory->setLanguageAdapter($this->lng); - $this->factory->setDatabaseAdapter($DIC['ilDB']); } /** - * Functions that must be overwritten + * @inheritdoc */ public function getType() { @@ -118,19 +46,55 @@ public function getType() } /** - * + * @inheritdoc */ public function executeCommand() { - $next_class = $this->ctrl->getNextClass($this); - $cmd = $this->ctrl->getCmd(); $this->prepareOutput(); - switch($next_class) - { + $nextClass = $this->ctrl->getNextClass($this); + $cmd = $this->ctrl->getCmd(); + + switch (strtolower($nextClass)) { + case 'iltermsofservicedocumentgui': + $documentGui = new \ilTermsOfServiceDocumentGUI( + $this->object, + $this->dic->ui()->mainTemplate(), + $this->dic->user(), + $this->dic->ctrl(), + $this->dic->language(), + $this->dic->rbac()->system(), + $this->dic['ilErr'], + $this->dic->logger()->root(), + $this->dic->toolbar(), + $this->dic->http()->request(), + $this->dic->ui()->factory(), + $this->dic->ui()->renderer(), + $this->dic->upload() + ); + $this->ctrl->forwardCommand($documentGui); + break; + + case 'iltermsofserviceacceptancehistorygui': + $factory = new \ilTermsOfServiceTableDataProviderFactory(); + $factory->setDatabaseAdapter($this->dic->database()); + + $documentGui = new \ilTermsOfServiceAcceptanceHistoryGUI( + $this->object, + $this->dic->ui()->mainTemplate(), + $this->dic->ctrl(), + $this->dic->language(), + $this->dic->rbac()->system(), + $this->dic['ilErr'], + $this->dic->http()->request(), + $this->dic->ui()->factory(), + $this->dic->ui()->renderer(), + $factory + ); + $this->ctrl->forwardCommand($documentGui); + break; + case 'ilpermissiongui': - $this->tabs_gui->setTabActive('perm_settings'); - require_once 'Services/AccessControl/classes/class.ilPermissionGUI.php'; $perm_gui = new \ilPermissionGUI($this); $this->ctrl->forwardCommand($perm_gui); break; @@ -145,42 +109,55 @@ public function executeCommand() } /** - * + * @inheritdoc */ public function getAdminTabs() { if ($this->rbacsystem->checkAccess('read', $this->object->getRefId())) { - $this->tabs_gui->addTarget('settings', $this->ctrl->getLinkTarget($this, 'settings'), array('saveSettings', 'settings', '', 'view'), '', ''); + $this->tabs_gui->addTarget('settings', $this->ctrl->getLinkTarget($this, 'settings'), + '', [strtolower(get_class($this))] + ); } if ($this->rbacsystem->checkAccess('read', $this->object->getRefId())) { - $this->tabs_gui->addTarget('tos_agreement_documents_tab_label', $this->ctrl->getLinkTarget($this, 'showDocuments'), array('reset', 'confirmReset', 'showDocuments'), '', ''); + $this->tabs_gui->addTarget( + 'tos_agreement_documents_tab_label', + $this->ctrl->getLinkTargetByClass('ilTermsOfServiceDocumentGUI'), + '', ['iltermsofservicedocumentgui'] + ); } - if($this->rbacsystem->checkAccess('read', $this->object->getRefId()) && + if ($this->rbacsystem->checkAccess('read', $this->object->getRefId()) && $this->rbacsystem->checkAccess('read', USER_FOLDER_ID) - ) - { - $this->tabs_gui->addTarget('tos_acceptance_history', $this->ctrl->getLinkTarget($this, 'showAcceptanceHistory'), array('showAcceptanceHistory', 'resetAcceptanceHistoryFilter', 'applyAcceptanceHistoryFilter'), '', ''); + ) { + $this->tabs_gui->addTarget( + 'tos_acceptance_history', + $this->ctrl->getLinkTargetByClass('ilTermsOfServiceAcceptanceHistoryGUI'), + '', ['iltermsofserviceacceptancehistorygui'] + ); } if ($this->rbacsystem->checkAccess('edit_permission', $this->object->getRefId())) { - $this->tabs_gui->addTarget('perm_settings', $this->ctrl->getLinkTargetByClass(array(get_class($this), 'ilpermissiongui'), 'perm'), array('perm', 'info', 'owner'), 'ilpermissiongui'); + $this->tabs_gui->addTarget( + 'perm_settings', + $this->ctrl->getLinkTargetByClass([get_class($this), 'ilpermissiongui'], 'perm'), + '', ['ilpermissiongui', 'ilobjectpermissionstatusgui'] + ); } } /** - * @return ilTermsOfServiceSettingsFormGUI + * @return \ilTermsOfServiceSettingsFormGUI */ - protected function getSettingsForm() + protected function getSettingsForm(): \ilTermsOfServiceSettingsFormGUI { - $form = new ilTermsOfServiceSettingsFormGUI( + $form = new \ilTermsOfServiceSettingsFormGUI( $this->object, $this->lng, + $this->ctrl->getFormAction($this, 'saveSettings'), 'saveSettings', $this->rbacsystem->checkAccess('write', $this->object->getRefId()) ); - $form->setFormAction($this->ctrl->getLinkTarget($this, 'saveSettings')); return $form; } @@ -198,8 +175,10 @@ protected function saveSettings() if ($form->saveObject()) { \ilUtil::sendSuccess($this->lng->txt('saved_successfully'), true); $this->ctrl->redirect($this, 'settings'); - } else if ($form->hasTranslatedError()) { - \ilUtil::sendFailure($form->getTranslatedError()); + } else { + if ($form->hasTranslatedError()) { + \ilUtil::sendFailure($form->getTranslatedError()); + } } $this->tpl->setContent($form->getHTML()); @@ -236,227 +215,4 @@ protected function settings() $form = $this->getSettingsForm(); $this->tpl->setContent($form->getHTML()); } - - /** - * - */ - protected function confirmReset() - { - if (!$this->rbacsystem->checkAccess('write', $this->object->getRefId())) { - $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); - } - - $confirmation = new \ilConfirmationGUI(); - $confirmation->setFormAction($this->ctrl->getFormAction($this, 'confirmReset')); - $confirmation->setConfirm($this->lng->txt('confirm'), 'reset'); - $confirmation->setCancel($this->lng->txt('cancel'), 'showDocuments'); - $confirmation->setHeaderText($this->lng->txt('tos_sure_reset_tos')); - - $this->tpl->setContent($confirmation->getHTML()); - } - - /** - * - */ - protected function reset() - { - if (!$this->rbacsystem->checkAccess('write', $this->object->getRefId())) { - $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); - } - - $this->object->resetAll(); - - $this->log->write(__METHOD__ . ': Terms of service reset by ' . $this->user->getId() . ' [' . $this->user->getLogin() . ']'); - \ilUtil::sendSuccess($this->lng->txt('tos_reset_successful')); - - $this->showDocuments(); - } - - /** - * - */ - protected function showDocuments() - { - if (!$this->rbacsystem->checkAccess('read', $this->object->getRefId())) { - $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); - } - - $addDocumentBtn = \ilLinkButton::getInstance(); - $addDocumentBtn->setUrl($this->ctrl->getLinkTarget($this, 'showAddDocumentForm')); - $addDocumentBtn->setCaption('tos_add_document_btn_label'); - $this->toolbar->addStickyItem($addDocumentBtn); - - $this->tpl->setVariable('MESSAGE', $this->getResetMessageBoxHtml()); - $this->tpl->setContent(implode('', [ - // TODO: Add table HTML - ])); - } - - /** - * - */ - protected function getAgreementTextByFilenameAsynch() - { - require_once 'Services/TermsOfService/classes/class.ilTermsOfServiceJsonResponse.php'; - $response = new ilTermsOfServiceJsonResponse(); - - if( - !isset($_GET['agreement_document']) || - !strlen($_GET['agreement_document']) || - !$this->rbacsystem->checkAccess('read', $this->object->getRefId())) - { - $response->setStatus(ilTermsOfServiceJsonResponse::STATUS_FAILURE); - echo $response; - } - - $file = realpath(strip_tags(rawurldecode(ilUtil::stripOnlySlashes($_GET['agreement_document'])))); - if(preg_match('/Customizing[\/\\\](global[\/\\\]agreement|clients[\/\\\]' . CLIENT_ID . '[\/\\\]agreement)[\/\\\]agreement_([a-z]{2})\.html$/', $file)) - { - $content = file_get_contents($file); - if(strip_tags($content) === $content) - { - $content = ''; - $lines = file($file); - foreach($lines as $line) - { - $content .= nl2br(trim($line)); - } - } - $response->setBody($content); - } - else - { - $response->setStatus(ilTermsOfServiceJsonResponse::STATUS_FAILURE); - } - - echo $response; - } - - /** - * - */ - protected function showAcceptanceHistory() - { - if( - !$this->rbacsystem->checkAccess('read', '', $this->object->getRefId()) || - !$this->rbacsystem->checkAccess('read', '', USER_FOLDER_ID) - ) - { - $this->error->raiseError($this->lng->txt('permission_denied'), $this->error->MESSAGE); - } - - $this->lng->loadLanguageModule('meta'); - - $table = new ilTermsOfServiceAcceptanceHistoryTableGUI($this, 'showAcceptanceHistory'); - $table->setProvider($this->factory->getByContext(ilTermsOfServiceTableDataProviderFactory::CONTEXT_ACCEPTANCE_HISTORY)); - $table->populate(); - - $this->tpl->setContent($table->getHTML()); - } - - /** - * - */ - protected function getAcceptedContentAsynch() - { - require_once 'Services/TermsOfService/classes/class.ilTermsOfServiceJsonResponse.php'; - $response = new ilTermsOfServiceJsonResponse(); - - if(!isset($_GET['tosv_id'])) - { - $response->setStatus(ilTermsOfServiceJsonResponse::STATUS_FAILURE); - echo $response; - } - - $entity = ilTermsOfServiceHelper::getById(ilUtil::stripSlashes($_GET['tosv_id'])); - $response->setBody($entity->getText()); - - echo $response; - } - - /** - * Show auto complete results - */ - protected function addUserAutoComplete() - { - if( - !$this->rbacsystem->checkAccess('read', '', $this->object->getRefId()) || - !$this->rbacsystem->checkAccess('read', '', USER_FOLDER_ID) - ) - { - echo json_encode(array()); - exit(); - } - - include_once 'Services/User/classes/class.ilUserAutoComplete.php'; - $auto = new ilUserAutoComplete(); - $auto->setSearchFields(array('login', 'firstname', 'lastname', 'email')); - $auto->enableFieldSearchableCheck(false); - $auto->setMoreLinkAvailable(true); - - if(($_REQUEST['fetchall'])) - { - $auto->setLimit(ilUserAutoComplete::MAX_ENTRIES); - } - - echo $auto->getList($_REQUEST['term']); - exit(); - } - - /** - * - */ - protected function applyAcceptanceHistoryFilter() - { - $table = new ilTermsOfServiceAcceptanceHistoryTableGUI($this, 'showAcceptanceHistory'); - $table->resetOffset(); - $table->writeFilterToSession(); - - $this->showAcceptanceHistory(); - } - - /** - * - */ - protected function resetAcceptanceHistoryFilter() - { - $table = new ilTermsOfServiceAcceptanceHistoryTableGUI($this, 'showAcceptanceHistory'); - $table->resetOffset(); - $table->resetFilter(); - - $this->showAcceptanceHistory(); - } - - /** - * @return string - */ - protected function getResetMessageBoxHtml(): string - { - if ($this->object->getLastResetDate() && $this->object->getLastResetDate()->get(IL_CAL_UNIX) != 0) { - $status = ilDatePresentation::useRelativeDates(); - ilDatePresentation::setUseRelativeDates(false); - $resetText = sprintf( - $this->lng->txt('tos_last_reset_date'), - ilDatePresentation::formatDate($this->object->getLastResetDate()) - ); - ilDatePresentation::setUseRelativeDates($status); - } else { - $resetText = $this->lng->txt('tos_never_reset'); - } - - $buttons = []; - if($this->rbacsystem->checkAccess('write', $this->object->getRefId())) { - $buttons = [ - $this->uiFactory - ->button() - ->standard($this->lng->txt('tos_reset_tos_for_all_users'), $this->ctrl->getLinkTarget($this, 'confirmReset')) - ]; - } - - return $this->uiRenderer->render( - $this->uiFactory->messageBox() - ->info($resetText) - ->withButtons($buttons) - ); - } } \ No newline at end of file diff --git a/Services/TermsOfService/classes/class.ilTermsOfServiceAcceptanceHistoryProvider.php b/Services/TermsOfService/classes/class.ilTermsOfServiceAcceptanceHistoryProvider.php deleted file mode 100644 index d563d06c7dfe..000000000000 --- a/Services/TermsOfService/classes/class.ilTermsOfServiceAcceptanceHistoryProvider.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @version $Id$ - */ -class ilTermsOfServiceAcceptanceHistoryProvider extends ilTermsOfServiceTableDatabaseDataProvider -{ - /** - * @param array $params - * @param array $filter - * @return string - */ - protected function getSelectPart(array $params, array $filter) - { - $fields = array( - 'tos_acceptance_track.tosv_id', - 'ud.usr_id', - 'ud.login', - 'ud.firstname', - 'ud.lastname', - 'tos_acceptance_track.ts', - 'tos_versions.src', - 'tos_versions.text', - 'tos_versions.lng' - ); - - return implode(', ', $fields); - } - - /** - * @param array $params - * @param array $filter - * @return string - */ - protected function getFromPart(array $params, array $filter) - { - $joins = array( - 'INNER JOIN tos_acceptance_track ON tos_acceptance_track.usr_id = ud.usr_id', - 'INNER JOIN tos_versions ON tos_versions.id = tos_acceptance_track.tosv_id', - ); - - return 'usr_data ud ' . implode(' ', $joins); - } - - /** - * @param array $params - * @param array $filter - * @return string - */ - protected function getWherePart(array $params, array $filter) - { - $where = array(); - - if(isset($filter['query']) && strlen($filter['query'])) - { - $where[] = '(' . implode(' OR ', array( - $this->db->like('ud.login', 'text', '%'.$filter['query'].'%'), - $this->db->like('ud.firstname', 'text', '%'.$filter['query'].'%'), - $this->db->like('ud.lastname', 'text', '%'.$filter['query'].'%'), - $this->db->like('ud.email', 'text', '%'.$filter['query'].'%') - )) . ')'; - } - - if(isset($filter['lng']) && strlen($filter['lng'])) - { - $where[] = 'tos_versions.lng = ' . $this->db->quote($filter['lng'], 'text'); - } - - if(isset($filter['period']) && is_array($filter['period'])) - { - $where[] = '(' . implode(' AND ', array( - 'tos_acceptance_track.ts >= ' . $this->db->quote($filter['period']['start'], 'integer'), - 'tos_acceptance_track.ts <= ' . $this->db->quote($filter['period']['end'], 'integer') - )) . ')'; - } - - return implode(' AND ', $where); - } - - /** - * @param array $params - * @param array $filter - * @return string - */ - protected function getGroupByPart(array $params, array $filter) - { - return ''; - } - - /** - * @param array $params - * @param array $filter - * @return string - */ - protected function getHavingPart(array $params, array $filter) - { - return ''; - } - - /** - * @param array $params - * @param array $filter - * @return string - * @throws InvalidArgumentException - */ - protected function getOrderByPart(array $params, array $filter) - { - if(isset($params['order_field'])) - { - if(!is_string($params['order_field'])) - { - throw new InvalidArgumentException('Please provide a valid order field.'); - } - - if(!in_array($params['order_field'], array('lng', 'login', 'firstname', 'lastname', 'src', 'ts'))) - { - throw new InvalidArgumentException('Please provide a valid order field.'); - } - - if($params['order_field'] == 'ts') - { - $params['order_field'] = 'tos_acceptance_track.ts'; - } - - if(!isset($params['order_direction'])) - { - $params['order_direction'] = 'ASC'; - } - else if(!in_array(strtolower($params['order_direction']), array('asc', 'desc'))) - { - throw new InvalidArgumentException('Please provide a valid order direction.'); - } - - return $params['order_field'] . ' ' . $params['order_direction']; - } - - return ''; - } -} diff --git a/Services/TermsOfService/classes/class.ilTermsOfServiceAcceptanceHistoryTableGUI.php b/Services/TermsOfService/classes/class.ilTermsOfServiceAcceptanceHistoryTableGUI.php deleted file mode 100644 index 3ff6c1a1eb48..000000000000 --- a/Services/TermsOfService/classes/class.ilTermsOfServiceAcceptanceHistoryTableGUI.php +++ /dev/null @@ -1,203 +0,0 @@ - - * @version $Id$ - */ -class ilTermsOfServiceAcceptanceHistoryTableGUI extends ilTermsOfServiceTableGUI -{ - /** - * @var ilCtrl - */ - protected $ctrl; - - /** - * @var ilTemplate - */ - protected $tpl; - - /** - * @param ilObjectGUI $a_parent_obj - * @param string $a_parent_cmd - */ - public function __construct(ilObjectGUI $a_parent_obj, $a_parent_cmd) - { - global $DIC; - - $this->ctrl = $DIC['ilCtrl']; - $this->tpl = $DIC['tpl']; - - // Call this immediately in constructor - $this->setId('tos_acceptance_history'); - - $this->setDefaultOrderDirection('DESC'); - $this->setDefaultOrderField('ts'); - $this->setExternalSorting(true); - $this->setExternalSegmentation(true); - - parent::__construct($a_parent_obj, $a_parent_cmd); - - $this->setTitle($this->lng->txt('tos_acceptance_history')); - - $this->addColumn($this->lng->txt('tos_acceptance_datetime'), 'ts'); - $this->addColumn($this->lng->txt('login'), 'login'); - $this->optionalColumns = (array)$this->getSelectableColumns(); - $this->visibleOptionalColumns = (array)$this->getSelectedColumns(); - foreach($this->visibleOptionalColumns as $column) - { - $this->addColumn($this->optionalColumns[$column]['txt'], $column); - } - $this->addColumn($this->lng->txt('language'), 'lng'); - $this->addColumn($this->lng->txt('tos_agreement_document'), 'src'); - - $this->setFormAction($this->ctrl->getFormAction($a_parent_obj, 'applyAcceptanceHistoryFilter')); - - $this->setRowTemplate('tpl.tos_acceptance_history_table_row.html', 'Services/TermsOfService'); - - require_once 'Services/jQuery/classes/class.iljQueryUtil.php'; - require_once 'Services/YUI/classes/class.ilYuiUtil.php'; - iljQueryUtil::initjQuery(); - ilYuiUtil::initPanel(); - ilYuiUtil::initOverlay(); - - $this->setShowRowsSelector(true); - - $this->initFilter(); - $this->setFilterCommand('applyAcceptanceHistoryFilter'); - $this->setResetCommand('resetAcceptanceHistoryFilter'); - } - - /** - * @return array - */ - public function getSelectableColumns() - { - $cols = array( - 'firstname' => array('txt' => $this->lng->txt('firstname'), 'default' => false), - 'lastname' => array('txt' => $this->lng->txt('lastname'), 'default' => false) - ); - - return $cols; - } - - /** - * @param array $data - * @return array - */ - protected function prepareData(array &$data) - { - foreach($data['items'] as &$row) - { - $row['lng'] = $this->lng->txt('meta_l_' . $row['lng']); - } - } - - /** - * @param array $row - * @return array - */ - protected function prepareRow(array &$row) - { - $unique_id = md5($row['usr_id'].$row['ts']); - - $this->ctrl->setParameter($this->getParentObject(), 'tosv_id', $row['tosv_id']); - $row['content_link'] = $this->ctrl->getLinkTarget($this->getParentObject(), 'getAcceptedContentAsynch', '', true, false); - $this->ctrl->setParameter($this->getParentObject(), 'tosv_id', ''); - $row['img_down'] = ilGlyphGUI::get(ilGlyphGUI::SEARCH); - $row['id'] = $unique_id; - - $modal = ilModalGUI::getInstance(); - $modal->setType(ilModalGUI::TYPE_LARGE); - $modal->setHeading($this->lng->txt('tos_agreement_document')); - $modal->setId('tos_' . $unique_id); - $modal->setBody(''); - $row['modal'] = $modal->getHTML(); - } - - /** - * @return array - */ - protected function getStaticData() - { - return array('modal', 'ts', 'login', 'lng', 'src', 'text', 'id', 'img_down', 'content_link'); - } - - /** - * @param mixed $column - * @param array $row - * @return mixed - */ - protected function formatCellValue($column, array $row) - { - if($column == 'ts') - { - return ilDatePresentation::formatDate(new ilDateTime($row[$column], IL_CAL_UNIX)); - } - - return $row[$column]; - } - - /** - * @param string $column - * @return bool - */ - public function numericOrdering($column) - { - if('ts' == $column) - { - return true; - } - - return false; - } - - /** - * - */ - public function initFilter() - { - include_once 'Services/Form/classes/class.ilTextInputGUI.php'; - $ul = new ilTextInputGUI($this->lng->txt('login').'/'.$this->lng->txt('email').'/'.$this->lng->txt('name'), 'query'); - $ul->setDataSource($this->ctrl->getLinkTarget($this->getParentObject(), 'addUserAutoComplete', '', true)); - $ul->setSize(20); - $ul->setSubmitFormOnEnter(true); - $this->addFilterItem($ul); - $ul->readFromSession(); - $this->filter['query'] = $ul->getValue(); - - include_once 'Services/Form/classes/class.ilSelectInputGUI.php'; - $options = array(); - $languages = ilObject::_getObjectsByType('lng'); - foreach($languages as $lng) - { - $options[$lng['title']] = $this->lng->txt('meta_l_' . $lng['title']); - } - asort($options); - - $options = array('' => $this->lng->txt('any_language')) + $options; - - $si = new ilSelectInputGUI($this->lng->txt('language'), 'lng'); - $si->setOptions($options); - $this->addFilterItem($si); - $si->readFromSession(); - $this->filter['lng'] = $si->getValue(); - - include_once 'Services/Form/classes/class.ilDateDurationInputGUI.php'; - $this->tpl->addJavaScript("./Services/Form/js/Form.js"); - $duration = new ilDateDurationInputGUI($this->lng->txt('tos_period'), 'period'); - $duration->setRequired(true); - $duration->setStartText($this->lng->txt('tos_period_from')); - $duration->setEndText($this->lng->txt('tos_period_until')); - $duration->setStart(new ilDateTime(strtotime('-1 year', time()), IL_CAL_UNIX)); - $duration->setEnd(new ilDateTime(time(), IL_CAL_UNIX)); - $duration->setShowTime(true); - $this->addFilterItem($duration, true); - $duration->readFromSession(); - $this->optional_filter['period'] = $duration->getValue(); - } -} diff --git a/Services/TermsOfService/classes/class.ilTermsOfServiceAgreementByLanguageProvider.php b/Services/TermsOfService/classes/class.ilTermsOfServiceAgreementByLanguageProvider.php deleted file mode 100644 index 6464a58ed8f6..000000000000 --- a/Services/TermsOfService/classes/class.ilTermsOfServiceAgreementByLanguageProvider.php +++ /dev/null @@ -1,124 +0,0 @@ - - * @version $Id$ - */ -class ilTermsOfServiceAgreementByLanguageProvider implements ilTermsOfServiceTableDataProvider -{ - /** - * @var ilLanguage - */ - protected $lng; - - /** - * @var array - */ - protected $data = array(); - - /** - * @var array - */ - protected $source_directories = array(); - - /** - * @param ilLanguage $lng - */ - public function __construct(ilLanguage $lng) - { - $this->setLanguageAdapter($lng); - $this->initSourceDirectories(); - } - - /** - * @param array $terms_of_service_source_directories - */ - public function setSourceDirectories($terms_of_service_source_directories) - { - $this->source_directories = $terms_of_service_source_directories; - } - - /** - * @return array - */ - public function getSourceDirectories() - { - return $this->source_directories; - } - - /** - * @param ilLanguage $lng - */ - public function setLanguageAdapter($lng) - { - $this->lng = $lng; - } - - /** - * @return ilLanguage - */ - public function getLanguageAdapter() - { - return $this->lng; - } - - /** - * - */ - protected function initSourceDirectories() - { - $this->source_directories = array( - implode('/', array('.', 'Customizing', 'clients', CLIENT_ID, 'agreement')), - implode('/', array('.', 'Customizing', 'global', 'agreement')) - ); - } - - /** - * {@inheritdoc} - */ - public function getList(array $params, array $filter) - { - $this->data = array( - 'items' => array(), - 'cnt' => 0 - ); - - $this->collectData(); - - return $this->data; - } - - /** - * - */ - protected function collectData() - { - $i = 0; - foreach($this->getLanguageAdapter()->getInstalledLanguages() as $iso2_language_code) - { - $this->data['items'][$i]['language'] = $iso2_language_code; - $this->data['items'][$i]['agreement'] = false; - $this->data['items'][$i]['agreement_document'] = null; - $this->data['items'][$i]['agreement_document_modification_ts'] = null; - - foreach($this->getSourceDirectories() as $directory) - { - $file = $directory . '/agreement_' . $iso2_language_code . '.html'; - if(is_file($file) && is_readable($file)) - { - $this->data['items'][$i]['agreement_document'] = $file; - $this->data['items'][$i]['agreement_document_modification_ts'] = filemtime($file); - $this->data['items'][$i]['agreement'] = true; - break; - } - } - - ++$i; - } - - $this->data['cnt'] = $i; - } -} diff --git a/Services/TermsOfService/classes/class.ilTermsOfServiceAgreementByLanguageTableGUI.php b/Services/TermsOfService/classes/class.ilTermsOfServiceAgreementByLanguageTableGUI.php deleted file mode 100644 index e878593e765f..000000000000 --- a/Services/TermsOfService/classes/class.ilTermsOfServiceAgreementByLanguageTableGUI.php +++ /dev/null @@ -1,175 +0,0 @@ - - * @version $Id$ - */ -class ilTermsOfServiceAgreementByLanguageTableGUI extends ilTermsOfServiceTableGUI -{ - /** - * @var ilCtrl - */ - protected $ctrl; - - /** - * @param ilObjectGUI $a_parent_obj - * @param string $a_parent_cmd - */ - public function __construct(ilObjectGUI $a_parent_obj, $a_parent_cmd) - { - /** - * @var $ilCtrl ilCtrl - */ - global $DIC; - - $this->ctrl = $DIC['ilCtrl']; - - $this->setId('tos_agreement_by_lng'); - - $this->setDefaultOrderDirection('ASC'); - $this->setDefaultOrderField('language'); - $this->setExternalSorting(false); - $this->setExternalSegmentation(false); - - parent::__construct($a_parent_obj, $a_parent_cmd); - - $this->setTitle($this->lng->txt('tos_agreement_by_lng')); - - $this->addColumn($this->lng->txt('language'), 'language'); - $this->addColumn($this->lng->txt('tos_agreement'), 'agreement'); - $this->addColumn($this->lng->txt('tos_agreement_document'), 'agreement_document'); - $this->optionalColumns = (array)$this->getSelectableColumns(); - $this->visibleOptionalColumns = (array)$this->getSelectedColumns(); - foreach($this->visibleOptionalColumns as $column) - { - $this->addColumn($this->optionalColumns[$column]['txt'], $column); - } - - $this->setFormAction($this->ctrl->getFormAction($a_parent_obj, 'applyAgreementByLanguageFilter')); - - $this->setRowTemplate('tpl.tos_agreement_by_lng_table_row.html', 'Services/TermsOfService'); - - $this->setShowRowsSelector(true); - - require_once 'Services/jQuery/classes/class.iljQueryUtil.php'; - require_once 'Services/YUI/classes/class.ilYuiUtil.php'; - iljQueryUtil::initjQuery(); - ilYuiUtil::initPanel(); - ilYuiUtil::initOverlay(); - - $this->initFilter(); - $this->setFilterCommand('applyAgreementByLanguageFilter'); - $this->setResetCommand('resetAgreementByLanguageFilter'); - } - - /** - * @return array - */ - public function getSelectableColumns() - { - $cols = array('agreement_document_modification_ts' => array('txt' => $this->lng->txt('tos_last_modified'), 'default' => true)); - - return $cols; - } - - /** - * @param array $data - * @return array - */ - protected function prepareData(array &$data) - { - foreach($data['items'] as &$row) - { - $row['language'] = $this->lng->txt('meta_l_' . $row['language']); - } - } - - /** - * @param array $row - * @return array - */ - protected function prepareRow(array &$row) - { - if(is_string($row['agreement_document']) && strlen($row['agreement_document'])) - { - $unique_id = md5($row['language']); - - $this->ctrl->setParameter($this->getParentObject(), 'agreement_document', rawurlencode($row['agreement_document'])); - $row['content_link'] = $this->ctrl->getLinkTarget($this->getParentObject(), 'getAgreementTextByFilenameAsynch', '', true, false); - $this->ctrl->setParameter($this->getParentObject(), 'agreement_document', ''); - $row['img_down'] = ilGlyphGUI::get(ilGlyphGUI::SEARCH); - $row['id'] = $unique_id; - - $modal = ilModalGUI::getInstance(); - $modal->setHeading($this->lng->txt('tos_agreement_document')); - $modal->setType(ilModalGUI::TYPE_LARGE); - $modal->setId('tos_' . $unique_id); - $modal->setBody(''); - $row['modal'] = $modal->getHTML(); - } - else - { - $row['missing_agreement_css_class'] = 'warning'; - } - } - - /** - * @return array - */ - protected function getStaticData() - { - return array('modal', 'id', 'language', 'agreement', 'missing_agreement_css_class', 'agreement_document', 'content_link', 'img_down', 'language_key'); - } - - /** - * @param mixed $column - * @param array $row - * @return mixed - */ - protected function formatCellValue($column, array $row) - { - if($column == 'agreement_document') - { - if(!is_string($row[$column]) || !strlen($row[$column])) - { - return $this->lng->txt('tos_agreement_document_missing'); - } - } - else if($column == 'agreement') - { - if($row[$column]) - { - return $this->lng->txt('tos_agreement_exists'); - } - else - { - return $this->lng->txt('tos_agreement_missing'); - } - } - else if($column == 'agreement_document_modification_ts') - { - return ilDatePresentation::formatDate(new ilDateTime($row[$column], IL_CAL_UNIX)); - } - - return $row[$column]; - } - - /** - * @param string $column - * @return bool - */ - public function numericOrdering($column) - { - if('agreement_document_modification_ts' == $column) - { - return true; - } - - return false; - } -} diff --git a/Services/TermsOfService/classes/class.ilTermsOfServiceSettingsFormGUI.php b/Services/TermsOfService/classes/class.ilTermsOfServiceSettingsFormGUI.php index 69fe621e0812..4c3878464491 100644 --- a/Services/TermsOfService/classes/class.ilTermsOfServiceSettingsFormGUI.php +++ b/Services/TermsOfService/classes/class.ilTermsOfServiceSettingsFormGUI.php @@ -6,46 +6,42 @@ */ class ilTermsOfServiceSettingsFormGUI extends \ilPropertyFormGUI { - /** - * @var \ilObjTermsOfService - */ + /** @var \ilObjTermsOfService */ protected $tos; - /** - * @var \ilLanguage - */ + /** @var \ilLanguage */ protected $lng; - /** - * @var string - */ - protected $saveCommand; + /** @var string */ + protected $formAction = ''; - /** - * @var $bool - */ - protected $isEditable; + /** @var string */ + protected $saveCommand = ''; - /** - * @var string - */ + /** @var $bool */ + protected $isEditable = false; + + /** @var string */ protected $translatedError = ''; /** * ilTermsOfServiceSettingsForm constructor. - * @param ilObjTermsOfService $tos - * @param ilLanguage $lng + * @param \ilObjTermsOfService $tos + * @param \ilLanguage $lng + * @param string $formAction * @param string $saveCommand * @param bool $isEditable */ public function __construct( \ilObjTermsOfService $tos, \ilLanguage $lng, - $saveCommand = 'saveSettings', - $isEditable = false + string $formAction = '', + string $saveCommand = 'saveSettings', + bool $isEditable = false ) { $this->tos = $tos; $this->lng = $lng; + $this->formAction = $formAction; $this->saveCommand = $saveCommand; $this->isEditable = $isEditable; @@ -60,6 +56,7 @@ public function __construct( protected function initForm() { $this->setTitle($this->lng->txt('tos_tos_settings')); + $this->setFormAction($this->formAction); $status = new \ilCheckboxInputGUI($this->lng->txt('tos_status_enable'), 'tos_status'); $status->setValue(1); @@ -76,7 +73,7 @@ protected function initForm() /** * @return bool */ - public function hasTranslatedError() + public function hasTranslatedError(): bool { return strlen($this->translatedError); } @@ -84,7 +81,7 @@ public function hasTranslatedError() /** * @return string */ - public function getTranslatedError() + public function getTranslatedError(): string { return $this->translatedError; } @@ -92,7 +89,7 @@ public function getTranslatedError() /** * @return bool */ - public function saveObject() + public function saveObject(): bool { if (!$this->fillObject()) { $this->setValuesByPost(); @@ -119,7 +116,7 @@ public function saveObject() /** * */ - protected function fillObject() + protected function fillObject(): bool { if (!$this->checkInput()) { return false; diff --git a/Services/TermsOfService/classes/class.ilTermsOfServiceTableDataProviderFactory.php b/Services/TermsOfService/classes/class.ilTermsOfServiceTableDataProviderFactory.php index b3ed8f15730b..d09d6f7694db 100644 --- a/Services/TermsOfService/classes/class.ilTermsOfServiceTableDataProviderFactory.php +++ b/Services/TermsOfService/classes/class.ilTermsOfServiceTableDataProviderFactory.php @@ -1,27 +1,15 @@ - * @version $Id$ + * Class ilTermsOfServiceTableDataProviderFactory + * @author Michael Jansen */ class ilTermsOfServiceTableDataProviderFactory { - /** - * @var ilLanguage|null - */ - protected $lng; - - /** - * @var ilDBInterface|null - */ + /** @var \ilDBInterface|null */ protected $db; - /** - * @var string - */ - const CONTEXT_AGRREMENT_BY_LANGUAGE = 'agreements_by_language'; - /** * @var string */ @@ -29,22 +17,16 @@ class ilTermsOfServiceTableDataProviderFactory /** * @param string $context - * @return ilTermsOfServiceAgreementByLanguageProvider|ilTermsOfServiceAgreementByLanguageProvider|ilTermsOfServiceAcceptanceHistoryProvider + * @return ilTermsOfServiceAcceptanceHistoryProvider * @throws ilTermsOfServiceMissingLanguageAdapterException + * @throws ilTermsOfServiceMissingDatabaseAdapterException * @throws InvalidArgumentException */ - public function getByContext($context) + public function getByContext(string $context): \ilTermsOfServiceTableDataProvider { - switch($context) - { - case self::CONTEXT_AGRREMENT_BY_LANGUAGE: - $this->validateConfiguration(array('lng')); - require_once 'Services/TermsOfService/classes/class.ilTermsOfServiceAgreementByLanguageProvider.php'; - return new ilTermsOfServiceAgreementByLanguageProvider($this->lng); - + switch ($context) { case self::CONTEXT_ACCEPTANCE_HISTORY: $this->validateConfiguration(array('db')); - require_once 'Services/TermsOfService/classes/class.ilTermsOfServiceAcceptanceHistoryProvider.php'; return new ilTermsOfServiceAcceptanceHistoryProvider($this->getDatabaseAdapter()); default: @@ -53,16 +35,14 @@ public function getByContext($context) } /** - * @param array $mandatory_members + * @param array $mandatoryMemverVariables * @throws ilTermsOfServiceMissingLanguageAdapterException * @throws ilTermsOfServiceMissingDatabaseAdapterException */ - protected function validateConfiguration(array $mandatory_members) + protected function validateConfiguration(array $mandatoryMemverVariables) { - foreach($mandatory_members as $member) - { - if(null == $this->{$member}) - { + foreach ($mandatoryMemverVariables as $member) { + if (null == $this->{$member}) { $exception = $this->getExceptionByMember($member); throw $exception; } @@ -76,39 +56,19 @@ protected function validateConfiguration(array $mandatory_members) */ protected function getExceptionByMember($member) { - switch($member) - { - case 'lng': - require_once 'Services/TermsOfService/exceptions/class.ilTermsOfServiceMissingLanguageAdapterException.php'; - return new ilTermsOfServiceMissingLanguageAdapterException('Incomplete factory configuration. Please inject a language adapter.'); - + switch ($member) { case 'db': - require_once 'Services/TermsOfService/exceptions/class.ilTermsOfServiceMissingDatabaseAdapterException.php'; - return new ilTermsOfServiceMissingDatabaseAdapterException('Incomplete factory configuration. Please inject a database adapter.'); + return new ilTermsOfServiceMissingDatabaseAdapterException( + 'Incomplete factory configuration. Please inject a database adapter.' + ); default: - throw new InvalidArgumentException("Exveption for member {$member} not supported"); + throw new InvalidArgumentException("Exception for member {$member} not supported"); } } /** - * @param ilLanguage|null $lng - */ - public function setLanguageAdapter($lng) - { - $this->lng = $lng; - } - - /** - * @return ilLanguage - */ - public function getLanguageAdapter() - { - return $this->lng; - } - - /** - * @param ilDBInterface|null $db + * @param \ilDBInterface|null $db */ public function setDatabaseAdapter($db) { @@ -116,7 +76,7 @@ public function setDatabaseAdapter($db) } /** - * @return ilDBInterface|null + * @return \ilDBInterface|null */ public function getDatabaseAdapter() { diff --git a/Services/TermsOfService/classes/class.ilTermsOfServiceTableDatabaseDataProvider.php b/Services/TermsOfService/classes/class.ilTermsOfServiceTableDatabaseDataProvider.php index d9fe17a2eccb..ead415745158 100644 --- a/Services/TermsOfService/classes/class.ilTermsOfServiceTableDatabaseDataProvider.php +++ b/Services/TermsOfService/classes/class.ilTermsOfServiceTableDatabaseDataProvider.php @@ -1,25 +1,20 @@ - * @version $Id$ - * @abstract + * Class ilTermsOfServiceTableDatabaseDataProvider + * @author Michael Jansen */ -abstract class ilTermsOfServiceTableDatabaseDataProvider implements ilTermsOfServiceTableDataProvider +abstract class ilTermsOfServiceTableDatabaseDataProvider implements \ilTermsOfServiceTableDataProvider { - /** - * @var ilDBInterface - */ + /** @var ilDBInterface */ protected $db; /** * ilTermsOfServiceTableDatabaseDataProvider constructor. - * @param ilDBInterface $db + * @param \ilDBInterface $db */ - public function __construct(ilDBInterface $db) + public function __construct(\ilDBInterface $db) { $this->db = $db; } @@ -28,33 +23,29 @@ public function __construct(ilDBInterface $db) * @param array $params * @param array $filter * @return string - * @abstract */ - abstract protected function getSelectPart(array $params, array $filter); + abstract protected function getSelectPart(array $params, array $filter): string; /** * @param array $params * @param array $filter * @return string - * @abstract */ - abstract protected function getFromPart(array $params, array $filter); + abstract protected function getFromPart(array $params, array $filter): string; /** * @param array $params * @param array $filter * @return string - * @abstract */ - abstract protected function getWherePart(array $params, array $filter); + abstract protected function getWherePart(array $params, array $filter): string; /** * @param array $params * @param array $filter * @return string - * @abstract */ - abstract protected function getGroupByPart(array $params, array $filter); + abstract protected function getGroupByPart(array $params, array $filter): string; /** * @param array $params @@ -62,50 +53,46 @@ abstract protected function getGroupByPart(array $params, array $filter); * @return string * @abstract */ - abstract protected function getHavingPart(array $params, array $filter); + abstract protected function getHavingPart(array $params, array $filter): string; /** * @param array $params * @param array $filter * @return string - * @abstract */ - abstract protected function getOrderByPart(array $params, array $filter); + abstract protected function getOrderByPart(array $params, array $filter): string; /** * @param array $params * @param array $filter * @return array - * @throws InvalidArgumentException + * @throws \InvalidArgumentException */ - public function getList(array $params, array $filter) + public function getList(array $params, array $filter): array { $data = array( 'items' => array(), - 'cnt' => 0 + 'cnt' => 0 ); $select = $this->getSelectPart($params, $filter); - $where = $this->getWherePart($params, $filter); - $from = $this->getFromPart($params, $filter); - $order = $this->getOrderByPart($params, $filter); - $group = $this->getGroupByPart($params, $filter); + $where = $this->getWherePart($params, $filter); + $from = $this->getFromPart($params, $filter); + $order = $this->getOrderByPart($params, $filter); + $group = $this->getGroupByPart($params, $filter); $having = $this->getHavingPart($params, $filter); - if(isset($params['limit'])) - { - if(!is_numeric($params['limit'])) - { - throw new InvalidArgumentException('Please provide a valid numerical limit.'); + if (isset($params['limit'])) { + if (!is_numeric($params['limit'])) { + throw new \InvalidArgumentException('Please provide a valid numerical limit.'); } - if(!isset($params['offset'])) - { + if (!isset($params['offset'])) { $params['offset'] = 0; - } - else if(!is_numeric($params['offset'])) - { - throw new InvalidArgumentException('Please provide a valid numerical offset.'); + } else { + if (!is_numeric($params['offset'])) { + throw new \InvalidArgumentException('Please provide a valid numerical offset.'); + } } $this->db->setLimit($params['limit'], $params['offset']); @@ -114,31 +101,26 @@ public function getList(array $params, array $filter) $where = strlen($where) ? 'WHERE ' . $where : ''; $query = "SELECT {$select} FROM {$from} {$where}"; - if(strlen($group)) - { + if (strlen($group)) { $query .= " GROUP BY {$group}"; } - if(strlen($having)) - { + if (strlen($having)) { $query .= " HAVING {$having}"; } - if(strlen($order)) - { + if (strlen($order)) { $query .= " ORDER BY {$order}"; } $res = $this->db->query($query); - while($row = $this->db->fetchAssoc($res)) - { + while ($row = $this->db->fetchAssoc($res)) { $data['items'][] = $row; } - if(isset($params['limit'])) - { - $cnt_sql = "SELECT COUNT(*) cnt FROM ({$query}) subquery"; - $row_cnt = $this->db->fetchAssoc($this->db->query($cnt_sql)); + if (isset($params['limit'])) { + $cnt_sql = "SELECT COUNT(*) cnt FROM ({$query}) subquery"; + $row_cnt = $this->db->fetchAssoc($this->db->query($cnt_sql)); $data['cnt'] = $row_cnt['cnt']; } diff --git a/Services/TermsOfService/classes/class.ilTermsOfServiceTableGUI.php b/Services/TermsOfService/classes/class.ilTermsOfServiceTableGUI.php index 59025d44b0a2..bebca58eb23e 100644 --- a/Services/TermsOfService/classes/class.ilTermsOfServiceTableGUI.php +++ b/Services/TermsOfService/classes/class.ilTermsOfServiceTableGUI.php @@ -1,105 +1,138 @@ - * @version $Id$ - * @abstract */ -abstract class ilTermsOfServiceTableGUI extends ilTable2GUI +abstract class ilTermsOfServiceTableGUI extends \ilTable2GUI { - /** - * @var ilCtrl - */ - protected $ctrl; + /** @var \ilTermsOfServiceTableDataProvider */ + protected $provider; - /** - * @var array - */ - protected $visibleOptionalColumns = array(); + /** @var array */ + protected $visibleOptionalColumns = []; - /** - * @var ilTermsOfServiceTableDataProvider - */ - protected $provider; + /** @var array */ + protected $optionalColumns = []; - /** - * @var array - */ - protected $optionalColumns = array(); + /** @var array */ + protected $filter = []; - /** - * @var array - */ - protected $filter = array(); + /** @var array */ + protected $optional_filter = []; /** - * @var array + * @inheritdoc */ - protected $optional_filter = array(); + public function __construct($a_parent_obj, $command = '', $a_template_context = '') + { + parent::__construct($a_parent_obj, $command, $a_template_context); + + $columns = $this->getColumnDefinition(); + $this->optionalColumns = (array)$this->getSelectableColumns(); + $this->visibleOptionalColumns = (array)$this->getSelectedColumns(); + + foreach ($columns as $index => $column) { + if ($this->isColumnVisible($index)) { + $this->addColumn( + $column['txt'], + isset($column['sortable']) && $column['sortable'] ? $column['field'] : '', + isset($column['width']) ? $column['width'] : '', + isset($column['is_checkbox']) ? (bool)$column['is_checkbox'] : false + ); + } + } + } /** - * Set the provider to be used for data retrieval. - * @params ilTableDataProvider $mapper + * @param \ilTermsOfServiceTableDataProvider $provider */ - public function setProvider(ilTermsOfServiceTableDataProvider $provider) + public function setProvider(\ilTermsOfServiceTableDataProvider $provider) { $this->provider = $provider; } /** - * Get the registered provider instance - * @return ilTermsOfServiceTableDataProvider + * @return \ilTermsOfServiceTableDataProvider */ - public function getProvider() + public function getProvider(): \ilTermsOfServiceTableDataProvider { return $this->provider; } /** - * @param string $column - * @return bool + * @param array $params + * @param array $filter */ - protected function isColumnVisible($column) + protected function onBeforeDataFetched(array &$params, array &$filter) { - if(array_key_exists($column, $this->optionalColumns) && !isset($this->visibleOptionalColumns[$column])) - { - return false; - } + } - return true; + /** + * This method can be used to add some field values dynamically or manipulate existing values of the table row array + * @param array $row + */ + protected function prepareRow(array &$row) + { } /** - * This method can be used to prepare values for sorting (e.g. translations), to filter items etc. - * It is called before sorting and segmentation. * @param array $data - * @return array */ - protected function prepareData(array &$data) + protected function preProcessData(array &$data) { } /** - * This method can be used to manipulate the data of a row after sorting and segmentation - * @param array $data + * Define a final formatting for a cell value + * @param string $column + * @param array $row + * @return string + */ + protected function formatCellValue(string $column, array $row): string + { + return trim($row[$column]); + } + + /** * @return array */ - protected function prepareRow(array &$row) + public function getSelectableColumns() { + $optionalColumns = array_filter($this->getColumnDefinition(), function ($column) { + return isset($column['optional']) && $column['optional']; + }); + + $columns = array(); + foreach ($optionalColumns as $index => $column) { + $columns[$column['field']] = $column; + } + + return $columns; } /** - * Define a final formatting for a cell value - * @param mixed $column - * @param array $row - * @return mixed + * @param int $index + * @return bool */ - protected function formatCellValue($column, array $row) + protected function isColumnVisible(int $index) { - return $row[$column]; + $columnDefinition = $this->getColumnDefinition(); + if (array_key_exists($index, $columnDefinition)) { + $column = $columnDefinition[$index]; + if (isset($column['optional']) && !$column['optional']) { + return true; + } + + if ( + is_array($this->visibleOptionalColumns) && + array_key_exists($column['field'], $this->visibleOptionalColumns) + ) { + return true; + } + } + + return false; } /** @@ -109,28 +142,17 @@ final protected function fillRow($row) { $this->prepareRow($row); - foreach($this->getStaticData() as $column) - { - $value = $this->formatCellValue($column, $row); - $this->tpl->setVariable('VAL_' . strtoupper($column), $value); - } - - foreach($this->optionalColumns as $index => $definition) - { - if(!$this->isColumnVisible($index)) - { + foreach ($this->getColumnDefinition() as $index => $column) { + if (!$this->isColumnVisible($index)) { continue; } - $this->tpl->setCurrentBlock('optional_column'); - $value = $this->formatCellValue($index, $row); - if((string)$value === '') - { - $this->tpl->touchBlock('optional_column'); - } - else - { - $this->tpl->setVariable('OPTIONAL_COLUMN_VAL', $value); + $this->tpl->setCurrentBlock('column'); + $value = $this->formatCellValue($column['field'], $row); + if ((string)$value === '') { + $this->tpl->touchBlock('column'); + } else { + $this->tpl->setVariable('COLUMN_VALUE', $value); } $this->tpl->parseCurrentBlock(); @@ -138,68 +160,58 @@ final protected function fillRow($row) } /** - * Return an array of all static (always visible) data fields in a row. - * For each key there has to be a variable name VAL_ in your defined row template. - * Example: - * return array('title', 'checkbox'); - * There have to be two template variables: VAL_TITLE and VAL_CHECKBOX * @return array - * @abstract */ - abstract protected function getStaticData(); + abstract protected function getColumnDefinition(): array; /** - * @throws ilException + * */ public function populate() { - if(!$this->getExternalSegmentation() && $this->getExternalSorting()) - { - $this->determineOffsetAndOrder(true); - } - else if($this->getExternalSegmentation() || $this->getExternalSorting()) - { + if ($this->getExternalSegmentation() && $this->getExternalSorting()) { $this->determineOffsetAndOrder(); + } else { + if (!$this->getExternalSegmentation() && $this->getExternalSorting()) { + $this->determineOffsetAndOrder(true); + } } - $params = array(); - if($this->getExternalSegmentation()) - { - $params['limit'] = $this->getLimit(); + $params = []; + if ($this->getExternalSegmentation()) { + $params['limit'] = $this->getLimit(); $params['offset'] = $this->getOffset(); } - if($this->getExternalSorting()) - { - $params['order_field'] = $this->getOrderField(); + if ($this->getExternalSorting()) { + $params['order_field'] = $this->getOrderField(); $params['order_direction'] = $this->getOrderDirection(); } $this->determineSelectedFilters(); - $filter = $this->filter; - - foreach($this->optional_filter as $key => $value) - { - if($this->isFilterSelected($key)) - { + $filter = (array)$this->filter; + + foreach ($this->optional_filter as $key => $value) { + if ($this->isFilterSelected($key)) { $filter[$key] = $value; } } + $this->onBeforeDataFetched($params, $filter); $data = $this->getProvider()->getList($params, $filter); - if(!count($data['items']) && $this->getOffset() > 0 && $this->getExternalSegmentation()) - { + if (!count($data['items']) && $this->getOffset() > 0 && $this->getExternalSegmentation()) { $this->resetOffset(); - $params['limit'] = $this->getLimit(); - $params['offset'] = $this->getOffset(); - $data = $this->getProvider()->getList($params, $filter); + if ($this->getExternalSegmentation()) { + $params['limit'] = $this->getLimit(); + $params['offset'] = $this->getOffset(); + } + $data = $this->provider->getList($params, $filter); } - $this->prepareData($data); + $this->preProcessData($data); $this->setData($data['items']); - if($this->getExternalSegmentation()) - { + if ($this->getExternalSegmentation()) { $this->setMaxCount($data['cnt']); } } diff --git a/Services/TermsOfService/interfaces/interface.ilTermsOfServiceControllerEnabled.php b/Services/TermsOfService/interfaces/interface.ilTermsOfServiceControllerEnabled.php new file mode 100644 index 000000000000..f1fcd281609a --- /dev/null +++ b/Services/TermsOfService/interfaces/interface.ilTermsOfServiceControllerEnabled.php @@ -0,0 +1,11 @@ + + */ +interface ilTermsOfServiceControllerEnabled +{ + public function executeCommand(); +} \ No newline at end of file diff --git a/Services/TermsOfService/interfaces/interface.ilTermsOfServiceTableDataProvider.php b/Services/TermsOfService/interfaces/interface.ilTermsOfServiceTableDataProvider.php index 864490cafaba..7189882499e6 100644 --- a/Services/TermsOfService/interfaces/interface.ilTermsOfServiceTableDataProvider.php +++ b/Services/TermsOfService/interfaces/interface.ilTermsOfServiceTableDataProvider.php @@ -1,16 +1,16 @@ - * @version $Id$ + * Interface ilTermsOfServiceTableDataProvider + * @author Michael Jansen */ interface ilTermsOfServiceTableDataProvider { /** - * @param array $params Table paramaters like limit or order - * @param array $filter Filter settings - * @return array + * @param array $params Table parameters like limit or order + * @param array $filter Filter settings provided by a ilTable2GUI instance + * @return array An associative array with keys 'items' (array of items) and 'cnt' (number of total items) */ - public function getList(array $params, array $filter); + public function getList(array $params, array $filter): array; } \ No newline at end of file diff --git a/Services/TermsOfService/templates/default/tpl.tos_acceptance_history_table_row.html b/Services/TermsOfService/templates/default/tpl.tos_acceptance_history_table_row.html index 12ff075a446e..d00bf27cc081 100644 --- a/Services/TermsOfService/templates/default/tpl.tos_acceptance_history_table_row.html +++ b/Services/TermsOfService/templates/default/tpl.tos_acceptance_history_table_row.html @@ -1,32 +1,3 @@ - {VAL_TS} - {VAL_LOGIN} - {OPTIONAL_COLUMN_VAL} - {VAL_LNG} - {VAL_SRC} - {VAL_IMG_DOWN} - {VAL_MODAL} - - + {COLUMN_VALUE} \ No newline at end of file diff --git a/Services/TermsOfService/templates/default/tpl.tos_agreement_by_lng_table_row.html b/Services/TermsOfService/templates/default/tpl.tos_agreement_by_lng_table_row.html deleted file mode 100644 index 80c597f46311..000000000000 --- a/Services/TermsOfService/templates/default/tpl.tos_agreement_by_lng_table_row.html +++ /dev/null @@ -1,34 +0,0 @@ - - {VAL_LANGUAGE} - {VAL_AGREEMENT} - {VAL_AGREEMENT_DOCUMENT} - - {VAL_IMG_DOWN} - {VAL_MODAL} - - - - - {OPTIONAL_COLUMN_VAL} - \ No newline at end of file diff --git a/Services/TermsOfService/templates/default/tpl.tos_documents_row.html b/Services/TermsOfService/templates/default/tpl.tos_documents_row.html new file mode 100644 index 000000000000..d00bf27cc081 --- /dev/null +++ b/Services/TermsOfService/templates/default/tpl.tos_documents_row.html @@ -0,0 +1,3 @@ + + {COLUMN_VALUE} + \ No newline at end of file diff --git a/Services/TermsOfService/test/factories/ilTermsOfServiceTableDataProviderFactoryTest.php b/Services/TermsOfService/test/factories/ilTermsOfServiceTableDataProviderFactoryTest.php index 00c8f2c6e81e..12752bc4daa1 100644 --- a/Services/TermsOfService/test/factories/ilTermsOfServiceTableDataProviderFactoryTest.php +++ b/Services/TermsOfService/test/factories/ilTermsOfServiceTableDataProviderFactoryTest.php @@ -36,7 +36,6 @@ public function testInstanceCanBeCreated() $factory = new ilTermsOfServiceTableDataProviderFactory(); $this->assertInstanceOf('ilTermsOfServiceTableDataProviderFactory', $factory); $factory->setDatabaseAdapter($this->getMockBuilder('ilDBInterface')->getMock()); - $factory->setLanguageAdapter($this->getMockBuilder('ilLanguage')->setMethods(array('toJSON', 'getInstalledLanguages', 'getLangKey', 'getDefaultLanguage'))->disableOriginalConstructor()->getMock()); return $factory; } @@ -51,17 +50,6 @@ public function testExceptionIsRaisedWhenUnsupportedProviderIsRequested(ilTermsO $factory->getByContext('PHP unit'); } - /** - * @param ilTermsOfServiceTableDataProviderFactory $factory - * @depends testInstanceCanBeCreated - */ - public function testFactoryShouldReturnLanguageAdapterWhenLanguageAdapterIsSet(ilTermsOfServiceTableDataProviderFactory $factory) - { - $lng = $this->getMockBuilder('ilLanguage')->setMethods(array('toJSON', 'getInstalledLanguages'))->disableOriginalConstructor()->getMock(); - $factory->setLanguageAdapter($lng); - $this->assertEquals($lng, $factory->getLanguageAdapter()); - } - /** * @param ilTermsOfServiceTableDataProviderFactory $factory * @depends testInstanceCanBeCreated @@ -73,18 +61,6 @@ public function testFactoryShouldReturnDatabaseAdapterWhenDatabaseAdapterIsSet(i $this->assertEquals($db, $factory->getDatabaseAdapter()); } - /** - * @depends testInstanceCanBeCreated - * @param ilTermsOfServiceTableDataProviderFactory $factory - * @expectedException ilTermsOfServiceMissingLanguageAdapterException - */ - public function testExceptionIsRaisedWhenAgreementByLanguageProviderIsRequestedWithoutCompleteFactoryConfiguration(ilTermsOfServiceTableDataProviderFactory $factory) - { - $this->assertException(ilTermsOfServiceMissingLanguageAdapterException::class); - $factory->setLanguageAdapter(null); - $factory->getByContext(ilTermsOfServiceTableDataProviderFactory::CONTEXT_AGRREMENT_BY_LANGUAGE); - } - /** * @depends testInstanceCanBeCreated * @param ilTermsOfServiceTableDataProviderFactory $factory @@ -97,16 +73,6 @@ public function testExceptionIsRaisedWhenAcceptanceHistoryProviderIsRequestedWit $factory->getByContext(ilTermsOfServiceTableDataProviderFactory::CONTEXT_ACCEPTANCE_HISTORY); } - /** - * @param ilTermsOfServiceTableDataProviderFactory $factory - * @depends testInstanceCanBeCreated - */ - public function testFactoryShouldReturnAgreementByLanguageProviderWhenRequested(ilTermsOfServiceTableDataProviderFactory $factory) - { - $factory->setLanguageAdapter($this->getMockBuilder('ilLanguage')->setMethods(array('toJSON', 'getInstalledLanguages'))->disableOriginalConstructor()->getMock()); - $this->assertInstanceOf('ilTermsOfServiceAgreementByLanguageProvider', $factory->getByContext(ilTermsOfServiceTableDataProviderFactory::CONTEXT_AGRREMENT_BY_LANGUAGE)); - } - /** * @param ilTermsOfServiceTableDataProviderFactory $factory * @depends testInstanceCanBeCreated diff --git a/Services/TermsOfService/test/ilServicesTermsOfServiceSuite.php b/Services/TermsOfService/test/ilServicesTermsOfServiceSuite.php index 97c058f0009d..82d1049b72e8 100644 --- a/Services/TermsOfService/test/ilServicesTermsOfServiceSuite.php +++ b/Services/TermsOfService/test/ilServicesTermsOfServiceSuite.php @@ -32,9 +32,6 @@ public static function suite() require_once 'Services/TermsOfService/test/factories/ilTermsOfServiceTableDataProviderFactoryTest.php'; $suite->addTestSuite('ilTermsOfServiceTableDataProviderFactoryTest'); - require_once 'Services/TermsOfService/test/provider/ilTermsOfServiceAgreementsByLanguageTableDataProviderTest.php'; - $suite->addTestSuite('ilTermsOfServiceAgreementsByLanguageTableDataProviderTest'); - require_once 'Services/TermsOfService/test/provider/ilTermsOfServiceAcceptanceHistoryProviderTest.php'; $suite->addTestSuite('ilTermsOfServiceAcceptanceHistoryProviderTest'); diff --git a/Services/TermsOfService/test/provider/ilTermsOfServiceAgreementsByLanguageTableDataProviderTest.php b/Services/TermsOfService/test/provider/ilTermsOfServiceAgreementsByLanguageTableDataProviderTest.php deleted file mode 100644 index e13321fcace2..000000000000 --- a/Services/TermsOfService/test/provider/ilTermsOfServiceAgreementsByLanguageTableDataProviderTest.php +++ /dev/null @@ -1,127 +0,0 @@ - - * @version $Id$ - */ -class ilTermsOfServiceAgreementsByLanguageTableDataProviderTest extends ilTermsOfServiceBaseTest -{ - /** - * @var bool - */ - protected $backupGlobals = false; - - /** - * - */ - public function setUp() - { - if(!defined('CLIENT_ID')) - { - define('CLIENT_ID', 'phpunit'); - } - - vfs\vfsStreamWrapper::register(); - - parent::setUp(); - } - - /** - * @return ilTermsOfServiceAgreementByLanguageProvider - */ - public function testAgreementByLanguageProviderCanBeCreatedByFactory() - { - require_once 'Services/TermsOfService/classes/class.ilTermsOfServiceTableDataProviderFactory.php'; - $factory = new ilTermsOfServiceTableDataProviderFactory(); - $factory->setLanguageAdapter($this->getMockBuilder('ilLanguage')->setMethods(array('toJSON', 'getInstalledLanguages'))->disableOriginalConstructor()->getMock()); - $provider = $factory->getByContext(ilTermsOfServiceTableDataProviderFactory::CONTEXT_AGRREMENT_BY_LANGUAGE); - - $this->assertInstanceOf('ilTermsOfServiceAgreementByLanguageProvider', $provider); - $this->assertInstanceOf('ilTermsOfServiceTableDataProvider', $provider); - - return $provider; - } - - /** - * @param ilTermsOfServiceAgreementByLanguageProvider $provider - * @depends testAgreementByLanguageProviderCanBeCreatedByFactory - */ - public function testProviderReturnsAResultForEveryInstalledLanguage(ilTermsOfServiceAgreementByLanguageProvider $provider) - { - $client_rel_path = implode('/', array('clients', 'default', 'agreement')); - $global_rel_path = implode('/', array('global', 'agreement')); - - $root = vfs\vfsStreamWrapper::setRoot(new vfs\vfsStreamDirectory('root')); - $customizing_dir = vfs\vfsStream::newDirectory('Customizing')->at($root); - - $client_dir = vfs\vfsStream::newDirectory($client_rel_path)->at($customizing_dir); - vfs\vfsStream::newFile('agreement_de.html', 0777)->at($client_dir); - file_put_contents(vfs\vfsStream::url('root/Customizing/' . $client_rel_path . '/agreement_de.html'), 'phpunit'); - - $global_dir = vfs\vfsStream::newDirectory($global_rel_path)->at($customizing_dir); - vfs\vfsStream::newFile('agreement_en.html', 0777)->at($global_dir); - file_put_contents(vfs\vfsStream::url('root/Customizing/' . $global_rel_path . '/agreement_en.html'), 'phpunit'); - - $provider->setSourceDirectories(array( - vfs\vfsStream::url('root/Customizing/' . $client_rel_path), - vfs\vfsStream::url('root/Customizing/' . $global_rel_path) - )); - - $lng = $this->getMockBuilder('ilLanguage')->setMethods(array('toJSON', 'getInstalledLanguages'))->disableOriginalConstructor()->getMock(); - $installed_languages = array('en', 'de', 'fr'); - $lng->expects($this->once())->method('getInstalledLanguages')->will($this->onConsecutiveCalls($installed_languages)); - $provider->setLanguageAdapter($lng); - - $data = $provider->getList(array(), array()); - $this->assertArrayHasKey('items', $data); - $this->assertArrayHasKey('cnt', $data); - $this->assertCount(count($installed_languages), $data['items']); - $this->assertEquals(count($installed_languages), $data['cnt']); - - for($i = 0; $i < count($installed_languages); $i++) - { - $this->assertArrayHasKey('language', $data['items'][$i]); - $this->assertArrayHasKey('agreement', $data['items'][$i]); - $this->assertArrayHasKey('agreement_document', $data['items'][$i]); - $this->assertArrayHasKey('agreement_document_modification_ts', $data['items'][$i]); - - if($installed_languages[$i] == 'fr') - { - $this->assertFalse(file_exists($data['items'][$i]['agreement_document'])); - } - else - { - $this->assertTrue(file_exists($data['items'][$i]['agreement_document'])); - } - } - } - - /** - * @param ilTermsOfServiceAgreementByLanguageProvider $provider - * @depends testAgreementByLanguageProviderCanBeCreatedByFactory - */ - public function testProviderShouldReturnLanguageAdapterWhenLanguageAdapterIsSet(ilTermsOfServiceAgreementByLanguageProvider $provider) - { - $expected = $this->getMockBuilder('ilLanguage')->setMethods(array('toJSON', 'getInstalledLanguages'))->disableOriginalConstructor()->getMock(); - - $provider->setLanguageAdapter($expected); - $this->assertEquals($expected, $provider->getLanguageAdapter()); - } - - /** - * @param ilTermsOfServiceAgreementByLanguageProvider $provider - * @depends testAgreementByLanguageProviderCanBeCreatedByFactory - */ - public function testProviderShouldReturnSourceDirectoriesWhenSourceDirectoriesAreSet(ilTermsOfServiceAgreementByLanguageProvider $provider) - { - $expected = array('/phpunit', '/ilias'); - - $provider->setSourceDirectories($expected); - $this->assertEquals($expected, $provider->getSourceDirectories()); - } -} diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index c7302a706c59..41c17606a083 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -10372,6 +10372,21 @@ tos#:#tos_period#:#Zeitraum tos#:#tos_period_from#:#Von tos#:#tos_period_until#:#Bis tos#:#tos_acceptance_datetime#:#Datum +tos#:#tos_form_new_doc_head#:#Dokument erstellen +tos#:#tos_form_document_title#:#Titel +tos#:#tos_form_document_title_info#:#Geben Sie hier einen Titel für das Dokument ein. +tos#:#tos_form_document#:#Dokument +tos#:#tos_form_document_info#:#Bitte wählen Sie eine entsprechende Datei von Ihrem lokalen Dateisystem. +tos#:#tos_tbl_docs_title#:#Dokumente +tos#:#tos_tbl_docs_head_sorting#:#Sortierung +tos#:#tos_tbl_docs_head_title#:#Titel +tos#:#tos_tbl_docs_head_last_change#:#Letzte Änderung +tos#:#tos_tbl_docs_head_criteria#:#Kriterien +tos#:#tos_tbl_docs_action_edit_criteria#:#Kriterien bearbeiten +tos#:#tos_sure_delete_documents_s#:#Sind Sie sicher, dass Sie das gewählte Dokument löschen möchten? +tos#:#tos_sure_delete_documents_p#:#Sind Sie sicher, dass Sie die gewählten Dokumente löschen möchten? +tos#:#tos_deleted_documents_s#:#Das Dokument wurde gelöscht. +tos#:#tos_deleted_documents_p#:#Die gewählten Dokumente wurden gelöscht. tos#:#tos_no_documents_exist#:#Aktuell liegen in keiner installierten Sprache Nutzungsvereinbarungen vor. tos#:#tos_no_documents_exist_cant_save#:#Aktuell liegen keine Nutzungsvereinbarungen vor. Bitte erstellen Sie mindestens ein Dokument um den Service zu aktivieren. ecs#:#ecs_sync_trees#:#CMS-Verzeichnisbäume aktualisieren diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 45be21ace487..e26e05223afb 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -10339,6 +10339,21 @@ tos#:#tos_status_desc#:#If activated, users are forced to accept the terms of se tos#:#tos_reset_tos_for_all_users#:#Reset Terms of Service tos#:#tos_sure_reset_tos#:#Are you sure you want to reset the terms of service for all users in system? This also applies to those accounts that are used for the SOAP web service for instance. tos#:#tos_reset_successfull#:#The terms of service have been reset successfully. +tos#:#tos_form_new_doc_head#:#Create Document +tos#:#tos_form_document_title#:#Title +tos#:#tos_form_document_title_info#:#Please enter a title for the document. +tos#:#tos_form_document#:#Document +tos#:#tos_form_document_info#:#Please select a file from your local filesystem. +tos#:#tos_tbl_docs_title#:#Documents +tos#:#tos_tbl_docs_head_sorting#:#Sorting +tos#:#tos_tbl_docs_head_title#:#Title +tos#:#tos_tbl_docs_head_last_change#:#Last Change +tos#:#tos_tbl_docs_head_criteria#:#Criteria +tos#:#tos_tbl_docs_action_edit_criteria#:#Edit Criteria +tos#:#tos_sure_delete_documents_s#:#Are you sure you want to delete the document? +tos#:#tos_sure_delete_documents_p#:#Are you sure you want to delete the selected documents? +tos#:#tos_deleted_documents_s#:#The document has been deleted. +tos#:#tos_deleted_documents_p#:#The documents have been deleted. user#:#tos_show_signed_text#:#Show Details user#:#tos_not_accepted_yet#:#Not accepted yet user#:#tos_accepted_content#:#Accepted Content