openrat-cms

OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs | README

commit 5cb05b61011414d92da0459a1a26064cfeeb0240
parent 4f16d999948f5a3b36f6884f79ab0ae821d4b455
Author: Jan Dankert <develop@jandankert.de>
Date:   Tue, 17 Nov 2020 23:51:00 +0100

Refactoring: Every Actionmethod has now its own class.

Diffstat:
Mdev-helper/test.php | 3++-
Mmodules/cms/Dispatcher.class.php | 52++++++++++++++++++++++++++++++++++------------------
Mmodules/cms/action/Action.class.php | 7+------
Mmodules/cms/action/AliasAction.class.php | 1-
Mmodules/cms/action/ConfigurationAction.class.php | 3++-
Mmodules/cms/action/ElementAction.class.php | 7+++----
Mmodules/cms/action/FileAction.class.php | 10+++-------
Mmodules/cms/action/FolderAction.class.php | 23+++++++++--------------
Mmodules/cms/action/GroupAction.class.php | 10++++------
Mmodules/cms/action/GrouplistAction.class.php | 1+
Mmodules/cms/action/ImageAction.class.php | 12+++---------
Mmodules/cms/action/LanguageAction.class.php | 6++----
Mmodules/cms/action/LanguagelistAction.class.php | 6++----
Mmodules/cms/action/LinkAction.class.php | 7++-----
Mmodules/cms/action/LoginAction.class.php | 19++++++-------------
Amodules/cms/action/Method.class.php | 13+++++++++++++
Mmodules/cms/action/ModelAction.class.php | 7++-----
Mmodules/cms/action/ModellistAction.class.php | 3+--
Mmodules/cms/action/ObjectAction.class.php | 17++++++++---------
Mmodules/cms/action/PageAction.class.php | 16++++++++--------
Mmodules/cms/action/PageelementAction.class.php | 24++++++++++++------------
Mmodules/cms/action/ProfileAction.class.php | 10++++------
Mmodules/cms/action/ProjectAction.class.php | 6++----
Mmodules/cms/action/SearchAction.class.php | 12++++--------
Mmodules/cms/action/TemplateAction.class.php | 12+++++-------
Mmodules/cms/action/TemplatelistAction.class.php | 5+----
Mmodules/cms/action/TextAction.class.php | 5+----
Mmodules/cms/action/UrlAction.class.php | 9++-------
Mmodules/cms/action/UserAction.class.php | 20++++++++------------
Mmodules/cms/action/UsergroupAction.class.php | 17-----------------
Mmodules/cms/action/UserlistAction.class.php | 51---------------------------------------------------
Amodules/cms/action/configuration/ConfigurationEditAction.class.php | 13+++++++++++++
Amodules/cms/action/configuration/ConfigurationShowAction.class.php | 40++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/configuration/ConfigurationSrcAction.class.php | 25+++++++++++++++++++++++++
Amodules/cms/action/element/ElementAdvancedAction.class.php | 473+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/element/ElementInfoAction.class.php | 17+++++++++++++++++
Amodules/cms/action/element/ElementPropAction.class.php | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/element/ElementRemoveAction.class.php | 32++++++++++++++++++++++++++++++++
Amodules/cms/action/file/FileAdvancedAction.class.php | 40++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/file/FileCompressAction.class.php | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/file/FileEditAction.class.php | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/file/FileExtractAction.class.php | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/file/FilePreviewAction.class.php | 17+++++++++++++++++
Amodules/cms/action/file/FilePubAction.class.php | 23+++++++++++++++++++++++
Amodules/cms/action/file/FileRemoveAction.class.php | 23+++++++++++++++++++++++
Amodules/cms/action/file/FileShowAction.class.php | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/file/FileUncompressAction.class.php | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/file/FileValueAction.class.php | 17+++++++++++++++++
Amodules/cms/action/folder/FolderAddAction.class.php | 16++++++++++++++++
Amodules/cms/action/folder/FolderAdvancedAction.class.php | 375+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderContentAction.class.php | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderCreateAction.class.php | 23+++++++++++++++++++++++
Amodules/cms/action/folder/FolderCreatefileAction.class.php | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderCreatefolderAction.class.php | 38++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderCreateimageAction.class.php | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderCreatelinkAction.class.php | 37+++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderCreatepageAction.class.php | 47+++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderCreatetextAction.class.php | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderCreateurlAction.class.php | 33+++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderEditAction.class.php | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderOrderAction.class.php | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderPreviewAction.class.php | 16++++++++++++++++
Amodules/cms/action/folder/FolderPubAction.class.php | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderRemoveAction.class.php | 27+++++++++++++++++++++++++++
Amodules/cms/action/folder/FolderRootAction.class.php | 22++++++++++++++++++++++
Amodules/cms/action/folder/FolderShowAction.class.php | 46++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/group/GroupInfoAction.class.php | 15+++++++++++++++
Amodules/cms/action/group/GroupListingAction.class.php | 23+++++++++++++++++++++++
Amodules/cms/action/group/GroupMembershipsAction.class.php | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/group/GroupPropAction.class.php | 20++++++++++++++++++++
Amodules/cms/action/group/GroupRemoveAction.class.php | 24++++++++++++++++++++++++
Amodules/cms/action/group/GroupRightsAction.class.php | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/grouplist/GrouplistAddAction.class.php | 25+++++++++++++++++++++++++
Amodules/cms/action/grouplist/GrouplistEditAction.class.php | 13+++++++++++++
Amodules/cms/action/grouplist/GrouplistShowAction.class.php | 24++++++++++++++++++++++++
Amodules/cms/action/image/ImagePreviewAction.class.php | 15+++++++++++++++
Amodules/cms/action/image/ImageSizeAction.class.php | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/language/LanguageInfoAction.class.php | 14++++++++++++++
Amodules/cms/action/language/LanguagePropAction.class.php | 36++++++++++++++++++++++++++++++++++++
Amodules/cms/action/language/LanguageRemoveAction.class.php | 15+++++++++++++++
Amodules/cms/action/language/LanguageSetdefaultAction.class.php | 16++++++++++++++++
Amodules/cms/action/languagelist/LanguagelistAddAction.class.php | 41+++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/languagelist/LanguagelistEditAction.class.php | 13+++++++++++++
Amodules/cms/action/languagelist/LanguagelistShowAction.class.php | 41+++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/link/LinkEditAction.class.php | 23+++++++++++++++++++++++
Amodules/cms/action/link/LinkRemoveAction.class.php | 20++++++++++++++++++++
Amodules/cms/action/link/LinkShowAction.class.php | 38++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginLicenseAction.class.php | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginLoginAction.class.php | 259+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginLogoutAction.class.php | 32++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginOidcAction.class.php | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginPasswordAction.class.php | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginPasswordcodeAction.class.php | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginRegisterAction.class.php | 46++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginRegistercodeAction.class.php | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/login/LoginUserinfoAction.class.php | 29+++++++++++++++++++++++++++++
Amodules/cms/action/migrate.sh | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/model/ModelInfoAction.class.php | 16++++++++++++++++
Amodules/cms/action/model/ModelPropAction.class.php | 26++++++++++++++++++++++++++
Amodules/cms/action/model/ModelRemoveAction.class.php | 25+++++++++++++++++++++++++
Amodules/cms/action/model/ModelSetdefaultAction.class.php | 18++++++++++++++++++
Amodules/cms/action/modellist/ModellistAddAction.class.php | 26++++++++++++++++++++++++++
Amodules/cms/action/modellist/ModellistEditAction.class.php | 13+++++++++++++
Amodules/cms/action/modellist/ModellistShowAction.class.php | 31+++++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectAclformAction.class.php | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectCopyAction.class.php | 176+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectDelaclAction.class.php | 28++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectInfoAction.class.php | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectInheritAction.class.php | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectNameAction.class.php | 34++++++++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectPropAction.class.php | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectRightsAction.class.php | 36++++++++++++++++++++++++++++++++++++
Amodules/cms/action/object/ObjectSettingsAction.class.php | 48++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PageChangetemplateAction.class.php | 37+++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PageChangetemplateselectelementsAction.class.php | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PageEditAction.class.php | 185+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PageFormAction.class.php | 180+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PageInfoAction.class.php | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PageNameAction.class.php | 46++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PagePreviewAction.class.php | 16++++++++++++++++
Amodules/cms/action/page/PagePubAction.class.php | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PageRemoveAction.class.php | 22++++++++++++++++++++++
Amodules/cms/action/page/PageShowAction.class.php | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/page/PageSrcAction.class.php | 25+++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementAdvancedAction.class.php | 43+++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementDiffAction.class.php | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementEditAction.class.php | 44++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementHistoryAction.class.php | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementInfoAction.class.php | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementLinkAction.class.php | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementPreviewAction.class.php | 15+++++++++++++++
Amodules/cms/action/pageelement/PageelementPropAction.class.php | 42++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementPubAction.class.php | 17+++++++++++++++++
Amodules/cms/action/pageelement/PageelementReleaseAction.class.php | 36++++++++++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementRestoreAction.class.php | 28++++++++++++++++++++++++++++
Amodules/cms/action/pageelement/PageelementValueAction.class.php | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/profile/ProfileAvailableAction.class.php | 45+++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/profile/ProfileConfirmmailAction.class.php | 33+++++++++++++++++++++++++++++++++
Amodules/cms/action/profile/ProfileEditAction.class.php | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/profile/ProfileHistoryAction.class.php | 26++++++++++++++++++++++++++
Amodules/cms/action/profile/ProfileLanguageAction.class.php | 14++++++++++++++
Amodules/cms/action/profile/ProfileMailAction.class.php | 46++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/profile/ProfileMembershipsAction.class.php | 13+++++++++++++
Amodules/cms/action/profile/ProfilePingAction.class.php | 16++++++++++++++++
Amodules/cms/action/profile/ProfilePwAction.class.php | 46++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/profile/ProfileUisettingsAction.class.php | 15+++++++++++++++
Amodules/cms/action/profile/ProfileUserinfoAction.class.php | 35+++++++++++++++++++++++++++++++++++
Amodules/cms/action/project/ProjectCopyAction.class.php | 35+++++++++++++++++++++++++++++++++++
Amodules/cms/action/project/ProjectEditAction.class.php | 15+++++++++++++++
Amodules/cms/action/project/ProjectHistoryAction.class.php | 14++++++++++++++
Amodules/cms/action/project/ProjectInfoAction.class.php | 16++++++++++++++++
Amodules/cms/action/project/ProjectListingAction.class.php | 24++++++++++++++++++++++++
Amodules/cms/action/project/ProjectMaintenanceAction.class.php | 30++++++++++++++++++++++++++++++
Amodules/cms/action/project/ProjectPropAction.class.php | 46++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/project/ProjectRemoveAction.class.php | 25+++++++++++++++++++++++++
Amodules/cms/action/projectlist/ProjectlistAddAction.class.php | 48++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/projectlist/ProjectlistEditAction.class.php | 38++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/projectlist/ProjectlistHistoryAction.class.php | 14++++++++++++++
Amodules/cms/action/search/SearchEditAction.class.php | 20++++++++++++++++++++
Amodules/cms/action/search/SearchQuicksearchAction.class.php | 34++++++++++++++++++++++++++++++++++
Amodules/cms/action/search/SearchResultAction.class.php | 35+++++++++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplateAddelAction.class.php | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplateEditAction.class.php | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplateExtensionAction.class.php | 43+++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplateInfoAction.class.php | 27+++++++++++++++++++++++++++
Amodules/cms/action/template/TemplateListingAction.class.php | 29+++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplatePreviewAction.class.php | 27+++++++++++++++++++++++++++
Amodules/cms/action/template/TemplatePropAction.class.php | 30++++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplatePubAction.class.php | 40++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplateRemoveAction.class.php | 23+++++++++++++++++++++++
Amodules/cms/action/template/TemplateShowAction.class.php | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplateSrcAction.class.php | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/template/TemplateSrcelementAction.class.php | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/templatelist/TemplatelistAddAction.class.php | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/templatelist/TemplatelistEditAction.class.php | 12++++++++++++
Amodules/cms/action/templatelist/TemplatelistShowAction.class.php | 23+++++++++++++++++++++++
Amodules/cms/action/text/TextPreviewAction.class.php | 19+++++++++++++++++++
Amodules/cms/action/text/TextShowAction.class.php | 13+++++++++++++
Amodules/cms/action/text/TextValueAction.class.php | 23+++++++++++++++++++++++
Amodules/cms/action/url/UrlEditAction.class.php | 17+++++++++++++++++
Amodules/cms/action/url/UrlPreviewAction.class.php | 13+++++++++++++
Amodules/cms/action/url/UrlRemoveAction.class.php | 24++++++++++++++++++++++++
Amodules/cms/action/url/UrlShowAction.class.php | 31+++++++++++++++++++++++++++++++
Amodules/cms/action/url/UrlValueAction.class.php | 26++++++++++++++++++++++++++
Amodules/cms/action/user/UserAddgrouptouserAction.class.php | 20++++++++++++++++++++
Amodules/cms/action/user/UserHistoryAction.class.php | 24++++++++++++++++++++++++
Amodules/cms/action/user/UserInfoAction.class.php | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/user/UserListingAction.class.php | 21+++++++++++++++++++++
Amodules/cms/action/user/UserMembershipsAction.class.php | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/user/UserPropAction.class.php | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/user/UserPwAction.class.php | 42++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/user/UserRemoveAction.class.php | 16++++++++++++++++
Amodules/cms/action/user/UserRightsAction.class.php | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/action/user/UserSwitchAction.class.php | 19+++++++++++++++++++
Amodules/cms/action/userlist/UserlistAddAction.class.php | 27+++++++++++++++++++++++++++
Amodules/cms/action/userlist/UserlistEditAction.class.php | 23+++++++++++++++++++++++
Mmodules/cms/model/File.class.php | 2+-
Mmodules/cms/ui/action/IndexAction.class.php | 14+++++++-------
Mmodules/cms/ui/action/TreeAction.class.php | 6+++---
Amodules/cms/ui/action/index/IndexManifestAction.class.php | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/ui/action/index/IndexShowAction.class.php | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/ui/action/index/IndexThemestyleAction.class.php | 36++++++++++++++++++++++++++++++++++++
Amodules/cms/ui/action/title/TitleAvailableAction.class.php | 27+++++++++++++++++++++++++++
Amodules/cms/ui/action/title/TitleHistoryAction.class.php | 38++++++++++++++++++++++++++++++++++++++
Amodules/cms/ui/action/title/TitleShowAction.class.php | 48++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/cms/ui/action/tree/TreeBranchAction.class.php | 16++++++++++++++++
Amodules/cms/ui/action/tree/TreePathAction.class.php | 19+++++++++++++++++++
Amodules/cms/ui/action/tree/TreeShowAction.class.php | 12++++++++++++
Amodules/cms/ui/themes/default/html/views/folder/preview.php | 7+++++++
Amodules/cms/ui/themes/default/html/views/folder/preview.tpl.src.xml | 8++++++++
Mmodules/cms/ui/themes/default/html/views/project/history.php | 10+++++-----
Mmodules/cms/ui/themes/default/html/views/project/history.tpl.src.xml | 10+++++-----
Amodules/cms/ui/themes/default/html/views/userlist/edit.php | 46++++++++++++++++++++++++++++++++++++++++++++++
Rmodules/cms/ui/themes/default/html/views/userlist/show.tpl.src.xml -> modules/cms/ui/themes/default/html/views/userlist/edit.tpl.src.xml | 0
Dmodules/cms/ui/themes/default/html/views/userlist/show.php | 46----------------------------------------------
Mmodules/cms/ui/themes/default/script/openrat.js | 2+-
Mmodules/cms/ui/themes/default/script/openrat.min.js | 2+-
Mmodules/cms/ui/themes/default/script/openrat/common.js | 2+-
Amodules/util/ClassName.class.php | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amodules/util/test/ClassNameTest.class.php | 37+++++++++++++++++++++++++++++++++++++
220 files changed, 8672 insertions(+), 319 deletions(-)

diff --git a/dev-helper/test.php b/dev-helper/test.php @@ -12,7 +12,8 @@ $tests = [ new \util\text\variables\VariablesTest(), new \util\test\YAMLTest(), new \util\test\MustacheTest(), - new \security\test\PasswordTest() + new \security\test\PasswordTest(), + new \util\test\ClassNameTest(), ]; echo '<h1>Running Tests</h1>'; diff --git a/modules/cms/Dispatcher.class.php b/modules/cms/Dispatcher.class.php @@ -17,9 +17,12 @@ use configuration\Config; use configuration\ConfigurationLoader; use database\Database; use cms\update\Update; +use Exception; use language\Language; use language\Messages; -use modules\cms\base\HttpRequest; +use util\ClassName; +use util\ClassUtils; +use util\exception\ObjectNotFoundException; use util\exception\ValidationException; use util\Http; use logger\Logger; @@ -289,15 +292,33 @@ class Dispatcher */ private function callActionMethod() { - $actionClassName = ucfirst($this->request->action) . 'Action'; - $actionClassNameWithNamespace = 'cms\\'.($this->request->isUIAction?'ui\\':'').'action\\' . $actionClassName; + $action = $this->request->action; + $method = $this->request->method; + + while( true ) { + $actionClassName = new ClassName( ucfirst($action) . ucfirst($method) . 'Action'); + $actionClassName->addNamespace( 'cms\\' . ($this->request->isUIAction ? 'ui\\' : '') . 'action\\' . $action ); + + if ( $actionClassName->exists() ) + break; + + $baseActionClassName = new ClassName( ucfirst($action) . 'Action' ); + $baseActionClassName->addNamespace( 'cms\\' . ($this->request->isUIAction ? 'ui\\' : '') . 'action' ); + + if ( ! $baseActionClassName->exists() ) + throw new LogicException('Action \''.$action.'\' is not available, class not found: '.$baseActionClassName->get() ); + + if ( ! $baseActionClassName->getParent()->exists() ) + throw new BadMethodCallException($baseActionClassName->get().' does not exist.'); + + $action = strtolower( $baseActionClassName->dropNamespace()->dropSuffix('Action')->get() ); + } - if ( !class_exists($actionClassNameWithNamespace) ) - throw new LogicException('Action \''.$this->request->action.'\' is not available, class not found: '.$actionClassNameWithNamespace); // Erzeugen der Action-Klasse - /* @type $do \cms\action\Action */ - $do = new $actionClassNameWithNamespace; + $class = $actionClassName->get(); + /* @type $do Action */ + $do = new $class; $do->request = $this->request; $do->init(); @@ -306,22 +327,19 @@ class Dispatcher // POST-Request => ...Post() wird aufgerufen. // GET-Request => ...View() wird aufgerufen. - $methodSuffix = $this->request->isAction ? 'Post' : 'View'; - $subactionMethodName = $this->request->method . $methodSuffix; + $subactionMethodName = $this->request->isAction ? 'post' : 'view';; // Daten werden nur angezeigt, die Sitzung kann also schon geschlossen werden. // Halt! In Index-Action können Benutzer-Logins gesetzt werden. if ( ! $this->request->isAction && $this->request->action != 'index' && $this->request->method != 'oidc' ) Session::close(); - Logger::debug("Dispatcher executing {$this->request->action}/{$this->request->method}/" . $this->request->getRequestId().' -> '.$actionClassName.'#'.$subactionMethodName.'()'); + Logger::debug("Dispatcher executing {$action}/{$method}/" . $this->request->getRequestId().' -> '.$actionClassName->get().'#'.$subactionMethodName.'()'); try { - $method = new \ReflectionMethod($do,$subactionMethodName); - $declaredClassName = $method->getDeclaringClass()->getShortName(); - $declaredActionName = strtolower(substr($declaredClassName,0,strpos($declaredClassName,'Action'))); - $params = []; + $method = new \ReflectionMethod($do,$subactionMethodName); + $params = []; foreach( $method->getParameters() as $parameter ) { $params[ $parameter->getName() ] = $this->request->getRequiredRequestVar($parameter->getName(),RequestParams::FILTER_RAW); } @@ -344,11 +362,9 @@ class Dispatcher // The action is able to change its method name. $this->request = $do->request; - $this->request->action = $declaredActionName; + $this->request->action = $action; - $result = $do->getOutputData(); - - return $result; + return $do->getOutputData(); } /** diff --git a/modules/cms/action/Action.class.php b/modules/cms/action/Action.class.php @@ -4,16 +4,11 @@ namespace cms\action; use cms\base\Configuration; use cms\base\Language as L; -use cms\model\BaseObject; use cms\model\ModelBase; use cms\model\User; +use logger\Logger; use util\ClassUtils; -use util\exception\ValidationException; -use util\Html; use util\Session; -use logger\Logger; -use util\Http; -use util\Text; /** diff --git a/modules/cms/action/AliasAction.class.php b/modules/cms/action/AliasAction.class.php @@ -5,7 +5,6 @@ namespace cms\action; use cms\model\Alias; - /** * <editor-fold defaultstate="collapsed" desc="license"> * diff --git a/modules/cms/action/ConfigurationAction.class.php b/modules/cms/action/ConfigurationAction.class.php @@ -20,6 +20,7 @@ namespace cms\action; use cms\base\DefaultConfig; use util\Session; + /** * Action-Klasse fuer die Bearbeitung eines Template-Elementes. * @@ -103,7 +104,7 @@ class ConfigurationAction extends BaseAction * Reads system configuration. * @return array */ - private function getSystemConfiguration() + protected function getSystemConfiguration() { $conf['server'] = array('time' => date('r'), 'name' => php_uname(), diff --git a/modules/cms/action/ElementAction.class.php b/modules/cms/action/ElementAction.class.php @@ -4,17 +4,16 @@ namespace cms\action; use cms\base\Configuration; +use cms\model\BaseObject; use cms\model\Element; +use cms\model\Folder; use cms\model\Project; use cms\model\Template; -use cms\model\Folder; -use cms\model\BaseObject; use ReflectionClass; use ReflectionProperty; use util\Text; - /** * Action-Klasse fuer die Bearbeitung eines Template-Elementes. * @@ -27,7 +26,7 @@ class ElementAction extends BaseAction /** * @var Element */ - private $element; + protected $element; private $template; diff --git a/modules/cms/action/FileAction.class.php b/modules/cms/action/FileAction.class.php @@ -8,16 +8,12 @@ use cms\generator\FileGenerator; use cms\generator\Producer; use cms\generator\Publisher; use cms\generator\PublishOrder; -use cms\model\Folder; use cms\model\BaseObject; use cms\model\File; - -use cms\generator\PublishPreview; -use cms\generator\PublishPublic; -use util\Http; +use cms\model\Folder; +use util\exception\ValidationException; use util\Html; use util\Upload; -use util\exception\ValidationException; // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -49,7 +45,7 @@ class FileAction extends ObjectAction /** * @var File */ - private $file; + protected $file; /** * Konstruktor diff --git a/modules/cms/action/FolderAction.class.php b/modules/cms/action/FolderAction.class.php @@ -11,27 +11,22 @@ use cms\generator\PageGenerator; use cms\generator\Producer; use cms\generator\Publisher; use cms\generator\PublishOrder; -use language\Messages; -use util\ArchiveTar; use cms\model\Acl; -use cms\model\Image; -use cms\model\Language; -use cms\model\Project; -use cms\model\Template; -use cms\model\Page; -use cms\model\Folder; use cms\model\BaseObject; use cms\model\File; +use cms\model\Folder; +use cms\model\Image; use cms\model\Link; - +use cms\model\Page; +use cms\model\Project; use cms\model\Text; use cms\model\Url; -use cms\generator\PublishPublic; +use language\Messages; +use util\ArchiveTar; use util\exception\ValidationException; +use util\Html; use util\Http; -use Publish; use util\Session; -use util\Html; use util\Upload; /** @@ -47,7 +42,7 @@ class FolderAction extends ObjectAction /** * @var Folder */ - private $folder; + protected $folder; public function __construct() { @@ -740,7 +735,7 @@ class FolderAction extends ObjectAction * * @return Integer maximale Dateigroesse in Bytes */ - private function maxFileSize() + protected function maxFileSize() { // When querying memory size values: // Many ini memory size values, such as upload_max_filesize, diff --git a/modules/cms/action/GroupAction.class.php b/modules/cms/action/GroupAction.class.php @@ -2,15 +2,13 @@ namespace cms\action; -use cms\base\Configuration; use cms\model\Acl; -use cms\model\User; -use cms\model\Project; -use cms\model\Group; use cms\model\BaseObject; +use cms\model\Group; use cms\model\Language; +use cms\model\Project; +use cms\model\User; -use util\Html; // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de // @@ -42,7 +40,7 @@ class GroupAction extends BaseAction /** * @var Group */ - private $group; + protected $group; function __construct() diff --git a/modules/cms/action/GrouplistAction.class.php b/modules/cms/action/GrouplistAction.class.php @@ -3,6 +3,7 @@ namespace cms\action; use cms\model\Group; + // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de // diff --git a/modules/cms/action/ImageAction.class.php b/modules/cms/action/ImageAction.class.php @@ -2,14 +2,8 @@ namespace cms\action; -use cms\model\Folder; use cms\model\Image; -use cms\model\BaseObject; -use cms\model\File; - -use util\Http; use util\Html; -use util\Upload; /** @@ -22,7 +16,7 @@ class ImageAction extends FileAction { public $security = Action::SECURITY_USER; - var $image; + protected $image; /** * Konstruktor @@ -152,7 +146,7 @@ class ImageAction extends FileAction - private function imageFormat() + protected function imageFormat() { if ( ! function_exists( 'imagetypes' ) ) return 0; @@ -190,7 +184,7 @@ class ImageAction extends FileAction - private function imageFormats() + protected function imageFormats() { if ( ! function_exists( 'imagetypes' ) ) return array(); diff --git a/modules/cms/action/LanguageAction.class.php b/modules/cms/action/LanguageAction.class.php @@ -4,9 +4,7 @@ namespace cms\action; use cms\base\Configuration; use cms\model\Language; -use cms\model\Project; -use util\Session; -use util\Html; + // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de // @@ -39,7 +37,7 @@ class LanguageAction extends BaseAction * Zu bearbeitende Sprache, wird im Kontruktor instanziiert * @type Language */ - private $language; + protected $language; /** diff --git a/modules/cms/action/LanguagelistAction.class.php b/modules/cms/action/LanguagelistAction.class.php @@ -4,13 +4,11 @@ namespace cms\action; use cms\base\Configuration; use cms\model\Language; - - use cms\model\Project; use language\Messages; -use util\Session; use util\Html; + // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de // @@ -42,7 +40,7 @@ class LanguagelistAction extends BaseAction /** * @var Project */ - private $project; + protected $project; /** diff --git a/modules/cms/action/LinkAction.class.php b/modules/cms/action/LinkAction.class.php @@ -3,12 +3,9 @@ namespace cms\action; use cms\model\BaseObject; -use cms\model\Folder; use cms\model\Link; - - use util\Html; -use util\Session; + // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -41,7 +38,7 @@ class LinkAction extends ObjectAction /** * @var Link */ - private $link; + protected $link; /** * Konstruktor diff --git a/modules/cms/action/LoginAction.class.php b/modules/cms/action/LoginAction.class.php @@ -5,30 +5,23 @@ namespace cms\action; use cms\auth\Auth; use cms\auth\AuthRunner; +use cms\auth\InternalAuth; use cms\base\Configuration; use cms\base\DB; use cms\base\Startup; use cms\model\User; -use cms\model\Group; - - use configuration\Config; use Exception; -use http\Env\Request; use language\Messages; +use logger\Logger; use openid_connect\OpenIDConnectClient; +use security\Password; +use util\exception\ObjectNotFoundException; use util\exception\SecurityException; -use util\exception\ValidationException; -use util\FileUtils; -use util\Http; -use cms\auth\InternalAuth; -use logger\Logger; -use \util\exception\ObjectNotFoundException; use util\exception\UIException; -use \security\Password; -use util\Session; +use util\exception\ValidationException; use util\Mail; -use util\Text; +use util\Session; use util\text\TextMessage; diff --git a/modules/cms/action/Method.class.php b/modules/cms/action/Method.class.php @@ -0,0 +1,12 @@ +<?php + + +namespace cms\action; + + +interface Method +{ + public function view(); + + public function post(); +}+ \ No newline at end of file diff --git a/modules/cms/action/ModelAction.class.php b/modules/cms/action/ModelAction.class.php @@ -3,11 +3,8 @@ namespace cms\action; use cms\model\Model; - - use language\Messages; -use util\Session; -use util\Html; + // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -40,7 +37,7 @@ class ModelAction extends BaseAction /** * @var Model */ - private $model; + protected $model; function __construct() diff --git a/modules/cms/action/ModellistAction.class.php b/modules/cms/action/ModellistAction.class.php @@ -5,7 +5,6 @@ namespace cms\action; use cms\model\Model; use cms\model\Project; use util\Html; -use util\Session; // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -36,7 +35,7 @@ class ModellistAction extends BaseAction /** * @var Project */ - public $project; + protected $project; public $security = Action::SECURITY_USER; diff --git a/modules/cms/action/ObjectAction.class.php b/modules/cms/action/ObjectAction.class.php @@ -2,20 +2,19 @@ namespace cms\action; -use language\Messages; -use util\ArrayUtils; use cms\model\Acl; -use cms\model\Project; -use cms\model\User; -use cms\model\Group; -use cms\model\Page; -use cms\model\Folder; use cms\model\BaseObject; -use cms\model\Language; use cms\model\File; +use cms\model\Folder; +use cms\model\Group; +use cms\model\Language; use cms\model\Link; +use cms\model\Page; +use cms\model\Project; +use cms\model\User; +use language\Messages; +use util\ArrayUtils; use util\exception\ValidationException; -use util\Html; use util\Http; use util\Session; diff --git a/modules/cms/action/PageAction.class.php b/modules/cms/action/PageAction.class.php @@ -3,23 +3,23 @@ namespace cms\action; use cms\base\Configuration; +use cms\generator\PageContext; use cms\generator\PageGenerator; use cms\generator\Producer; use cms\generator\Publisher; use cms\generator\PublishOrder; use cms\model\Acl; -use cms\model\Project; -use cms\model\Value; +use cms\model\BaseObject; use cms\model\Element; -use cms\model\Template; -use cms\model\Page; use cms\model\Folder; -use cms\model\BaseObject; use cms\model\Language; -use cms\generator\PageContext; +use cms\model\Page; +use cms\model\Project; +use cms\model\Template; +use cms\model\Value; use configuration\Config; -use util\Html; use logger\Logger; +use util\Html; use util\Session; @@ -37,7 +37,7 @@ class PageAction extends ObjectAction /** * @var Page */ - private $page; + protected $page; function __construct() diff --git a/modules/cms/action/PageelementAction.class.php b/modules/cms/action/PageelementAction.class.php @@ -6,29 +6,29 @@ use cms\base\Language as L; use cms\generator\PageContext; use cms\generator\PageGenerator; use cms\generator\Producer; +use cms\generator\PublishEdit; use cms\generator\Publisher; use cms\generator\PublishOrder; +use cms\generator\PublishPreview; use cms\generator\ValueContext; use cms\generator\ValueGenerator; use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\Element; +use cms\model\Folder; +use cms\model\Page; use cms\model\Project; +use cms\model\Template; use cms\model\User; use cms\model\Value; -use cms\model\Element; -use cms\model\Template; -use cms\model\Page; -use cms\model\Folder; -use cms\model\BaseObject; -use cms\generator\PublishEdit; -use cms\generator\PublishPreview; use language\Messages; +use LogicException; use util\exception\SecurityException; +use util\exception\ValidationException; use util\Html; -use LogicException; use util\Session; -use util\Transformer; use util\Text; -use util\exception\ValidationException; +use util\Transformer; // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -1203,7 +1203,7 @@ class PageelementAction extends BaseAction } - private function publishPage() { + protected function publishPage() { $project = $this->page->getProject(); @@ -1238,7 +1238,7 @@ class PageelementAction extends BaseAction * @param Value $value * @return string */ - private function calculateValue(Value $value) + protected function calculateValue(Value $value) { switch( $value->element->typeid ) { case Element::ELEMENT_TYPE_DATE: diff --git a/modules/cms/action/ProfileAction.class.php b/modules/cms/action/ProfileAction.class.php @@ -26,13 +26,11 @@ use cms\model\User; use language\Language; use language\Messages; use logger\Logger; -use LogicException; -use security\Password; +use security\Base2n; use util\exception\ValidationException; use util\Mail; -use util\UIUtils; -use security\Base2n; use util\Session; +use util\UIUtils; /** @@ -46,7 +44,7 @@ class ProfileAction extends BaseAction { public $security = Action::SECURITY_USER; - private $user; + protected $user; var $defaultSubAction = 'edit'; /** @@ -370,7 +368,7 @@ class ProfileAction extends BaseAction * @param User $user * @return string */ - private function getUserStyle( $user ) + protected function getUserStyle($user ) { // Theme für den angemeldeten Benuter ermitteln if ( $user && Configuration::subset('style')->has($user->style)) diff --git a/modules/cms/action/ProjectAction.class.php b/modules/cms/action/ProjectAction.class.php @@ -4,11 +4,9 @@ namespace cms\action; use cms\base\Configuration; use cms\model\Acl; -use cms\model\Project; use cms\model\Folder; +use cms\model\Project; use language\Messages; -use logger\Logger; -use util\FileUtils; // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -41,7 +39,7 @@ class ProjectAction extends BaseAction /** * @var Project */ - private $project; + protected $project; var $defaultSubAction = 'listing'; diff --git a/modules/cms/action/SearchAction.class.php b/modules/cms/action/SearchAction.class.php @@ -4,19 +4,15 @@ namespace cms\action; use cms\base\Configuration as C; use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\File; use cms\model\Project; +use cms\model\Template; use cms\model\User; use cms\model\Value; -use cms\model\Template; -use cms\model\BaseObject; -use cms\model\File; - - - use util\Session; - // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de // @@ -137,7 +133,7 @@ class SearchAction extends BaseAction * @param $searchText string search query text * @param $searchFlag int field selector */ - private function performSearch($searchText, $searchFlag) + protected function performSearch($searchText, $searchFlag) { $listObjectIds = array(); $listTemplateIds = array(); diff --git a/modules/cms/action/TemplateAction.class.php b/modules/cms/action/TemplateAction.class.php @@ -3,20 +3,18 @@ namespace cms\action; namespace cms\action; +use cms\generator\PublishPublic; use cms\model\Acl; use cms\model\Element; +use cms\model\Page; use cms\model\Project; use cms\model\Template; -use cms\model\Page; - - use cms\model\TemplateModel; -use cms\generator\PublishPublic; use language\Messages; use util\exception\ValidationException; -use util\Session; use util\Html; -use util\Text; +use util\Session; + // OpenRat Content Management System // Copyright (C) 2002-2009 Jan Dankert @@ -51,7 +49,7 @@ class TemplateAction extends BaseAction /** * @var Template */ - private $template; + protected $template; private $element; diff --git a/modules/cms/action/TemplatelistAction.class.php b/modules/cms/action/TemplatelistAction.class.php @@ -5,10 +5,7 @@ namespace cms\action; use cms\model\Element; use cms\model\Project; use cms\model\Template; -use cms\model\TemplateModel; use language\Messages; -use util\exception\ValidationException; -use util\Session; // OpenRat Content Management System // Copyright (C) 2002-2009 Jan Dankert @@ -41,7 +38,7 @@ class TemplatelistAction extends BaseAction /** * @var Project */ - private $project; + protected $project; function __construct() diff --git a/modules/cms/action/TextAction.class.php b/modules/cms/action/TextAction.class.php @@ -3,11 +3,8 @@ namespace cms\action; -use cms\model\BaseObject; - use cms\model\Text; use language\Messages; -use util\Html; // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -38,7 +35,7 @@ class TextAction extends FileAction /** * @var Text */ - private $text; + protected $text; /** * Konstruktor diff --git a/modules/cms/action/UrlAction.class.php b/modules/cms/action/UrlAction.class.php @@ -2,14 +2,9 @@ namespace cms\action; -use cms\model\BaseObject; -use cms\model\Folder; use cms\model\Url; - - use language\Messages; -use util\Html; -use util\Session; + // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -42,7 +37,7 @@ class UrlAction extends ObjectAction /** * @var Url */ - private $url; + protected $url; /** * Konstruktor diff --git a/modules/cms/action/UserAction.class.php b/modules/cms/action/UserAction.class.php @@ -5,22 +5,18 @@ namespace cms\action; use cms\base\Configuration; use cms\base\Startup; use cms\model\Acl; -use cms\model\User; -use cms\model\Project; -use cms\model\Group; use cms\model\BaseObject; +use cms\model\Group; use cms\model\Language; - - +use cms\model\Project; +use cms\model\User; use language\Messages; -use util\exception\ObjectNotFoundException; -use util\exception\ValidationException; -use util\Http; use security\Base2n; -use \security\Password; -use util\Session; -use util\Html; +use security\Password; +use util\exception\ValidationException; use util\Mail; +use util\Session; + // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de @@ -53,7 +49,7 @@ class UserAction extends BaseAction /** * @var User */ - private $user; + protected $user; /** diff --git a/modules/cms/action/UsergroupAction.class.php b/modules/cms/action/UsergroupAction.class.php @@ -2,8 +2,6 @@ namespace cms\action; -use cms\model\User; - // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de // @@ -34,19 +32,4 @@ class UsergroupAction extends BaseAction { parent::__construct(); } - - - function showView() - { - } - - - /** - * - */ - function editView() - { - $this->nextSubAction('show'); - } - } \ No newline at end of file diff --git a/modules/cms/action/UserlistAction.class.php b/modules/cms/action/UserlistAction.class.php @@ -2,10 +2,6 @@ namespace cms\action; -use cms\model\User; -use language\Messages; -use util\exception\ValidationException; - // OpenRat Content Management System // Copyright (C) 2002-2012 Jan Dankert, cms@jandankert.de // @@ -39,51 +35,4 @@ class UserlistAction extends BaseAction parent::__construct(); } - - function showView() - { - $list = array(); - - foreach( User::getAllUsers() as $user ) - { - $list[$user->userid] = $user->getProperties(); - $list[$user->userid]['id' ] = $user->userid; - } - $this->setTemplateVar('list',$list); - } - - - /** - * Eigenschaften des Benutzers anzeigen - */ - function editView() - { - $this->nextSubAction('show'); - } - - - public function addView() - { - } - - - /** - * @param $name name of the new user. - */ - public function addPost( $name ) - { - $name = $this->request->cleanText($name,RequestParams::FILTER_ALPHANUM); - - $user = User::loadWithName($name,User::AUTH_TYPE_INTERNAL); - - if ( !empty($user) ) - throw new ValidationException( 'name',Messages::USER_ALREADY_IN_DATABASE); - - $user = new User(); - $user->name = $name; - $user->add(); - $this->addNoticeFor($user, Messages::ADDED); - } - - } \ No newline at end of file diff --git a/modules/cms/action/configuration/ConfigurationEditAction.class.php b/modules/cms/action/configuration/ConfigurationEditAction.class.php @@ -0,0 +1,13 @@ +<?php +namespace cms\action\configuration; +use cms\action\ConfigurationAction; +use cms\action\Method; + +class ConfigurationEditAction extends ConfigurationAction implements Method { + public function view() { + $this->nextSubAction('show'); + + } + public function post() { + } +} diff --git a/modules/cms/action/configuration/ConfigurationShowAction.class.php b/modules/cms/action/configuration/ConfigurationShowAction.class.php @@ -0,0 +1,40 @@ +<?php +namespace cms\action\configuration; +use cms\action\ConfigurationAction; +use cms\action\Method; +use cms\base\DefaultConfig; +use util\Session; + + +class ConfigurationShowAction extends ConfigurationAction implements Method { + public function view() { + $defaultConfig = DefaultConfig::get();; + $currentConfig = Session::getConfig(); + + $currentConfig['system'] = $this->getSystemConfiguration(); + + // Language are to much entries + unset($currentConfig['language']); + + $pad = str_repeat("\xC2\xA0",10); // Hard spaces + + $flatDefaultConfig = \util\ArrayUtils::dryFlattenArray( $defaultConfig , $pad ); + $flatCMSConfig = \util\ArrayUtils::dryFlattenArray( Session::getConfig(), $pad ); + $flatConfig = \util\ArrayUtils::dryFlattenArray( $currentConfig , $pad ); + + $config = array_map( function($key,$value) use ($flatConfig,$flatCMSConfig,$flatDefaultConfig) { + + if ( strpos($key,'password') !== false ) + $value = '*'; + + return ['key'=>$key,'value'=>$value,'class'=>(empty($flatCMSConfig[$key])?'readonly':(isset($flatDefaultConfig[$key]) && $flatDefaultConfig[$key]==$flatConfig[$key]?'default':'changed'))]; + + },array_keys($flatConfig),$flatConfig); + + $this->setTemplateVar('config',$config ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/configuration/ConfigurationSrcAction.class.php b/modules/cms/action/configuration/ConfigurationSrcAction.class.php @@ -0,0 +1,25 @@ +<?php +namespace cms\action\configuration; +use cms\action\ConfigurationAction; +use cms\action\Method; +use util\Session; + + +class ConfigurationSrcAction extends ConfigurationAction implements Method { + public function view() { + $conf = Session::getConfig(); + unset( $conf['language']); + + // Mask passwords. + array_walk_recursive($conf,function(&$item,$key) + { + if($key=='password'){ + $item='*************'; + } + }); + + $this->setTemplateVar('source', \util\YAML::dump($conf,4,0,true)); + } + public function post() { + } +} diff --git a/modules/cms/action/element/ElementAdvancedAction.class.php b/modules/cms/action/element/ElementAdvancedAction.class.php @@ -0,0 +1,473 @@ +<?php +namespace cms\action\element; +use cms\action\Action; +use cms\action\ElementAction; +use cms\action\Method; +use cms\action\RequestParams; +use cms\base\Configuration; +use cms\model\BaseObject; +use cms\model\Element; +use cms\model\Folder; +use cms\model\Project; +use cms\model\Template; +use ReflectionClass; +use ReflectionProperty; +use util\Text; + + +class ElementAdvancedAction extends ElementAction implements Method { + public function view() { + $this->setTemplateVar('type',$this->element->getTypeName() ); + + // Abhaengig vom aktuellen Element-Typ die Eigenschaften anzeigen + $properties = $this->element->getRelatedProperties(); + + foreach( $this->element->getRelatedProperties() as $propertyName ) + { + switch( $propertyName ) + { + case 'withIcon': + $this->setTemplateVar('with_icon' ,$this->element->withIcon ); + break; + + case 'allLanguages': + $this->setTemplateVar('all_languages',$this->element->allLanguages); + break; + + case 'writable': + $this->setTemplateVar('writable' ,$this->element->writable ); + break; + + case 'inherit': + $this->setTemplateVar('inherit' ,$this->element->inherit ); + break; + + case 'html': + $this->setTemplateVar('html' ,$this->element->html ); + break; + + case 'subtype': + + $convertToLang = false; + switch( $this->element->typeid ) + { + case Element::ELEMENT_TYPE_INFO: + $subtypes = Array('db_id', + 'db_name', + 'project_id', + 'project_name', + 'language_id', + 'language_iso', + 'language_name', + 'page_id', + 'page_name', + 'page_desc', + 'page_fullfilename', + 'page_filename', + 'page_extension', + 'edit_url', + 'edit_fullurl', + 'lastch_user_username', + 'lastch_user_fullname', + 'lastch_user_mail', + 'lastch_user_desc', + 'lastch_user_tel', + 'create_user_username', + 'create_user_fullname', + 'create_user_mail', + 'create_user_desc', + 'create_user_tel', + 'act_user_username', + 'act_user_fullname', + 'act_user_mail', + 'act_user_desc', + 'act_user_tel' ); + $convertToLang = true; + break; + + case Element::ELEMENT_TYPE_INFODATE: + case Element::ELEMENT_TYPE_LINKDATE: + $subtypes = Array('date_published', + 'date_saved', + 'date_created' ); + $convertToLang = true; + break; + + case Element::ELEMENT_TYPE_LINK: + $subtypes = Array( + 'file', + 'image', + 'image_data_uri', + 'page', + 'folder', + 'link' ); + $convertToLang = true; + break; + + case Element::ELEMENT_TYPE_LINKINFO: + $subtypes = Array('width', + 'height', + 'id', + 'name', + 'description', + 'mime_type', + 'lastch_user_username', + 'lastch_user_fullname', + 'lastch_user_mail', + 'lastch_user_desc', + 'lastch_user_tel', + 'create_user_username', + 'create_user_fullname', + 'create_user_mail', + 'create_user_desc', + 'create_user_tel', + 'filename', + 'full_filename' ); + $convertToLang = true; + break; + + case Element::ELEMENT_TYPE_INSERT: + $subtypes = Array('inline', + 'ssi' ); + $convertToLang = true; + break; + + case Element::ELEMENT_TYPE_DYNAMIC: + + $files = Array(); + $macroFiles = \util\FileUtils::readDir(__DIR__ . '/../../../cms/macros/macro'); + foreach( $macroFiles as $macroFile ) + { + $file = substr($macroFile,0,strlen($macroFile)-10); + if ( $file != '' ) + $files[$file] = $file; + } + + $subtypes = $files; + break; + + default: + $subtypes = array(); + break; + } + + if ( $convertToLang ) + { + foreach( $subtypes as $t=>$v ) + { + unset($subtypes[$t]); + $subtypes[$v] = \cms\base\Language::lang('EL_'.$this->element->getTypeName().'_'.$v); + } + } + + // Variable $subtype muss existieren, um Anzeige des Feldes zu erzwingen. + if (!isset($this->element->subtype)) + $this->element->subtype=''; + + $this->setTemplateVar('subtypes',$subtypes ); + $this->setTemplateVar('subtype' ,$this->element->subtype); + + break; + + + case 'dateformat': + + $ini_date_format = Configuration::subset('date')->get('format',[]); + $dateformat = array(); + + $this->setTemplateVar('dateformat',''); + + foreach($ini_date_format as $idx=>$d) + { + if ( strpos($d,'%')!==FALSE ) + $dateformat[$idx] = strftime($d); + else + $dateformat[$idx] = date($d); + if ( $d == $this->element->dateformat ) + $this->setTemplateVar('dateformat',$idx); + } + + $this->setTemplateVar('dateformats',$dateformat); + + break; + + + // Eigenschaften Text und Text-Absatz + case 'defaultText': + + switch( $this->element->typeid ) + { + case Element::ELEMENT_TYPE_LONGTEXT: + $this->setTemplateVar('default_longtext',$this->element->defaultText ); + break; + + case Element::ELEMENT_TYPE_SELECT: + case Element::ELEMENT_TYPE_TEXT: + $this->setTemplateVar('default_text' ,$this->element->defaultText ); + break; + } + break; + + + case 'format': + $this->setTemplateVar('format', $this->element->format ); + + $formats = Element::getAvailableFormats(); + + // Für einfache Textelemente gibt es keinen HTML-Editor + if ( $this->element->typeid != Element::ELEMENT_TYPE_LONGTEXT ) + unset( $formats[ Element::ELEMENT_FORMAT_HTML ] ); + + //foreach( $formats as $t=>$v ) + // $formats[$t] = array('lang'=>'EL_PROP_FORMAT_'.$v); + + $this->setTemplateVar('formatlist', $formats); + break; + + case 'linktype': + $this->setTemplateVar('linktype', $this->element->wiki ); + $this->setTemplateVar('linktypelist', array('page','file','link') ); + break; + + case 'prefix': + $t = new Template( $this->element->templateid ); + + $elements = array(); + foreach( $t->getElements() as $element ) + { + if ( $element->type == 'link' ) + $elements[$element->name] = $element->name; + } + unset($t); + + $this->setTemplateVar('linkelements',$elements ); + + list($linkElementName,$targetElementName) = explode('%',$this->element->name.'%'); + $this->setTemplateVar('linkelement',$linkElementName ); + + break; + + case 'name': + + $names = array(); + + $template = new Template( $this->element->templateid ); + $template->load(); + $project = new Project( $template->projectid ); + + foreach( $project->getTemplates() as $tid=>$name ) + { + $t = new Template( $tid ); + $t->load(); + + foreach( $t->getElements() as $element ) + { + if ( !in_array($element->type,array('copy','linkinfo','link')) ) + $names[$element->name] = $t->name.' - '.$element->name.' ('.\cms\base\Language::lang('EL_'.$element->type).')'; + } + unset($t); + } + + + $this->setTemplateVar('names',$names ); + + list($linkElementName,$targetElementName) = explode('%',$this->element->name.'%'); + $this->setTemplateVar('name',$targetElementName ); + break; + + // Eigenschaften PHP-Code + case 'code': + + switch( $this->element->typeid ) + { + + case Element::ELEMENT_TYPE_SELECT: + $this->setTemplateVar('select_items',$this->element->code ); + break; + + case Element::ELEMENT_TYPE_DYNAMIC: + + $className = '\\cms\\macros\\macro\\'.ucfirst($this->element->subtype); + + $description = ''; + $paramList = array(); + $parameters = array(); + + if ( class_exists($className) ) + { + $dynEl = new $className; + + $description = $dynEl->description; + + $old = $this->element->getDynamicParameters(); + + $reflect = new ReflectionClass($dynEl); + $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED); + foreach( get_object_vars($dynEl) as $paramName=>$paramValue ) + { + $paramList[$paramName] = print_r( $paramValue, true); + + if ( @$old[$paramName] ) + $parameters[$paramName] = $old[$paramName]; + else + $parameters[$paramName] = $paramValue; + } + + } + + $this->setTemplateVar('dynamic_class_description',$description ); + $this->setTemplateVar('dynamic_class_parameters' ,$paramList ); + $this->setTemplateVar('parameters' , \util\YAML::dump($parameters) ); + + + break; + + case Element::ELEMENT_TYPE_CODE: + if ( Configuration::subset('security')->is('disable_dynamic_code',true ) ) + $this->addNotice('element', 0, $this->element->name, 'CODE_DISABLED', Action::NOTICE_WARN); + + $this->setTemplateVar('code',$this->element->code); + break; + } + break; + + + case 'decimals': + $this->setTemplateVar('decimals' ,$this->element->decimals ); + break; + + case 'decPoint': + $this->setTemplateVar('dec_point' ,$this->element->decPoint ); + break; + + case 'thousandSep': + $this->setTemplateVar('thousand_sep' ,$this->element->thousandSep ); + break; + + + // Eigenschaften Link + case 'defaultObjectId': + + $objects = array(); + + $template = new Template( $this->element->templateid ); + $template->load(); + $project = new Project( $template->projectid ); + + // Ermitteln aller verfuegbaren Objekt-IDs + foreach( $project->getAllObjectIds() as $id ) + { + $o = new BaseObject( $id ); + $o->load(); + + switch( $this->element->typeid ) + { + case Element::ELEMENT_TYPE_LINK: + if ( ! in_array( $o->typeid, array(BaseObject::TYPEID_PAGE,BaseObject::TYPEID_IMAGE,BaseObject::TYPEID_FILE,BaseObject::TYPEID_LINK,BaseObject::TYPEID_URL,BaseObject::TYPEID_TEXT ) ) ) + continue 2; + break; + //Change tobias + case Element::ELEMENT_TYPE_INSERT: + if ( ! in_array( $o->typeid, array(BaseObject::TYPEID_FOLDER,BaseObject::TYPEID_PAGE,BaseObject::TYPEID_IMAGE,BaseObject::TYPEID_FILE,BaseObject::TYPEID_LINK,BaseObject::TYPEID_URL,BaseObject::TYPEID_TEXT ) ) ) + continue 2; + break; + //Change tobias end + default: + continue 2; + } + + $objects[ $id ] = \cms\base\Language::lang( $o->getType() ).': '; + + if ( !$o->isRoot ) + { + $f = new Folder( $o->parentid ); + $f->load(); + $names = $f->parentObjectNames(false,true); + foreach( $names as $fid=>$name ) + $names[$fid] = Text::maxLength($name,15,'..',STR_PAD_BOTH); + $objects[ $id ] .= implode( \util\Text::FILE_SEP,$names ); + } + + $objects[ $id ] .= \util\Text::FILE_SEP.$o->getName(); + } + + asort( $objects ); // Sortieren + + $this->setTemplateVar('objects',$objects); + + $this->setTemplateVar('default_objectid',$this->element->defaultObjectId); + + break; + + + case 'folderObjectId': + + + // Ermitteln aller verf?gbaren Objekt-IDs + $template = new Template( $this->element->templateid ); + $template->load(); + $project = new Project( $template->projectid ); + + $folders = $project->getAllFlatFolders(); + $this->setTemplateVar('folders',$folders); + + $this->setTemplateVar('folderobjectid' ,$this->element->folderObjectId ); + + break; + + default: + throw new \LogicException('Unknown element property: '.$propertyName ); + } + } + } + + + public function post() { + $ini_date_format = Configuration::subset('date')->get('format',[] ); + + if ( $this->hasRequestVar('format')) + $this->element->format = $this->getRequestId('format'); + + + if ( $this->hasRequestVar('dateformat')) + $this->element->dateformat = @$ini_date_format[$this->getRequestVar('dateformat')]; + + + if ( $this->hasRequestVar('default_longtext')) + $this->element->defaultText = $this->getRequestVar('default_longtext',RequestParams::FILTER_TEXT); + else + $this->element->defaultText = $this->getRequestVar('default_text',RequestParams::FILTER_TEXT); + + $this->element->subtype = $this->getRequestVar('subtype'); + + $this->element->html = $this->hasRequestVar('html'); + $this->element->withIcon = $this->hasRequestVar('with_icon'); + $this->element->allLanguages = $this->hasRequestVar('all_languages'); + $this->element->writable = $this->hasRequestVar('writable'); + $this->element->inherit = $this->hasRequestVar('inherit'); + + $this->element->decimals = $this->getRequestVar('decimals'); + $this->element->decPoint = $this->getRequestVar('dec_point'); + $this->element->thousandSep = $this->getRequestVar('thousand_sep'); + $this->element->folderObjectId = $this->getRequestVar('folderobjectid' ); + $this->element->defaultObjectId = $this->getRequestVar('default_objectid'); + + if ( $this->hasRequestVar('select_items')) + $this->element->code = $this->getRequestVar('select_items'); + else + $this->element->code = $this->getRequestVar('code' ,RequestParams::FILTER_RAW); + + if ( $this->hasRequestVar('name') ) + $this->element->name = $this->getRequestVar('name'); + + if ( $this->hasRequestVar('linkelement') ) + $this->element->setPrefix( $this->getRequestVar('linkelement') ); + + if ( $this->hasRequestVar('parameters')) + $this->element->code = $this->getRequestVar('parameters',RequestParams::FILTER_RAW); + + $this->element->save(); + $this->addNotice('element', 0, $this->element->name, 'SAVED'); + + } +} diff --git a/modules/cms/action/element/ElementInfoAction.class.php b/modules/cms/action/element/ElementInfoAction.class.php @@ -0,0 +1,17 @@ +<?php +namespace cms\action\element; +use cms\action\ElementAction; +use cms\action\Method; + + +class ElementInfoAction extends ElementAction implements Method { + public function view() { + $this->setTemplateVar('id' ,$this->element->elementid ); + $this->setTemplateVar('name',$this->element->name ); + $this->setTemplateVar('type',$this->element->getTypeName() ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/element/ElementPropAction.class.php b/modules/cms/action/element/ElementPropAction.class.php @@ -0,0 +1,51 @@ +<?php +namespace cms\action\element; +use cms\action\Action; +use cms\action\ElementAction; +use cms\action\Method; +use cms\action\RequestParams; +use cms\model\Element; + + +class ElementPropAction extends ElementAction implements Method { + public function view() { + // Name und Beschreibung + $this->setTemplateVar('name' ,$this->element->name); + $this->setTemplateVar('label' ,$this->element->label); + + $this->setTemplateVar('description',$this->element->desc); + + // Die verschiedenen Element-Typen + $types = array(); + + foreach( Element::getAvailableTypes() as $typeId=>$typeKey ) + $types[ $typeId ] = 'EL_'.$typeKey; + + // Code-Element nur fuer Administratoren (da voller Systemzugriff!) + if ( !$this->userIsAdmin() ) + unset( $types['code'] ); + + // Liste aller Elementtypen + $this->setTemplateVar('types',$types); + + // Aktueller Typ + $this->setTemplateVar('typeid',$this->element->typeid); + } + + + public function post() { + if ( !$this->userIsAdmin() && $this->getRequestVar('type') == 'code' ) + // Code-Elemente fuer Nicht-Administratoren nicht benutzbar + throw new \util\exception\ValidationException('type'); + + $this->element->typeid = $this->getRequestId('typeid'); + + $this->element->name = $this->getRequestVar('name' ,RequestParams::FILTER_ALPHANUM); + $this->element->label= $this->getRequestVar('label' ,RequestParams::FILTER_TEXT); + $this->element->desc = $this->getRequestVar('description',RequestParams::FILTER_TEXT); + + $this->element->save(); + + $this->addNotice('element', 0, $this->element->name, 'SAVED', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/element/ElementRemoveAction.class.php b/modules/cms/action/element/ElementRemoveAction.class.php @@ -0,0 +1,32 @@ +<?php +namespace cms\action\element; +use cms\action\Action; +use cms\action\ElementAction; +use cms\action\Method; + + +class ElementRemoveAction extends ElementAction implements Method { + public function view() { + $this->setTemplateVar( 'name' ,$this->element->name ); + } + + public function post() { + if ( !$this->hasRequestVar('confirm') ) + throw new \util\exception\ValidationException('confirm'); + + $type = $this->getRequestVar('type','abc'); + + if ( $type == 'value' ) + { + // Nur Inhalte löschen + $this->element->deleteValues(); + $this->addNotice('element', 0, $this->element->name, 'DELETED', Action::NOTICE_OK); + } + elseif ( $type == 'all' ) + { + // Element löschen + $this->element->delete(); + $this->addNotice('element', 0, $this->element->name, 'DELETED', Action::NOTICE_OK); + } + } +} diff --git a/modules/cms/action/file/FileAdvancedAction.class.php b/modules/cms/action/file/FileAdvancedAction.class.php @@ -0,0 +1,40 @@ +<?php +namespace cms\action\file; +use cms\action\FileAction; +use cms\action\Method; +use cms\action\RequestParams; +use cms\model\BaseObject; +use util\exception\ValidationException; + + +class FileAdvancedAction extends FileAction implements Method { + + + public function view() { + // Eigenschaften der Datei uebertragen + $this->setTemplateVar( 'extension',$this->file->extension ); + $this->setTemplateVar( 'type' ,$this->file->type ); + $this->setTemplateVar( 'types' ,[ + BaseObject::TYPEID_FILE => \cms\base\Language::lang('file' ), + BaseObject::TYPEID_IMAGE => \cms\base\Language::lang('image'), + BaseObject::TYPEID_TEXT => \cms\base\Language::lang('text' ) + ] ); + } + + + public function post() { + + $this->file->extension = $this->getRequestVar('extension' ,RequestParams::FILTER_FILENAME); + + $typeid = $this->getRequestVar('type',RequestParams::FILTER_NUMBER ); + + if ( ! in_array($typeid,[BaseObject::TYPEID_FILE,BaseObject::TYPEID_IMAGE,BaseObject::TYPEID_TEXT])) + throw new ValidationException('type'); + + $this->file->typeid = $typeid; + $this->file->updateType(); + $this->file->save(); + + $this->addNotice($this->file->getType(), 0, $this->file->filename, 'PROP_SAVED', 'ok'); + } +} diff --git a/modules/cms/action/file/FileCompressAction.class.php b/modules/cms/action/file/FileCompressAction.class.php @@ -0,0 +1,71 @@ +<?php +namespace cms\action\file; +use cms\action\Action; +use cms\action\FileAction; +use cms\action\Method; +use cms\action\RequestParams; +use cms\model\File; + + +class FileCompressAction extends FileAction implements Method { + public function view() { + $formats = array(); + foreach( $this->getCompressionTypes() as $t ) + $formats[$t] = \cms\base\Language::lang('compression_'.$t); + + $this->setTemplateVar('formats' ,$formats ); + } + public function post() { + $format = $this->getRequestVar('format',RequestParams::FILTER_ALPHANUM); + + switch( $format ) + { + case 'gz': + if ( $this->getRequestVar('replace',RequestParams::FILTER_NUMBER)=='1' ) + { + $this->file->value = gzencode( $this->file->loadValue(),1 ); + $this->file->parse_filename( $this->file->filename.'.'.$this->file->extension.'.gz',FORCE_GZIP ); + $this->file->save(); + $this->file->saveValue(); + + } + else + { + $newFile = new File(); + $newFile->name = $this->file->name; + $newFile->parentid = $this->file->parentid; + $newFile->value = gzencode( $this->file->loadValue(),1 ); + $newFile->parse_filename( $this->file->filename.'.'.$this->file->extension.'.gz',FORCE_GZIP ); + $newFile->add(); + } + + break; + + case 'bzip2': + if ( $this->getRequestVar('replace')=='1' ) + { + $this->file->value = bzcompress( $this->file->loadValue() ); + $this->file->parse_filename( $this->file->filename.'.'.$this->file->extension.'.bz2' ); + $this->file->save(); + $this->file->saveValue(); + + } + else + { + $newFile = new File(); + $newFile->name = $this->file->name; + $newFile->parentid = $this->file->parentid; + $newFile->value = bzcompress( $this->file->loadValue() ); + $newFile->parse_filename( $this->file->filename.'.'.$this->file->extension.'.bz2' ); + $newFile->add(); + } + + break; + default: + throw new \util\exception\UIException('unknown compress type: ' . $format ); + } + + $this->addNotice('file', 0, $this->file->name, 'DONE', Action::NOTICE_OK); + $this->callSubAction('edit'); + } +} diff --git a/modules/cms/action/file/FileEditAction.class.php b/modules/cms/action/file/FileEditAction.class.php @@ -0,0 +1,58 @@ +<?php +namespace cms\action\file; +use cms\action\FileAction; +use cms\action\Method; +use util\exception\ValidationException; +use util\Upload; + + +class FileEditAction extends FileAction implements Method { + public function view() { + // MIME-Types aus Datei lesen + $this->setTemplateVars( $this->file->getProperties() ); + } + public function post() { + $upload = new Upload(); + + if ( $upload->isAvailable() ) + { + // File received as attachement. + try + { + $upload->processUpload(); + } + catch( \Exception $e ) + { + throw $e; + } + + $this->file->filename = $upload->filename; + $this->file->extension = $upload->extension; + $this->file->size = $upload->size; + $this->file->save(); + + $this->file->value = $upload->value; + $this->file->saveValue(); + } + elseif( $this->hasRequestVar('value') ) + { + // File value received + $this->file->value = $this->getRequestVar('value'); + + if ( strtolower($this->getRequestVar('encoding')) == 'base64') + // file value is base64-encoded + $this->file->value = base64_decode($this->file->value); + + $this->file->saveValue(); + } + else + { + // No file received. + throw new ValidationException('value'); + } + + $this->file->setTimestamp(); + + $this->addNotice($this->file->getType(), 0, $this->file->filename, 'VALUE_SAVED', 'ok'); + } +} diff --git a/modules/cms/action/file/FileExtractAction.class.php b/modules/cms/action/file/FileExtractAction.class.php @@ -0,0 +1,87 @@ +<?php +namespace cms\action\file; +use cms\action\FileAction; +use cms\action\Method; +use cms\model\File; +use cms\model\Folder; +use util\ArchiveTar; +use util\ArchiveUnzip; + + +class FileExtractAction extends FileAction implements Method { + public function view() { + $this->setTemplateVars( $this->file->getProperties() ); + } + + + public function post() { + switch( $this->file->extension ) + { + case 'tar': + $folder = new Folder(); + $folder->parentid = $this->file->parentid; + $folder->name = $this->file->name; + $folder->filename = $this->file->filename; + $folder->add(); + + $tar = new ArchiveTar(); + $tar->openTAR( $this->file->loadValue() ); + + foreach( $tar->files as $file ) + { + $newFile = new File(); + $newFile->name = $file['name']; + $newFile->parentid = $folder->objectid; + $newFile->value = $file['file']; + $newFile->parse_filename( $file['name'] ); + $newFile->lastchangeDate = $file['time']; + $newFile->add(); + + $this->addNotice('file', 0, $newFile->name, 'ADDED'); + } + + unset($tar); + + break; + + case 'zip': + + $folder = new Folder(); + $folder->parentid = $this->file->parentid; + $folder->name = $this->file->name; + $folder->filename = $this->file->filename; + $folder->description = $this->file->fullFilename; + $folder->add(); + + $zip = new ArchiveUnzip(); + $zip->open( $this->file->loadValue() ); + + $lista = $zip->getList(); + + if(sizeof($lista)) foreach($lista as $fileName=>$trash){ + + + $newFile = new File(); + $newFile->name = basename($fileName); + $newFile->description = 'Extracted: '.$this->file->fullFilename.' -> '.$fileName; + $newFile->parentid = $folder->objectid; + $newFile->parse_filename( basename($fileName) ); + + $newFile->value = $zip->unzip($fileName); + $newFile->add(); + + $this->addNotice('file', 0, $newFile->name, 'ADDED'); + unset($newFile); + } + + $zip->close(); + unset($zip); + + break; + + default: + throw new \util\exception\UIException('cannot extract file with extension: ' . $this->file->extension ); + } + $this->callSubAction('edit'); + } +} diff --git a/modules/cms/action/file/FilePreviewAction.class.php b/modules/cms/action/file/FilePreviewAction.class.php @@ -0,0 +1,17 @@ +<?php +namespace cms\action\file; +use cms\action\FileAction; +use cms\action\Method; +use util\Html; + + +class FilePreviewAction extends FileAction implements Method { + + public function view() { + $url = Html::url($this->file->getType(),'show',$this->file->objectid ); + $this->setTemplateVar('preview_url',$url ); + } + + public function post() { + } +} diff --git a/modules/cms/action/file/FilePubAction.class.php b/modules/cms/action/file/FilePubAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\file; +use cms\action\FileAction; +use cms\action\Method; +use cms\generator\FileContext; +use cms\generator\FileGenerator; +use cms\generator\Producer; +use cms\generator\Publisher; +use cms\generator\PublishOrder; + +class FilePubAction extends FileAction implements Method { + public function view() { + } + public function post() { + $fileGenerator = new FileGenerator( new FileContext( $this->file->objectid, Producer::SCHEME_PUBLIC)); + + $publisher = new Publisher( $this->file->projectid ); + $publisher->addOrderForPublishing( new PublishOrder( $fileGenerator->getCache()->load()->getFilename(),$fileGenerator->getPublicFilename(),$this->file->lastchangeDate) ); + $publisher->publish(); + + $this->addNoticeFor($this->file,'PUBLISHED',[],'Published items:'."\n".implode("\n",$publisher->getDestinationFilenames()) ); + } +} diff --git a/modules/cms/action/file/FileRemoveAction.class.php b/modules/cms/action/file/FileRemoveAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\file; +use cms\action\Action; +use cms\action\FileAction; +use cms\action\Method; + + +class FileRemoveAction extends FileAction implements Method { + public function view() { + $this->setTemplateVar( 'name',$this->file->filename ); + } + public function post() { + if ( $this->getRequestVar('delete') != '' ) + { + $this->file->delete(); + $this->addNotice('template', 0, $this->file->filename, 'DELETED', Action::NOTICE_OK); + } + else + { + $this->addNotice('template', 0, $this->file->filename, 'CANCELED', Action::NOTICE_WARN); + } + } +} diff --git a/modules/cms/action/file/FileShowAction.class.php b/modules/cms/action/file/FileShowAction.class.php @@ -0,0 +1,95 @@ +<?php +namespace cms\action\file; +use cms\action\FileAction; +use cms\action\Method; +use cms\base\Configuration; +use cms\generator\FileContext; +use cms\generator\FileGenerator; +use cms\generator\Producer; +use cms\model\File; + + +class FileShowAction extends FileAction implements Method { + + public function view() { + $fileContext = new FileContext($this->file->objectid, Producer::SCHEME_PREVIEW ); + + $generator = new FileGenerator( $fileContext); + + $this->lastModified( $this->file->lastchangeDate ); + + if ( $this->file->extension == 'gz' ) + { + $pos = strrpos($this->file->filename,'.'); + if ( $pos === false ) + $ext = ''; + else + $ext = substr($this->file->filename,$pos+1); + + $ext = strtolower($ext); + + $mime_type = File::$MIME_TYPES[$ext]; + + header('Content-Type: '.$mime_type ); + header('Content-Encoding: gzip' ); + } + else + { + // Angabe Content-Type + header('Content-Type: '.$this->file->mimeType() ); + } + + header('X-File-Id: ' .$this->file->fileid ); + header('X-Id: ' .$this->file->id ); + + // Angabe Content-Disposition + // - Bild soll "inline" gezeigt werden + // - Dateiname wird benutzt, wenn der Browser das Bild speichern moechte + header('Content-Disposition: inline; filename='.$this->file->filename() ); + header('Content-Transfer-Encoding: binary' ); + header('Content-Description: '.$this->file->filename() ); + + //$this->file->write(); // Bild aus Datenbank laden + + // Groesse des Bildes in Bytes + // Der Browser hat so die Moeglichkeit, einen Fortschrittsbalken zu zeigen + header('Content-Length: '.$this->file->size ); + + + if ( $this->request->getRequestVar('encoding') == 'base64') + { + $encodingFunction = function($value) { + return base64_encode($value); + }; + $this->setTemplateVar('encoding', 'base64'); + } + else { + $encodingFunction = function($value) { + return $value; + }; + $this->setTemplateVar('encoding', 'none'); + } + + + // Unterscheidung, ob PHP-Code in der Datei ausgefuehrt werden soll. + $publishConfig = Configuration::subset('publish'); + $phpActive = ( $publishConfig->get('enable_php_in_file_content')=='auto' && $this->file->getRealExtension()=='php') || + $publishConfig->get('enable_php_in_file_content' )===true; + + if ( $phpActive ) { + + // PHP-Code ausfuehren + ob_start(); + require( $generator->getCache()->load()->getFilename() ); + $this->setTemplateVar('value',$encodingFunction(ob_get_contents()) ); + ob_end_clean(); + } + else + $this->setTemplateVar('value',$encodingFunction( $generator->getCache()->get() ) ); + // Maybe we want some gzip-encoding? + } + + + public function post() { + } +} diff --git a/modules/cms/action/file/FileUncompressAction.class.php b/modules/cms/action/file/FileUncompressAction.class.php @@ -0,0 +1,73 @@ +<?php +namespace cms\action\file; +use cms\action\Action; +use cms\action\FileAction; +use cms\action\Method; +use cms\model\File; + + +class FileUncompressAction extends FileAction implements Method { + public function view() { + } + + + public function post() { + switch( $this->file->extension ) + { + case 'gz': + if ( $this->getRequestVar('replace') ) + { + if ( strcmp(substr($this->file->loadValue(),0,2),"\x1f\x8b")) + { + throw new \LogicException("Not GZIP format (See RFC 1952)"); + } + $method = ord(substr($this->file->loadValue(),2,1)); + if ( $method != 8 ) + { + throw new \LogicException("Unknown GZIP method: $method"); + } + $this->file->value = gzinflate( substr($this->file->loadValue(),10)); + $this->file->parse_filename( $this->file->filename ); + $this->file->save(); + $this->file->saveValue(); + } + else + { + $newFile = new File(); + $newFile->name = $this->file->name; + $newFile->parentid = $this->file->parentid; + $newFile->value = gzinflate( substr($this->file->loadValue(),10)); + $newFile->parse_filename( $this->file->filename ); + $newFile->add(); + } + + break; + + case 'bz2': + if ( $this->getRequestVar('replace') ) + { + $this->file->value = bzdecompress($this->file->loadValue()); + $this->file->parse_filename( $this->file->filename ); + $this->file->save(); + $this->file->saveValue(); + } + else + { + $newFile = new File(); + $newFile->name = $this->file->name; + $newFile->parentid = $this->file->parentid; + $newFile->value = bzdecompress( $this->file->loadValue() ); + $newFile->parse_filename( $this->file->filename ); + $newFile->add(); + } + + break; + + default: + throw new \util\exception\UIException('','cannot uncompress file with extension: ' . $this->file->extension ); + } + + $this->addNotice('file', 0, $this->file->name, 'DONE', Action::NOTICE_OK); + $this->callSubAction('edit'); + } +} diff --git a/modules/cms/action/file/FileValueAction.class.php b/modules/cms/action/file/FileValueAction.class.php @@ -0,0 +1,17 @@ +<?php +namespace cms\action\file; +use cms\action\FileAction; +use cms\action\Method; + + +class FileValueAction extends FileAction implements Method { + public function view() { + // MIME-Types aus Datei lesen + //$this->setTemplateVars( $this->file->getProperties() ); + //$this->setTemplateVar('value',$this->file->loadValue()); + } + + + public function post() { + } +} diff --git a/modules/cms/action/folder/FolderAddAction.class.php b/modules/cms/action/folder/FolderAddAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; + + +class FolderAddAction extends FolderAction implements Method { + + public function view() { + $this->nextSubAction('create'); + } + + public function post() { + $this->nextSubAction('create'); + } +} diff --git a/modules/cms/action/folder/FolderAdvancedAction.class.php b/modules/cms/action/folder/FolderAdvancedAction.class.php @@ -0,0 +1,375 @@ +<?php +namespace cms\action\folder; +use cms\action\Action; +use cms\action\FolderAction; +use cms\action\Method; +use cms\base\Startup; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\File; +use cms\model\Folder; +use cms\model\Link; +use cms\model\Page; +use cms\model\Project; +use cms\model\Url; +use util\ArchiveTar; +use util\Html; + + +class FolderAdvancedAction extends FolderAction implements Method { + + public function view() { + $this->setTemplateVar('writable',$this->folder->hasRight(Acl::ACL_WRITE) ); + + $list = array(); + + // Schleife ueber alle Objekte in diesem Ordner + foreach( $this->folder->getObjects() as $o ) + { + /* @var $o BaseObject */ + $id = $o->objectid; + + if ( $o->hasRight(Acl::ACL_READ) ) + { + $list[$id]['objectid'] = $id; + $list[$id]['id' ] = 'obj'.$id; + $list[$id]['name' ] = $o->name; + $list[$id]['filename'] = $o->filename; + $list[$id]['desc' ] = $o->desc; + if ( $list[$id]['desc'] == '' ) + $list[$id]['desc'] = \cms\base\Language::lang('NO_DESCRIPTION_AVAILABLE'); + $list[$id]['desc'] = 'ID '.$id.' - '.$list[$id]['desc']; + + $list[$id]['type'] = $o->getType(); + + $list[$id]['icon'] = $o->getType(); + + $list[$id]['url' ] = Html::url($o->getType(),'',$id); + $list[$id]['date'] = date( \cms\base\Language::lang('DATE_FORMAT'),$o->lastchangeDate ); + $list[$id]['user'] = $o->lastchangeUser; + + if ( $this->hasRequestVar("markall") || $this->hasRequestVar('obj'.$id) ) + $this->setTemplateVar('obj'.$id,'1'); + } + } + + if ( $this->folder->hasRight(Acl::ACL_WRITE) ) + { + // Alle anderen Ordner ermitteln + $otherfolder = array(); + $project = new Project( $this->folder->projectid ); + foreach( $project->getAllFolders() as $id ) + { + $f = new Folder( $id ); + if ( $f->hasRight( Acl::ACL_WRITE ) ) + $otherfolder[$id] = Startup::FILE_SEP.implode( Startup::FILE_SEP,$f->parentObjectNames(false,true) ); + } + asort( $otherfolder ); + + $this->setTemplateVar('folder',$otherfolder); + + // URLs zum Umsortieren der Eintraege + $this->setTemplateVar('order_url' ,Html::url('folder','order',$this->folder->id) ); + } + + $actionList = array(); + $actionList[] = 'copy'; + $actionList[] = 'link'; + $actionList[] = 'archive'; + + if ( $this->folder->hasRight(Acl::ACL_WRITE) ) + { + $actionList[] = 'move'; + $actionList[] = 'delete'; + } + + $this->setTemplateVar('actionlist',$actionList ); + $this->setTemplateVar('defaulttype',$this->getRequestVar('type','alpha')); + + $this->setTemplateVar('object' ,$list ); + $this->setTemplateVar('act_objectid',$this->folder->id); + + $project = new Project($this->folder->projectid); + $rootFolder = new Folder( $project->getRootObjectId() ); + $rootFolder->load(); + + $this->setTemplateVar('properties' ,$this->folder->getProperties() ); + $this->setTemplateVar('rootfolderid' ,$rootFolder->id ); + $this->setTemplateVar('rootfoldername',$rootFolder->name); + } + + + public function post() { + $type = $this->getRequestVar('type'); + $ids = explode(',',$this->getRequestVar('ids')); + $targetObjectId = $this->getRequestVar('targetobjectid'); + + // Prüfen, ob Schreibrechte im Zielordner bestehen. + switch( $type ) + { + case 'move': + case 'copy': + case 'link': + $f = new Folder( $targetObjectId ); + + // Beim Verkn�pfen muss im Zielordner die Berechtigung zum Erstellen + // von Verkn�pfungen vorhanden sein. + // + // Beim Verschieben und Kopieren muss im Zielordner die Berechtigung + // zum Erstellen von Ordner, Dateien oder Seiten vorhanden sein. + if ( ( $type=='link' && $f->hasRight( Acl::ACL_CREATE_LINK ) ) || + ( ( $type=='move' || $type == 'copy' ) && + ( $f->hasRight(Acl::ACL_CREATE_FOLDER) || $f->hasRight(Acl::ACL_CREATE_FILE) || $f->hasRight(Acl::ACL_CREATE_PAGE) ) ) ) + { + // OK + } + else + { + $this->addValidationError('targetobjectid','no_rights'); + return; + } + + break; + default: + } + + + $ids = $this->folder->getObjectIds(); + $objectList = array(); + + foreach( $ids as $id ) + { + // Nur, wenn Objekt ausgewaehlt wurde + if ( !$this->hasRequestVar('obj'.$id) ) + continue; + + $o = new BaseObject( $id ); + $o->load(); + + // Fuer die gewuenschte Aktion muessen pro Objekt die entsprechenden Rechte + // vorhanden sein. + if ( $type == 'copy' && $o->hasRight( Acl::ACL_READ ) || + $type == 'move' && $o->hasRight( Acl::ACL_WRITE ) || + $type == 'link' && $o->hasRight( Acl::ACL_READ ) || + $type == 'archive' && $o->hasRight( Acl::ACL_READ ) || + $type == 'delete' && $o->hasRight( Acl::ACL_DELETE ) ) + $objectList[ $id ] = $o->getProperties(); + else + $this->addNotice($o->getType(), 0, $o->name, 'no_rights', Action::NOTICE_WARN); + } + + $ids = array_keys($objectList); + + if ( $type == 'archive' ) + { + require_once('serviceClasses/ArchiveTar.class.php'); + $tar = new ArchiveTar(); + $tar->files = array(); + + foreach( $ids as $id ) + { + $o = new BaseObject( $id ); + $o->load(); + + if ( $o->isFile ) + { + $file = new File($id); + $file->load(); + + // Datei dem Archiv hinzufügen. + $info = array(); + $info['name'] = $file->filename(); + $info['file'] = $file->loadValue(); + $info['mode'] = 0600; + $info['size'] = $file->size; + $info['time'] = $file->lastchangeDate; + $info['user_id' ] = 1000; + $info['group_id'] = 1000; + $info['user_name' ] = 'nobody'; + $info['group_name'] = 'nobody'; + + $tar->numFiles++; + $tar->files[]= $info; + } + else + { + // Was anderes als Dateien ignorieren. + $this->addNotice($o->getType(), 0, $o->name, 'NOTHING_DONE', Action::NOTICE_WARN); + } + + } + + // TAR speichern. + $tarFile = new File(); + $tarFile->name = \cms\base\Language::lang('ARCHIVE').' '.$this->getRequestVar('filename'); + $tarFile->filename = $this->getRequestVar('filename'); + $tarFile->extension = 'tar'; + $tarFile->parentid = $this->folder->objectid; + + $tar->__generateTAR(); + $tarFile->value = $tar->tar_file; + $tarFile->add(); + } + else + { + foreach( $ids as $id ) + { + $o = new BaseObject( $id ); + $o->load(); + + switch( $type ) + { + case 'move': + if ( $o->isFolder ) + { + $f = new Folder( $id ); + $allsubfolders = $f->getAllSubFolderIds(); + + // Plausibilisierungsprüfung: + // + // Wenn + // - Das Zielverzeichnis sich nicht in einem Unterverzeichnis des zu verschiebenen Ordners liegt + // und + // - Das Zielverzeichnis nicht der zu verschiebene Ordner ist + // dann verschieben + if ( !in_array($targetObjectId,$allsubfolders) && $id != $targetObjectId ) + { + $this->addNotice($o->getType(), 0, $o->name, 'MOVED', 'ok'); + $o->setParentId( $targetObjectId ); + } + else + { + $this->addNotice($o->getType(), 0, $o->name, 'ERROR', 'error'); + } + } + else + { + $o->setParentId( $targetObjectId ); + $this->addNotice($o->getType(), 0, $o->name, 'MOVED', 'ok'); + } + break; + + case 'copy': + switch( $o->getType() ) + { + case 'folder': + // Ordner zur Zeit nicht kopieren + // Funktion waere zu verwirrend + $this->addNotice($o->getType(), 0, $o->name, 'CANNOT_COPY_FOLDER', 'error'); + break; + + case 'file': + $f = new File( $id ); + $f->load(); + $f->filename = ''; + $f->name = \cms\base\Language::lang('COPY_OF').' '.$f->name; + $f->parentid = $targetObjectId; + $f->add(); + $f->copyValueFromFile( $id ); + + $this->addNotice($o->getType(), 0, $o->name, 'COPIED', 'ok'); + break; + + case 'page': + $p = new Page( $id ); + $p->load(); + $p->filename = ''; + $p->name = \cms\base\Language::lang('COPY_OF').' '.$p->name; + $p->parentid = $targetObjectId; + $p->add(); + $p->copyValuesFromPage( $id ); + $this->addNotice($o->getType(), 0, $o->name, 'COPIED', 'ok'); + break; + + case 'link': + $l = new Link( $id ); + $l->load(); + $l->filename = ''; + $l->name = \cms\base\Language::lang('COPY_OF').' '.$l->name; + $l->parentid = $targetObjectId; + $l->add(); + $this->addNotice($o->getType(), 0, $o->name, 'COPIED', 'ok'); + break; + + default: + throw new \LogicException('fatal: what type to delete?'); + } + $notices[] = \cms\base\Language::lang('COPIED'); + break; + + case 'link': + + if ( $o->isFile || + $o->isImage || + $o->isText || + $o->isPage ) // Nur Seiten oder Dateien sind verknuepfbar + { + $link = new Link(); + $link->parentid = $targetObjectId; + + $link->linkedObjectId = $id; + $link->isLinkToObject = true; + $link->name = \cms\base\Language::lang('LINK_TO').' '.$o->name; + $link->add(); + $this->addNotice($o->getType(), 0, $o->name, 'LINKED', 'ok'); + } + else + { + $this->addNotice($o->getType(), 0, $o->name, 'ERROR', 'error'); + } + break; + + case 'delete': + + if ( $this->hasRequestVar('confirm') ) + { + switch( $o->getType() ) + { + case 'folder': + $f = new Folder( $id ); + $f->deleteAll(); + break; + + case 'file': + $f = new File( $id ); + $f->delete(); + break; + + case 'page': + $p = new Page( $id ); + $p->load(); + $p->delete(); + break; + + case 'link': + $l = new Link( $id ); + $l->delete(); + break; + + case 'url': + $u = new Url( $id ); + $u->delete(); + break; + + default: + throw new \LogicException("Error while deleting: Unknown type: {$o->getType()}"); + } + $this->addNotice($o->getType(), 0, $o->name, 'DELETED', Action::NOTICE_OK); + } + else + { + $this->addNotice($o->getType(), 0, $o->name, 'NOTHING_DONE', Action::NOTICE_WARN); + } + + break; + + default: + $this->addNotice($o->getType(), 0, $o->name, 'ERROR', 'error'); + } + + } + } + + $this->folder->setTimestamp(); + } +} diff --git a/modules/cms/action/folder/FolderContentAction.class.php b/modules/cms/action/folder/FolderContentAction.class.php @@ -0,0 +1,69 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\File; +use util\Html; + + +class FolderContentAction extends FolderAction implements Method { + public function view() { + if ( ! $this->folder->isRoot ) + $this->setTemplateVar('up_url',Html::url('folder','show',$this->folder->parentid)); + + $this->setTemplateVar('writable',$this->folder->hasRight(Acl::ACL_WRITE) ); + + $list = array(); + + // Schleife ueber alle Objekte in diesem Ordner + foreach( $this->folder->getObjects() as $o ) + { + /* @var $o BaseObject */ + $id = $o->objectid; + + if ( $o->hasRight(Acl::ACL_READ) ) + { + $list[$id]['name'] = \util\Text::maxLength($o->name, 30); + $list[$id]['filename'] = \util\Text::maxLength($o->filename, 20); + $list[$id]['desc'] = \util\Text::maxLength($o->desc, 30); + if ( $list[$id]['desc'] == '' ) + $list[$id]['desc'] = \cms\base\Language::lang('NO_DESCRIPTION_AVAILABLE'); + $list[$id]['desc'] = $list[$id]['desc'].' - '.\cms\base\Language::lang('IMAGE').' '.$id; + + $list[$id]['type'] = $o->getType(); + $list[$id]['id' ] = $id; + + $list[$id]['icon' ] = $o->getType(); + $list[$id]['class'] = $o->getType(); + $list[$id]['url' ] = Html::url($o->getType(),'',$id); + + if ( $o->getType() == 'file' ) + { + $file = new File( $id ); + $file->load(); + $list[$id]['desc'] .= ' - '.intval($file->size/1000).'kB'; + + if ( $file->isImage() ) + { + $list[$id]['icon' ] = 'image'; + $list[$id]['class'] = 'image'; + //$list[$id]['url' ] = Html::url('file','show',$id) nur sinnvoll bei Lightbox-Anzeige + } +// if ( substr($file->mimeType(),0,5) == 'text/' ) +// $list[$id]['icon'] = 'text'; + } + + $list[$id]['date'] = $o->lastchangeDate; + $list[$id]['user'] = $o->lastchangeUser; + } + } + + $this->setTemplateVar('object' ,$list ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/folder/FolderCreateAction.class.php b/modules/cms/action/folder/FolderCreateAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\Acl; + + +class FolderCreateAction extends FolderAction implements Method { + public function view() { + $this->setTemplateVar('mayCreateFolder',$this->folder->hasRight( Acl::ACL_CREATE_FOLDER ) ); + $this->setTemplateVar('mayCreateFile' ,$this->folder->hasRight( Acl::ACL_CREATE_FILE ) ); + $this->setTemplateVar('mayCreateText' ,$this->folder->hasRight( Acl::ACL_CREATE_FILE ) ); + $this->setTemplateVar('mayCreateImage' ,$this->folder->hasRight( Acl::ACL_CREATE_FILE ) ); + $this->setTemplateVar('mayCreatePage' ,$this->folder->hasRight( Acl::ACL_CREATE_PAGE ) ); + $this->setTemplateVar('mayCreateUrl' ,$this->folder->hasRight( Acl::ACL_CREATE_LINK ) ); + $this->setTemplateVar('mayCreateLink' ,$this->folder->hasRight( Acl::ACL_CREATE_LINK ) ); + + } + + + public function post() { + } +} diff --git a/modules/cms/action/folder/FolderCreatefileAction.class.php b/modules/cms/action/folder/FolderCreatefileAction.class.php @@ -0,0 +1,99 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\BaseObject; +use cms\model\File; +use language\Messages; +use util\Http; +use util\Upload; + + +class FolderCreatefileAction extends FolderAction implements Method { + public function view() { + // Maximale Dateigroesse. + $maxSizeBytes = $this->maxFileSize(); + $this->setTemplateVar('max_size' ,($maxSizeBytes/1024).' KB' ); + $this->setTemplateVar('maxlength',$maxSizeBytes ); + + $this->setTemplateVar('objectid',$this->folder->objectid ); + } + + + public function post() { + $type = $this->getRequestVar('type' ); + $name = $this->getRequestVar('name' ); + $filename = $this->getRequestVar('filename' ); + $description = $this->getRequestVar('description'); + + $file = new File(); + + // Die neue Datei wird über eine URL geladen und dann im CMS gespeichert. + if ( $this->hasRequestVar('url') ) + { + $url = $this->getRequestVar('url'); + $http = new Http(); + $http->setUrl( $url ); + + $ok = $http->request(); + + if ( !$ok ) + { + $this->addValidationError('url','COMMON_VALIDATION_ERROR',array(),$http->error); + return; + } + + $file->desc = $description; + $file->filename = BaseObject::urlify( $name ); + $file->name = !empty($name)?$name:basename($url); + $file->size = strlen($http->body); + $file->value = $http->body; + $file->parentid = $this->folder->objectid; + $file->projectid = $this->folder->projectid; + } + elseif ( $this->hasRequestVar('value') ) + { + // New file is inserted. + $file->filename = BaseObject::urlify( $filename ); + $file->value = $this->getRequestVar('value'); + $file->size = strlen($file->value); + $file->parentid = $this->folder->objectid; + $file->projectid = $this->folder->projectid; + } + else + { + // File was uploaded. + $upload = new Upload('file'); + + try + { + $upload->processUpload(); + } + catch( \Exception $e ) + { + // technical error. + throw new \RuntimeException('Exception while processing the upload: '.$e->getMessage(), 0, $e); + + //throw new \ValidationException( $upload->parameterName ); + } + + $file->desc = $description; + $file->filename = BaseObject::urlify( $upload->filename ); + $file->name = !empty($name)?$name:$upload->filename; + $file->extension = $upload->extension; + $file->size = $upload->size; + $file->parentid = $this->folder->objectid; + $file->projectid = $this->folder->projectid; + + $file->value = $upload->value; + } + + $file->add(); // Datei hinzufuegen + $file->setNameForAllLanguages( $name,$description ); + + $this->addNoticeFor( $file, Messages::ADDED ); + $this->setTemplateVar('objectid',$file->objectid); + + $this->folder->setTimestamp(); + } +} diff --git a/modules/cms/action/folder/FolderCreatefolderAction.class.php b/modules/cms/action/folder/FolderCreatefolderAction.class.php @@ -0,0 +1,38 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\BaseObject; +use cms\model\Folder; +use language\Messages; + + +class FolderCreatefolderAction extends FolderAction implements Method { + public function view() { + $this->setTemplateVar('objectid' ,$this->folder->objectid ); + $this->setTemplateVar('languageid',$this->folder->languageid ); + } + + + public function post() { + $name = $this->getRequestVar('name'); + $description = $this->getRequestVar('description'); + + $f = new Folder(); + $f->projectid = $this->folder->projectid; + $f->languageid = $this->folder->languageid; + $f->name = $name; + $f->filename = BaseObject::urlify( $name ); + $f->desc = $description; + $f->parentid = $this->folder->objectid; + + $f->add(); + $f->setNameForAllLanguages( $name,$description ); + + $this->addNoticeFor($f, Messages::ADDED); + // Die neue Folder-Id (wichtig für API-Aufrufe). + $this->setTemplateVar('objectid',$f->objectid); + + $this->folder->setTimestamp(); // Zeitstempel setzen. + } +} diff --git a/modules/cms/action/folder/FolderCreateimageAction.class.php b/modules/cms/action/folder/FolderCreateimageAction.class.php @@ -0,0 +1,87 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\BaseObject; +use cms\model\Image; +use language\Messages; +use util\Http; +use util\Upload; + + +class FolderCreateimageAction extends FolderAction implements Method { + public function view() { + // Maximale Dateigroesse. + $maxSizeBytes = $this->maxFileSize(); + $this->setTemplateVar('max_size' ,($maxSizeBytes/1024).' KB' ); + $this->setTemplateVar('maxlength',$maxSizeBytes ); + + $this->setTemplateVar('objectid',$this->folder->objectid ); + } + + + public function post() { + $type = $this->getRequestVar('type' ); + $name = $this->getRequestVar('name' ); + $filename = $this->getRequestVar('filename' ); + $description = $this->getRequestVar('description'); + + $image = new Image(); + + // Die neue Datei wird über eine URL geladen und dann im CMS gespeichert. + if ( $this->hasRequestVar('url') ) + { + $url = $this->getRequestVar('url'); + $http = new Http(); + $http->setUrl( $url ); + + $ok = $http->request(); + + if ( !$ok ) + { + $this->addValidationError('url','COMMON_VALIDATION_ERROR',array(),$http->error); + return; + } + + $image->desc = $description; + $image->filename = BaseObject::urlify( basename($url) ); + $image->name = !empty($name)?$name:basename($url); + $image->size = strlen($http->body); + $image->value = $http->body; + $image->parentid = $this->folder->objectid; + } + else + { + $upload = new Upload(); + + try + { + $upload->processUpload(); + } + catch( \Exception $e ) + { + // technical error. + throw new \RuntimeException('Exception while processing the upload: '.$e->getMessage(), 0, $e); + + //throw new \ValidationException( $upload->parameterName ); + } + + $image->desc = $description; + $image->filename = BaseObject::urlify( $upload->filename ); + $image->name = !empty($name)?$name:$upload->filename; + $image->extension = $upload->extension; + $image->size = $upload->size; + $image->parentid = $this->folder->objectid; + $image->projectid = $this->folder->projectid; + + $image->value = $upload->value; + } + + $image->add(); // Datei hinzufuegen + $this->addNoticeFor( $image, Messages::ADDED ); + $image->setNameForAllLanguages( $name,$description ); + $this->setTemplateVar('objectid',$image->objectid); + + $this->folder->setTimestamp(); + } +} diff --git a/modules/cms/action/folder/FolderCreatelinkAction.class.php b/modules/cms/action/folder/FolderCreatelinkAction.class.php @@ -0,0 +1,37 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\BaseObject; +use cms\model\Link; +use language\Messages; + + +class FolderCreatelinkAction extends FolderAction implements Method { + + + public function view() { + $this->setTemplateVar('objectid' ,$this->folder->objectid ); + } + + + public function post() { + $name = $this->getRequestVar('name'); + $description = $this->getRequestVar('description'); + + $link = new Link(); + $link->filename = BaseObject::urlify( $name ); + $link->parentid = $this->folder->objectid; + + $link->linkedObjectId = $this->getRequestVar('targetobjectid'); + $link->projectid = $this->folder->projectid; + + $link->add(); + $link->setNameForAllLanguages( $name,$description ); + + $this->addNoticeFor( $link, Messages::ADDED); + $this->setTemplateVar('objectid',$link->objectid); + + $this->folder->setTimestamp(); + } +} diff --git a/modules/cms/action/folder/FolderCreatepageAction.class.php b/modules/cms/action/folder/FolderCreatepageAction.class.php @@ -0,0 +1,47 @@ +<?php +namespace cms\action\folder; +use cms\action\Action; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\BaseObject; +use cms\model\Page; +use cms\model\Project; +use language\Messages; + + +class FolderCreatepageAction extends FolderAction implements Method { + + + public function view() { + $project = new Project( $this->folder->projectid ); + + $all_templates = $project->getTemplates(); + $this->setTemplateVar('templates' ,$all_templates ); + $this->setTemplateVar('objectid' ,$this->folder->objectid ); + + if ( count($all_templates) == 0 ) + $this->addNotice('folder', 0, $this->folder->name, 'NO_TEMPLATES_AVAILABLE', Action::NOTICE_WARN); + } + + + public function post() { + $name = $this->getRequestVar('name' ); + $filename = $this->getRequestVar('filename' ); + $description = $this->getRequestVar('description'); + + $page = new Page(); + $page->filename = BaseObject::urlify( $name ); + $page->templateid = $this->getRequestVar('templateid'); + $page->parentid = $this->folder->objectid; + $page->projectid = $this->folder->projectid; + + + $page->add(); + $page->setNameForAllLanguages( $name,$description ); + + $this->addNoticeFor( $page, Messages::ADDED ); + $this->setTemplateVar('objectid',$page->objectid); + + $this->folder->setTimestamp(); + } +} diff --git a/modules/cms/action/folder/FolderCreatetextAction.class.php b/modules/cms/action/folder/FolderCreatetextAction.class.php @@ -0,0 +1,90 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\BaseObject; +use cms\model\Text; +use language\Messages; +use util\exception\ValidationException; +use util\Http; +use util\Upload; + + +class FolderCreatetextAction extends FolderAction implements Method { + public function view() { + // Maximale Dateigroesse. + $maxSizeBytes = $this->maxFileSize(); + $this->setTemplateVar('max_size' ,($maxSizeBytes/1024).' KB' ); + $this->setTemplateVar('maxlength',$maxSizeBytes ); + + $this->setTemplateVar('objectid',$this->folder->objectid ); + } + + + public function post() { + $name = $this->getRequestVar('name' ); + $description = $this->getRequestVar('description'); + + $text = new Text(); + $text->parentid = $this->folder->objectid; + $text->projectid = $this->folder->projectid; + + // Die neue Datei wird über eine URL geladen und dann im CMS gespeichert. + if ( $this->hasRequestVar('url') ) + { + $url = $this->getRequestVar('url'); + $http = new Http(); + $http->setUrl( $url ); + + $ok = $http->request(); + + if ( !$ok ) + { + //$this->addNotice($http->error); + // TODO: What to do with $http->error ? + throw new ValidationException('url',Messages::COMMON_VALIDATION_ERROR); + } + + $text->filename = BaseObject::urlify( basename($url) ); + $text->size = strlen($http->body); + $text->value = $http->body; + } + else + { + $upload = new Upload(); + + if ( $upload->isAvailable() ) { + + try + { + $upload->processUpload(); + } + catch( \Exception $e ) + { + // TODO: make a UIException? + throw $e; + } + + $text->filename = BaseObject::urlify( $upload->filename ); + $text->extension = $upload->extension; + $text->size = $upload->size; + + $text->value = $upload->value; + } + else { + $text->filename = $this->getRequestVar('filename'); + $text->extension = $this->getRequestVar('extension'); + $text->value = $this->getRequestVar('text'); + $text->size = strlen( $text->value ); + } + } + + $text->add(); // Datei hinzufuegen + $text->setNameForAllLanguages( $name,$description ); + + $this->addNoticeFor($text, Messages::ADDED); + $this->setTemplateVar('objectid',$text->objectid); + + $this->folder->setTimestamp(); + } +} diff --git a/modules/cms/action/folder/FolderCreateurlAction.class.php b/modules/cms/action/folder/FolderCreateurlAction.class.php @@ -0,0 +1,33 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\BaseObject; +use cms\model\Url; +use language\Messages; + + +class FolderCreateurlAction extends FolderAction implements Method { + public function view() { + } + public function post() { + $description = $this->getRequestVar('description'); + $filename = $this->getRequestVar('filename' ); + $name = $this->getRequestVar('name' ); + + $url = new Url(); + $url->filename = BaseObject::urlify( $name ); + $url->parentid = $this->folder->objectid; + $url->projectid = $this->folder->projectid; + + $url->url = $this->getRequestVar('url'); + + $url->add(); + $url->setNameForAllLanguages( $name,$description ); + + $this->addNoticeFor( $url, Messages::ADDED ); + $this->setTemplateVar('objectid',$url->objectid); + + $this->folder->setTimestamp(); + } +} diff --git a/modules/cms/action/folder/FolderEditAction.class.php b/modules/cms/action/folder/FolderEditAction.class.php @@ -0,0 +1,68 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\File; +use util\Html; + + +class FolderEditAction extends FolderAction implements Method { + public function view() { + if ( ! $this->folder->isRoot ) + $this->setTemplateVar('parentid',$this->folder->parentid); + + $list = array(); + + // Schleife ueber alle Objekte in diesem Ordner + foreach( $this->folder->getObjects() as $o ) + { + /* @var $o BaseObject */ + + $id = $o->objectid; + + if ( $o->hasRight(Acl::ACL_READ) ) + { + $list[$id]['name'] = \util\Text::maxLength($o->name, 30); + $list[$id]['filename'] = \util\Text::maxLength($o->filename, 20); + $list[$id]['desc'] = \util\Text::maxLength($o->desc, 30); + if ( $list[$id]['desc'] == '' ) + $list[$id]['desc'] = \cms\base\Language::lang('NO_DESCRIPTION_AVAILABLE'); + $list[$id]['desc'] = $list[$id]['desc'].' - '.\cms\base\Language::lang('IMAGE').' '.$id; + + $list[$id]['type'] = $o->getType(); + $list[$id]['id' ] = $id; + + $list[$id]['icon' ] = $o->getType(); + $list[$id]['class'] = $o->getType(); + $list[$id]['url' ] = Html::url($o->getType(),'',$id); + + if ( $o->getType() == 'file' ) + { + $file = new File( $id ); + $file->load(); + $list[$id]['desc'] .= ' - '.intval($file->size/1000).'kB'; + + if ( $file->isImage() ) + { + $list[$id]['icon' ] = 'image'; + $list[$id]['class'] = 'image'; + //$list[$id]['url' ] = Html::url('file','show',$id) nur sinnvoll bei Lightbox-Anzeige + } +// if ( substr($file->mimeType(),0,5) == 'text/' ) +// $list[$id]['icon'] = 'text'; + } + + $list[$id]['date'] = $o->lastchangeDate; + $list[$id]['user'] = $o->lastchangeUser; + } + } + + $this->setTemplateVar('object' ,$list ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/folder/FolderOrderAction.class.php b/modules/cms/action/folder/FolderOrderAction.class.php @@ -0,0 +1,66 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\Acl; +use cms\model\BaseObject; +use language\Messages; + + +class FolderOrderAction extends FolderAction implements Method { + public function view() { + $list = array(); + + // Schleife ueber alle Objekte in diesem Ordner + foreach( $this->folder->getObjects() as $o ) + { + /* @var $o BaseObject */ + $id = $o->objectid; + $name = $o->getDefaultName(); + + if ( $o->hasRight(Acl::ACL_READ) ) + { + $list[$id]['id' ] = $id; + $list[$id]['name'] = $name->name; + $list[$id]['filename'] = $o->filename; + $list[$id]['desc'] = 'ID '.$id.' - '.$name->description; + + $list[$id]['type'] = $o->getType(); + $list[$id]['icon'] = $o->getType(); + + $list[$id]['date'] = $o->lastchangeDate; + $list[$id]['user'] = $o->lastchangeUser; + + $last_objectid = $id; + } + } + + $this->setTemplateVar('object' ,$list ); + $this->setTemplateVar('act_objectid',$this->folder->id); + } + + + public function post() { + $ids = $this->folder->getObjectIds(); + $seq = 0; + + $order = explode(',',$this->getRequestVar('order') ); + + foreach( $order as $objectid ) + { + if ( ! is_numeric($objectid) || ! in_array($objectid,$ids) ) + { + throw new \LogicException('Object-Id '.$objectid.' is not in this folder any more'); + } + $seq++; // Sequenz um 1 erhoehen + + $o = new BaseObject( $objectid ); + $o->setOrderId( $seq ); + + unset( $o ); // Selfmade Garbage Collection :-) + } + + $this->addNoticeFor($this->folder, Messages::SEQUENCE_CHANGED); + $this->folder->setTimestamp(); + } +} diff --git a/modules/cms/action/folder/FolderPreviewAction.class.php b/modules/cms/action/folder/FolderPreviewAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use util\Html; + + +class FolderPreviewAction extends FolderAction implements Method { + public function view() { + $this->setTemplateVar('preview_url',Html::url('folder','show',$this->folder->objectid,array('target'=>'none') ) ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/folder/FolderPubAction.class.php b/modules/cms/action/folder/FolderPubAction.class.php @@ -0,0 +1,109 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\base\Startup; +use cms\generator\FileContext; +use cms\generator\FileGenerator; +use cms\generator\PageContext; +use cms\generator\PageGenerator; +use cms\generator\Producer; +use cms\generator\Publisher; +use cms\generator\PublishOrder; +use cms\model\Acl; +use cms\model\Folder; +use util\Session; + + +class FolderPubAction extends FolderAction implements Method { + + + public function view() { + // Schalter nur anzeigen, wenn sinnvoll + + // TODO texts, urls.... + $this->setTemplateVar('files' ,count($this->folder->getFiles()) >= 0 ); + $this->setTemplateVar('pages' ,count($this->folder->getPages()) > 0 ); + $this->setTemplateVar('subdirs',count($this->folder->getSubFolderIds()) > 0 ); + + //$this->setTemplateVar('clean' ,$this->folder->isRoot ); + // Gefaehrliche Option, da dies bestehende Dateien, die evtl. nicht zum CMS gehören, überschreibt. + // Daher deaktiviert. + $this->setTemplateVar('clean' ,false ); + } + + + public function post() { + if ( !$this->folder->hasRight( Acl::ACL_PUBLISH ) ) + throw new \util\exception\SecurityException('no rights for publish'); + + $project = $this->folder->getProject(); + $project->load(); + + // Nothing is written to the session from this point. so we should free the session. + Session::close(); + + $publisher = new Publisher( $project->projectid ); + + // Create a list of all folders. + $folderList = [ $this->folder->objectid ]; + + // Add all subfolders to the list + if ( $this->request->hasRequestVar('subdirs') ) + $folderList = array_merge( $folderList, $this->folder->getAllSubFolderIds() ); + + foreach( $folderList as $folderId ) { + + $folder = new Folder( $folderId ); + $folder->load(); + + // Publish all pages + if ( $this->request->hasRequestVar('pages' ) ) { + + foreach( $folder->getPages() as $pageObjectId ) { + + foreach( $project->getModelIds() as $modelId ) { + + foreach( $project->getLanguageIds() as $languageId ) { + + $pageContext = new PageContext( $pageObjectId, Producer::SCHEME_PUBLIC ); + $pageContext->modelId = $modelId; + $pageContext->languageId = $languageId; + + $pageGenerator = new PageGenerator( $pageContext ); + + $publisher->addOrderForPublishing( new PublishOrder( $pageGenerator->getCache()->load()->getFilename(),$pageGenerator->getPublicFilename(), 0 ) ); + } + } + } + } + + // Publish all files + if ( $this->hasRequestVar('files' ) ) { + + foreach( $folder->getFiles() as $fileid ) { + + $fileGenerator = new FileGenerator( new FileContext( $fileid, Producer::SCHEME_PUBLIC)); + $publisher->addOrderForPublishing( new PublishOrder( $fileGenerator->getCache()->load()->getFilename(),$fileGenerator->getPublicFilename(),0 ) ); + + } + } + + $publisher->publish(); + } + + + + + // Cleanup the target directory (if supported by the underlying target) + if ( $this->hasRequestVar('clean') ) + $publisher->cleanOlderThan( Startup::getStartTime() ); + + + $this->addNoticeFor( $this->folder, + 'PUBLISHED', + array(), + implode("\n",$publisher->getDestinationFilenames() ) + ); + } +} diff --git a/modules/cms/action/folder/FolderRemoveAction.class.php b/modules/cms/action/folder/FolderRemoveAction.class.php @@ -0,0 +1,27 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use language\Messages; + + +class FolderRemoveAction extends FolderAction implements Method { + + public function view() { + $this->setTemplateVar( 'name',$this->folder->filename ); + $this->setTemplateVar( 'hasChildren', $this->folder->hasChildren() ); + } + + + public function post() { + if ( $this->hasRequestVar( 'withChildren')) + $this->folder->deleteAll(); // Delete with children + else + if ( $this->folder->hasChildren() ) + throw new \util\exception\ValidationException("withChildren",Messages::CONTAINS_CHILDREN); + else + $this->folder->delete(); // Only delete current folder. + + $this->addNoticeFor($this->folder, Messages::DELETED); + } +} diff --git a/modules/cms/action/folder/FolderRootAction.class.php b/modules/cms/action/folder/FolderRootAction.class.php @@ -0,0 +1,22 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\Folder; +use cms\model\Project; + + +class FolderRootAction extends FolderAction implements Method { + public function view() { + $project = new Project($this->folder->projectid); + $rootFolder = new Folder( $project->getRootObjectId() ); + $rootFolder->load(); + + $this->setTemplateVar('rootfolderid' ,$rootFolder->id ); + $this->setTemplateVar('rootfoldername',$rootFolder->name); + } + + + public function post() { + } +} diff --git a/modules/cms/action/folder/FolderShowAction.class.php b/modules/cms/action/folder/FolderShowAction.class.php @@ -0,0 +1,46 @@ +<?php +namespace cms\action\folder; +use cms\action\FolderAction; +use cms\action\Method; +use cms\model\Acl; +use cms\model\BaseObject; +use util\Html; + + +class FolderShowAction extends FolderAction implements Method { + public function view() { + + // Angabe Content-Type + header('Content-Type: text/html' ); + + header('X-Folder-Id: ' .$this->folder->folderid ); + header('X-Id: ' .$this->folder->id ); + header('Content-Description: '.$this->folder->filename() ); + + echo '<html><body>'; + echo '<h1>'.$this->folder->filename.'</h1>'; + echo '<ul>'; + + // Schleife ueber alle Objekte in diesem Ordner + foreach( $this->folder->getObjects() as $o ) + { + /* @var $o BaseObject */ + $id = $o->objectid; + + if ( $o->hasRight(Acl::ACL_READ) ) + { + echo '<li><a href="'. Html::url($o->getType(),'show',$id).'">'.$o->filename.'</a></li>'; + + //echo date( \cms\base\Language::lang('DATE_FORMAT'),$o->lastchangeDate ); + //echo $o->lastchangeUser; + } + } + + echo '</ul>'; + echo '</body></html>'; + + exit; + } + public function post() { + } +} diff --git a/modules/cms/action/group/GroupInfoAction.class.php b/modules/cms/action/group/GroupInfoAction.class.php @@ -0,0 +1,15 @@ +<?php +namespace cms\action\group; +use cms\action\GroupAction; +use cms\action\Method; + +class GroupInfoAction extends GroupAction implements Method { + public function view() { + $this->setTemplateVars( $this->group->getProperties() ); + $this->setTemplateVar( 'users',$this->group->getUsers() ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/group/GroupListingAction.class.php b/modules/cms/action/group/GroupListingAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\group; +use cms\action\GroupAction; +use cms\action\Method; +use cms\model\Group; + +class GroupListingAction extends GroupAction implements Method { + public function view() { + $list = array(); + + foreach( Group::getAll() as $id=>$name ) + { + $list[$id] = array(); + $list[$id]['name'] = $name; + } + + $this->setTemplateVar('el', $list); + } + + + public function post() { + } +} diff --git a/modules/cms/action/group/GroupMembershipsAction.class.php b/modules/cms/action/group/GroupMembershipsAction.class.php @@ -0,0 +1,51 @@ +<?php +namespace cms\action\group; +use cms\action\GroupAction; +use cms\action\Method; +use cms\model\User; + +class GroupMembershipsAction extends GroupAction implements Method { + public function view() { + // Mitgliedschaften ermitteln + // + $userliste = array(); + + $allUsers = User::listAll(); + + $actualGroupUsers = $this->group->getUsers(); + + foreach( $allUsers as $id=>$name ) + { + $hasUser = array_key_exists($id,$actualGroupUsers); + $varName = 'user'.$id; + $userliste[$id] = array('name' => $name, + 'id' => $id, + 'var' => $varName, + 'member' => $hasUser + ); + $this->setTemplateVar($varName,$hasUser); + } + $this->setTemplateVar('memberships',$userliste); + } + public function post() { + $allUsers = User::listAll(); + $groupUsers = $this->group->getUsers(); + + foreach( $allUsers as $id=>$name ) + { + $hasUser = array_key_exists($id,$groupUsers); + + if ( !$hasUser && $this->hasRequestVar('user'.$id) ) + { + $this->group->addUser($id); + $this->addNotice('user', 0, $name, 'ADDED'); + } + + if ( $hasUser && !$this->hasRequestVar('user'.$id) ) + { + $this->group->delUser($id); + $this->addNotice('user', 0, $name, 'DELETED'); + } + } + } +} diff --git a/modules/cms/action/group/GroupPropAction.class.php b/modules/cms/action/group/GroupPropAction.class.php @@ -0,0 +1,20 @@ +<?php +namespace cms\action\group; +use cms\action\GroupAction; +use cms\action\Method; + + +class GroupPropAction extends GroupAction implements Method { + public function view() { + $this->setTemplateVars( $this->group->getProperties() ); + } + public function post() { + if ( ! $this->getRequestVar('name') ) + throw new \util\exception\ValidationException('name'); + + $this->group->name = $this->getRequestVar('name'); + $this->group->save(); + + $this->addNotice('group', 0, $this->group->name, 'SAVED', 'ok'); + } +} diff --git a/modules/cms/action/group/GroupRemoveAction.class.php b/modules/cms/action/group/GroupRemoveAction.class.php @@ -0,0 +1,24 @@ +<?php +namespace cms\action\group; +use cms\action\Action; +use cms\action\GroupAction; +use cms\action\Method; + +class GroupRemoveAction extends GroupAction implements Method { + public function view() { + $this->setTemplateVars( $this->group->getProperties() ); + } + + public function post() { + if ( $this->hasRequestVar('confirm') ) + { + $this->group->delete(); + + $this->addNotice('group', 0, $this->group->name, 'DELETED', Action::NOTICE_OK); + } + else + { + $this->addNotice('group', 0, $this->group->name, 'NOTHING_DONE', Action::NOTICE_WARN); + } + } +} diff --git a/modules/cms/action/group/GroupRightsAction.class.php b/modules/cms/action/group/GroupRightsAction.class.php @@ -0,0 +1,74 @@ +<?php +namespace cms\action\group; +use cms\action\GroupAction; +use cms\action\Method; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\Group; +use cms\model\Language; +use cms\model\Project; + +class GroupRightsAction extends GroupAction implements Method { + + + public function view() { + $rights = $this->group->getAllAcls(); + + $projects = array(); + + foreach( $rights as $acl ) + { + if ( !isset($projects[$acl->projectid])) + { + $projects[$acl->projectid] = array(); + $p = new Project($acl->projectid); + $p->load(); + $projects[$acl->projectid]['projectname'] = $p->name; + $projects[$acl->projectid]['rights' ] = array(); + } + + $right = array(); + + if ( $acl->languageid > 0 ) + { + $language = new Language($acl->languageid); + $language->load(); + $right['languagename'] = $language->name; + } + else + { + $right['languagename'] = \cms\base\Language::lang('ALL_LANGUAGES'); + } + + + $o = new BaseObject($acl->objectid); + $o->objectLoad(); + $right['objectname'] = $o->name; + $right['objectid' ] = $o->objectid; + $right['objecttype'] = $o->getType(); + + if ( $acl->groupid > 0 ) + { + $group = new Group($acl->groupid); + $group->load(); + $right['groupname'] = $group->name; + } + else + { + // Berechtigung f�r "alle". + } + + $right['bits'] = $acl->getProperties(); + + $projects[$acl->projectid]['rights'][] = $right; + } + + $this->setTemplateVar('projects' ,$projects ); + + $this->setTemplateVar('show',Acl::getAvailableRights() ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/grouplist/GrouplistAddAction.class.php b/modules/cms/action/grouplist/GrouplistAddAction.class.php @@ -0,0 +1,25 @@ +<?php +namespace cms\action\grouplist; +use cms\action\GrouplistAction; +use cms\action\Method; +use cms\model\Group; + +class GrouplistAddAction extends GrouplistAction implements Method { + public function view() { + } + public function post() { + if ( $this->getRequestVar('name') != '') + { + $this->group = new Group(); + $this->group->name = $this->getRequestVar('name'); + $this->group->add(); + $this->addNotice('group', 0, $this->group->name, 'ADDED', 'ok'); + $this->callSubAction('listing'); + } + else + { + $this->addValidationError('name'); + $this->callSubAction('add'); + } + } +} diff --git a/modules/cms/action/grouplist/GrouplistEditAction.class.php b/modules/cms/action/grouplist/GrouplistEditAction.class.php @@ -0,0 +1,13 @@ +<?php +namespace cms\action\grouplist; +use cms\action\GrouplistAction; +use cms\action\Method; + + +class GrouplistEditAction extends GrouplistAction implements Method { + public function view() { + $this->nextSubAction('show'); + } + public function post() { + } +} diff --git a/modules/cms/action/grouplist/GrouplistShowAction.class.php b/modules/cms/action/grouplist/GrouplistShowAction.class.php @@ -0,0 +1,24 @@ +<?php +namespace cms\action\grouplist; +use cms\action\GrouplistAction; +use cms\action\Method; +use cms\model\Group; + +class GrouplistShowAction extends GrouplistAction implements Method { + public function view() { + $list = array(); + + foreach( Group::getAll() as $id=>$name ) + { + $list[$id] = array(); + $list[$id]['id' ] = $id; + $list[$id]['name'] = $name; + } + + $this->setTemplateVar('el', $list); + } + + + public function post() { + } +} diff --git a/modules/cms/action/image/ImagePreviewAction.class.php b/modules/cms/action/image/ImagePreviewAction.class.php @@ -0,0 +1,15 @@ +<?php +namespace cms\action\image; +use cms\action\ImageAction; +use cms\action\Method; +use util\Html; + +class ImagePreviewAction extends ImageAction implements Method { + public function view() { + $this->setTemplateVar('url', Html::url('image','show',$this->image->objectid ) ); + + parent::previewView(); + } + public function post() { + } +} diff --git a/modules/cms/action/image/ImageSizeAction.class.php b/modules/cms/action/image/ImageSizeAction.class.php @@ -0,0 +1,97 @@ +<?php +namespace cms\action\image; +use cms\action\Action; +use cms\action\ImageAction; +use cms\action\Method; +use cms\model\Image; + +class ImageSizeAction extends ImageAction implements Method { + public function view() { + $this->setTemplateVars( $this->image->getProperties() ); + + $format = $this->imageFormat(); + + if ( $format == 0 ) + { + $this->addNotice('image', 0, '', 'IMAGE_RESIZING_UNKNOWN_TYPE', Action::NOTICE_WARN); + } + + $formats = $this->imageFormats(); + + if ( empty($formats) ) + $this->addNotice('image', 0, '', 'IMAGE_RESIZING_NOT_AVAILABLE', Action::NOTICE_WARN); + + $sizes = array(); + foreach( array(10,25,50,75,100,125,150,175,200,250,300,350,400,500,600,800) as $s ) + $sizes[strval($s/100)] = $s.'%'; + + $jpeglist = array(); + for ($i=10; $i<=95; $i+=5) + $jpeglist[$i]=$i.'%'; + + $this->setTemplateVar('factors' ,$sizes ); + $this->setTemplateVar('jpeglist' ,$jpeglist ); + $this->setTemplateVar('formats' ,$formats ); + $this->setTemplateVar('format' ,$format ); + $this->setTemplateVar('factor' ,1 ); + + $this->image->getImageSize(); + $this->setTemplateVar('width' ,$this->image->width ); + $this->setTemplateVar('height',$this->image->height ); + $this->setTemplateVar('type' ,'input' ); + } + + + public function post() { + $width = intval($this->getRequestVar('width' )); + $height = intval($this->getRequestVar('height' )); + $jpegcompression = $this->getRequestVar('jpeg_compression') ; + $format = $this->getRequestVar('format' ) ; + $factor = $this->getRequestVar('factor' ) ; + + if ( $this->getRequestVar('type') == 'input' && + ! $this->hasRequestVar('width' ) && + ! $this->hasRequestVar('height') ) + { + $this->addValidationError('width','INPUT_NEW_IMAGE_SIZE' ); + $this->addValidationError('height',''); + $this->callSubAction('size'); + return; + } + + if ( $this->hasRequestVar('copy') ) + { + // Datei neu anlegen. + $imageFile = new Image($this->image->objectid); + $imageFile->load(); + $imageFile->name = \cms\base\Language::lang('copy_of').' '.$imageFile->name; + $imageFile->desription = \cms\base\Language::lang('copy_of').' '.$imageFile->description; + $imageFile->filename = $imageFile->filename.'_resized_'.time(); + $imageFile->add(); + $imageFile->copyValueFromFile( $this->image->objectid ); + } + else + { + $imageFile = $this->image; + } + + if ( $this->getRequestVar('type') == 'factor') + { + $width = 0; + $height = 0; + } + else + { + $factor = 1; + } + + $imageFile->write(); + + $imageFile->imageResize( intval($width),intval($height),$factor,$this->imageFormat(),$format,$jpegcompression ); + $imageFile->setTimestamp(); + $imageFile->save(); // Um z.B. Groesse abzuspeichern + $imageFile->saveValue(); + + $this->addNotice($imageFile->getType(), 0, $imageFile->name, 'IMAGE_RESIZED', 'ok'); + } +} diff --git a/modules/cms/action/language/LanguageInfoAction.class.php b/modules/cms/action/language/LanguageInfoAction.class.php @@ -0,0 +1,14 @@ +<?php +namespace cms\action\language; +use cms\action\LanguageAction; +use cms\action\Method; + +class LanguageInfoAction extends LanguageAction implements Method { + + public function view() { + $this->setTemplateVars( $this->language->getProperties() ); + } + + public function post() { + } +} diff --git a/modules/cms/action/language/LanguagePropAction.class.php b/modules/cms/action/language/LanguagePropAction.class.php @@ -0,0 +1,36 @@ +<?php +namespace cms\action\language; +use cms\action\Action; +use cms\action\LanguageAction; +use cms\action\Method; +use cms\base\Configuration; + + +class LanguagePropAction extends LanguageAction implements Method { + public function view() { + $this->setTemplateVar('isocode' ,$this->language->isoCode ); + $this->setTemplateVar('name' ,$this->language->name ); + $this->setTemplateVar('is_default',$this->language->isDefault ); + } + public function post() { + if ( $this->hasRequestVar('name') ) + { + $this->language->name = $this->getRequestVar('name' ); + $this->language->isoCode = $this->getRequestVar('isocode'); + } + else + { + $countries = Configuration::subset('countries'); + $iso = $this->getRequestVar('isocode'); + $this->language->name = $countries->get($iso,$iso); + $this->language->isoCode = strtolower( $iso ); + } + + if ( $this->hasRequestVar('is_default') ) + $this->language->setDefault(); + + $this->language->save(); + + $this->addNotice('language', 0, $this->language->name, 'DONE', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/language/LanguageRemoveAction.class.php b/modules/cms/action/language/LanguageRemoveAction.class.php @@ -0,0 +1,15 @@ +<?php +namespace cms\action\language; +use cms\action\LanguageAction; +use cms\action\Method; + + +class LanguageRemoveAction extends LanguageAction implements Method { + public function view() { + $this->setTemplateVar('name' ,$this->language->name ); + } + public function post() { + if ( $this->getRequestVar('confirm') == '1' ) + $this->language->delete(); + } +} diff --git a/modules/cms/action/language/LanguageSetdefaultAction.class.php b/modules/cms/action/language/LanguageSetdefaultAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\action\language; +use cms\action\Action; +use cms\action\LanguageAction; +use cms\action\Method; + + +class LanguageSetdefaultAction extends LanguageAction implements Method { + public function view() { + } + public function post() { + $this->language->setDefault(); + + $this->addNotice('language', 0, $this->language->name, 'DONE', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/languagelist/LanguagelistAddAction.class.php b/modules/cms/action/languagelist/LanguagelistAddAction.class.php @@ -0,0 +1,41 @@ +<?php +namespace cms\action\languagelist; +use cms\action\LanguagelistAction; +use cms\action\Method; +use cms\base\Configuration; +use cms\model\Language; +use language\Messages; + + +class LanguagelistAddAction extends LanguagelistAction implements Method { + public function view() { + $countryList = Configuration::subset('countries')->getConfig(); + + foreach( $this->project->getLanguageIds() as $id ) + { + + $l = new Language( $id ); + $l->load(); + + unset( $countryList[$l->isoCode] ); + } + + asort( $countryList ); + + $this->setTemplateVar('isocodes' ,$countryList ); + $this->setTemplateVar('isocode' ,'' ); + } + public function post() { + + $countryList = Configuration::Conf()->get('countries',[]); + + $iso = $this->getRequestVar('isocode'); + $language = new Language(); + $language->projectid = $this->project->projectid; + $language->isoCode = $iso; + $language->name = @$countryList[$iso]; + $language->add(); + + $this->addNoticeFor($language, Messages::ADDED); + } +} diff --git a/modules/cms/action/languagelist/LanguagelistEditAction.class.php b/modules/cms/action/languagelist/LanguagelistEditAction.class.php @@ -0,0 +1,13 @@ +<?php +namespace cms\action\languagelist; +use cms\action\LanguagelistAction; +use cms\action\Method; + + +class LanguagelistEditAction extends LanguagelistAction implements Method { + public function view() { + $this->nextSubAction('show'); + } + public function post() { + } +} diff --git a/modules/cms/action/languagelist/LanguagelistShowAction.class.php b/modules/cms/action/languagelist/LanguagelistShowAction.class.php @@ -0,0 +1,41 @@ +<?php +namespace cms\action\languagelist; +use cms\action\LanguagelistAction; +use cms\action\Method; +use cms\base\Configuration; +use cms\model\Language; +use util\Html; + + +class LanguagelistShowAction extends LanguagelistAction implements Method { + public function view() { + $countryList = Configuration::Conf()->get('countries',[]); + + $list = array(); + + $this->setTemplateVar('act_languageid',0 ); + + + + foreach( $this->project->getLanguageIds() as $id ) + { + $l = new Language( $id ); + $l->load(); + + unset( $countryList[strtoupper($l->isoCode)] ); + + $list[$id] = array(); + $list[$id]['name' ] = $l->name; + $list[$id]['isocode'] = $l->isoCode; + $list[$id]['id' ] = $id; + + $list[$id]['is_default'] = $l->isDefault; + + $list[$id]['select_url'] = Html::url( 'index','language',$id ); + } + + $this->setTemplateVar('el',$list); + } + public function post() { + } +} diff --git a/modules/cms/action/link/LinkEditAction.class.php b/modules/cms/action/link/LinkEditAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\link; +use cms\action\Action; +use cms\action\LinkAction; +use cms\action\Method; + + +class LinkEditAction extends LinkAction implements Method { + public function view() { + $this->setTemplateVars( $this->link->getProperties() ); + + // Typ der Verknuepfung + $this->setTemplateVar('type' ,$this->link->getType() ); + $this->setTemplateVar('targetobjectid' ,$this->link->linkedObjectId); + $this->setTemplateVar('targetobjectname',$this->link->name ); + } + public function post() { + $this->link->linkedObjectId = $this->getRequestVar('targetobjectid'); + $this->link->save(); + + $this->addNotice('link', 0, $this->link->name, 'SAVED', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/link/LinkRemoveAction.class.php b/modules/cms/action/link/LinkRemoveAction.class.php @@ -0,0 +1,20 @@ +<?php +namespace cms\action\link; +use cms\action\Action; +use cms\action\LinkAction; +use cms\action\Method; + + +class LinkRemoveAction extends LinkAction implements Method { + public function view() { + $this->setTemplateVar( 'name',$this->link->filename ); + } + public function post() { + if ($this->getRequestVar('delete') != '') { + $this->link->delete(); + $this->addNotice('link', 0, $this->link->filename, 'DELETED', Action::NOTICE_OK); + } else { + $this->addNotice('link', 0, $this->link->filename, 'CANCELED', Action::NOTICE_WARN); + } + } +} diff --git a/modules/cms/action/link/LinkShowAction.class.php b/modules/cms/action/link/LinkShowAction.class.php @@ -0,0 +1,38 @@ +<?php +namespace cms\action\link; +use cms\action\LinkAction; +use cms\action\Method; +use cms\model\BaseObject; +use util\Html; + + +class LinkShowAction extends LinkAction implements Method { + + public function view() { + header('Content-Type: text/html' ); + + header('X-Link-Id: ' .$this->link->linkid ); + header('X-Id: ' .$this->link->id ); + header('Content-Description: '.$this->link->filename() ); + + echo '<html><body>'; + echo '<h1>'.$this->link->filename.'</h1>'; + echo '<hr />'; + + try { + $o = new BaseObject( $this->link->linkedObjectId ); + $o->load(); + echo '<a href="'.Html::url($o->getType(),'show',$o->objectid).'">'.$o->filename.'</a>'; + } + catch( \util\exception\ObjectNotFoundException $e ) { + echo '-'; + } + + echo '</body></html>'; + + exit; + } + + public function post() { + } +} diff --git a/modules/cms/action/login/LoginLicenseAction.class.php b/modules/cms/action/login/LoginLicenseAction.class.php @@ -0,0 +1,59 @@ +<?php +namespace cms\action\login; +use cms\action\LoginAction; +use cms\action\Method; +use cms\base\Configuration; +use util\Session; + + +class LoginLicenseAction extends LoginAction implements Method { + public function view() { + $software = array(); + + $software[] = array('name' =>'OpenRat Content Management System', + 'url' =>'http://www.openrat.de/', + 'license'=>'GPL v2'); + $software[] = array('name' =>'jQuery Core Javascript Framework', + 'url' =>'http://jquery.com/', + 'license'=>'MPL, GPL v2'); + $software[] = array('name' =>'jQuery UI Javascript Framework', + 'url' =>'http://jqueryui.com/', + 'license'=>'MPL, GPL v2'); + $software[] = array('name' =>'GeSHi - Generic Syntax Highlighter', + 'url' =>'http://qbnz.com/highlighter/', + 'license'=>'GPL v2'); + $software[] = array('name' =>'TAR file format', + 'url' =>'http://www.phpclasses.org/package/529', + 'license'=>'LGPL'); + $software[] = array('name' =>'JSON file format', + 'url' =>'http://pear.php.net/pepr/pepr-proposal-show.php?id=198', + 'license'=>'BSD'); + + $this->setTemplateVar('software',$software); + + + + $this->setTemplateVar('time' ,date('r') ); + $this->setTemplateVar('os' ,php_uname('s') ); + $this->setTemplateVar('release' ,php_uname('r') ); + $this->setTemplateVar('machine' ,php_uname('m') ); + $this->setTemplateVar('version' , phpversion() ); + + $this->setTemplateVar('cms_name' , Configuration::Conf()->subset('application')->get('name' ) ); + $this->setTemplateVar('cms_version' , Configuration::Conf()->subset('application')->get('version' ) ); + $this->setTemplateVar('cms_operator', Configuration::Conf()->subset('application')->get('operator') ); + + $user = Session::getUser(); + if ( !empty($user) ) + { + $this->setTemplateVar('user_login' , $user->loginDate ); + $this->setTemplateVar('user_name' , $user->name ); + $this->setTemplateVar('user_fullname', $user->fullname ); + } + + } + + + public function post() { + } +} diff --git a/modules/cms/action/login/LoginLoginAction.class.php b/modules/cms/action/login/LoginLoginAction.class.php @@ -0,0 +1,259 @@ +<?php +namespace cms\action\login; +use cms\action\Action; +use cms\action\LoginAction; +use cms\action\Method; +use cms\action\RequestParams; +use cms\auth\Auth; +use cms\auth\AuthRunner; +use cms\auth\InternalAuth; +use cms\base\Configuration; +use cms\model\User; +use language\Messages; +use logger\Logger; +use security\Password; +use util\exception\ObjectNotFoundException; +use util\exception\SecurityException; +use util\Session; +use util\text\TextMessage; + + +class LoginLoginAction extends LoginAction implements Method { + public function view() { + $loginConfig = Configuration::subset('security'); + $securityConfig = Configuration::subset('security'); + $authenticateConfig = Configuration::subset('authenticate'); + + $authenticateEnabled = $authenticateConfig->is('enable',true); + $oidcList = []; + + $oidcConfig = Configuration::subset(['security','oidc']); + + if ( $oidcConfig->is('enabled',true) ) { + foreach ( $oidcConfig->subset('provider')->subsets() as $name=>$providerConfig ) { + if ( $providerConfig->is('enabled',true)) { + $oidcList[ $name ] = $providerConfig->get('label',$name ); + } + } + } + + $this->setTemplateVar('enableUserPasswordLogin',$authenticateEnabled); + $this->setTemplateVar('enableOpenIdConnect' ,(boolean)$oidcList ); + $this->setTemplateVar('provider' ,$oidcList ); + + $databases = Configuration::subset('database')->subsets(); + + // Filter all enabled databases + $databases = array_filter( $databases, function($dbConfig) { + $dbConfig->is('enabled',true); + }); + + $dbids = []; + foreach( $databases as $dbid => $dbconf ) + { + // Getting the first not-null information about the connection. + $dbids[ $dbid ] = array_filter( array( + $dbconf->get('description'), + $dbconf->get('name'), + $dbconf->get('host'), + $dbconf->get('driver'), + $dbid))[0]; + } + + + if ( empty($dbids) ) + $this->addNotice('', 0, '', 'no_database_configuration', Action::NOTICE_WARN); + + $this->setTemplateVar( 'dbids',$dbids ); + + // Database was already connected in the Dispatcher. So we MUST have a db connection here. + $db = Session::getDatabase(); + $this->setTemplateVar('dbid',$db->id); + + $this->setTemplateVar('register' ,$loginConfig->get('register' )); + $this->setTemplateVar('send_password',$loginConfig->get('send_password')); + + // Versuchen, einen Benutzernamen zu ermitteln, der im Eingabeformular vorausgewählt wird. + $username = AuthRunner::getUsername('preselect'); + + $this->setTemplateVar('login_name',$username); + + // If the preselected user is the default user, we have a password. + if ( $username == $securityConfig->subset('default')->get('username') ) + $this->setTemplateVar('login_password', $securityConfig->subset('default')->get('password') ); + } + + + public function post() { + Session::setUser(null); // Altes Login entfernen. + + if ( Configuration::subset('login')->is('nologin',false ) ) + throw new SecurityException('login disabled'); + + $loginName = $this->getRequestVar('login_name' ,RequestParams::FILTER_ALPHANUM); + $loginPassword = $this->getRequestVar('login_password',RequestParams::FILTER_ALPHANUM); + $newPassword1 = $this->getRequestVar('password1' ,RequestParams::FILTER_ALPHANUM); + $newPassword2 = $this->getRequestVar('password2' ,RequestParams::FILTER_ALPHANUM); + $token = $this->getRequestVar('user_token' ,RequestParams::FILTER_ALPHANUM); + + // Der Benutzer hat zwar ein richtiges Kennwort eingegeben, aber dieses ist abgelaufen. + // Wir versuchen hier, das neue zu setzen (sofern eingegeben). + if ( empty($newPassword1) ) + { + // Kein neues Kennwort, + // nichts zu tun... + } + else + { + $auth = new InternalAuth(); + + $passwordConfig = Configuration::subset(['security','password']); + + if ( $auth->login($loginName, $loginPassword,$token) || $auth->mustChangePassword ) + { + if ( $newPassword1 != $newPassword2 ) + { + $this->addValidationError('password1',Messages::PASSWORDS_DO_NOT_MATCH); + $this->addValidationError('password2',''); + return; + } + elseif ( strlen($newPassword1) < $passwordConfig->get('min_length',10) ) + { + $this->addValidationError('password1',Messages::PASSWORD_MINLENGTH,array('minlength'=>$passwordConfig->get('min_length',10))); + $this->addValidationError('password2',''); + return; + } + else + { + // Kennwoerter identisch und lang genug. + $user = User::loadWithName($loginName,User::AUTH_TYPE_INTERNAL); + $user->setPassword( $newPassword1,true ); + + // Das neue gesetzte Kennwort für die weitere Authentifizierung benutzen. + $loginPassword = $newPassword1; + } + } + else + { + // Anmeldung gescheitert. + $this->addNotice('user', 0, $loginName, 'LOGIN_FAILED', 'error', array('name' => $loginName)); + $this->addValidationError('login_name' ,''); + $this->addValidationError('login_password',''); + return; + } + } + + // Cookie setzen + $this->setCookie('or_username',$loginName ); + $this->setCookie('or_dbid' ,$this->getRequestVar('dbid')); + + // Jedes Authentifizierungsmodul durchlaufen, bis ein Login erfolgreich ist. + $result = AuthRunner::checkLogin('authenticate',$loginName,$loginPassword, $token ); + + $mustChangePassword = ( $result === Auth::STATUS_PW_EXPIRED ); + $tokenFailed = ( $result === Auth::STATUS_TOKEN_NEEDED ); + $loginOk = ( $result === Auth::STATUS_SUCCESS ); + + if ( $loginOk ) + { + Logger::info('Login successful for '.$loginName); + + try + { + // Benutzer über den Benutzernamen laden. + $user = User::loadWithName($loginName,User::AUTH_TYPE_INTERNAL,null); + $user->setCurrent(); + $user->updateLoginTimestamp(); + + if ($user->passwordAlgo != Password::bestAlgoAvailable() ) + // Re-Hash the password with a better hash algo. + $user->setPassword($loginPassword); + + } + catch( ObjectNotFoundException $ex ) + { + // Benutzer wurde zwar authentifiziert, ist aber in der + // internen Datenbank nicht vorhanden + if ( Configuration::subset(['security','newuser'])->is('autoadd',true ) ) + { + // Neue Benutzer in die interne Datenbank uebernehmen. + $user = new User(); + $user->name = $loginName; + $user->fullname = $loginName; + $user->add(); + $user->save(); + } + else + { + // Benutzer soll nicht angelegt werden. + // Daher ist die Anmeldung hier gescheitert. + $loginOk = false; + } + } + } + + Password::delay(); + + $ip = getenv("REMOTE_ADDR"); + + if ( !$loginOk ) + { + // Anmeldung nicht erfolgreich + + Logger::debug( TextMessage::create('login failed for user ${name} from IP ${ip}', + [ + 'name' => $loginName, + 'ip' => $ip + ] + ) ); + + if ( $tokenFailed ) + { + // Token falsch. + $this->addNotice('user', 0, $loginName, 'LOGIN_FAILED_TOKEN_FAILED', 'error'); + $this->addValidationError('user_token',''); + } + elseif ( $mustChangePassword ) + { + // Anmeldung gescheitert, Benutzer muss Kennwort ?ndern. + $this->addNotice('user', 0, $loginName, 'LOGIN_FAILED_MUSTCHANGEPASSWORD', 'error'); + $this->addValidationError('password1',''); + $this->addValidationError('password2',''); + } + else + { + // Anmeldung gescheitert. + $this->addNotice('user', 0, $loginName, 'LOGIN_FAILED', 'error', array('name' => $loginName)); + $this->addValidationError('login_name' ,''); + $this->addValidationError('login_password',''); + } + + return; + } + else + { + + Logger::debug("Login successful for user '$loginName' from IP $ip"); + + if ( $this->hasRequestVar('remember') ) + { + // Cookie setzen + $this->setCookie('or_username',$user->name ); + $this->setCookie('or_token' ,$user->createNewLoginToken() ); + } + + // Anmeldung erfolgreich. + if ( Configuration::subset('security')->is('renew_session_login',false) ) + $this->recreateSession(); + + $this->addNoticeFor( $user,Messages::LOGIN_OK, array('name' => $user->getName() )); + + $config = Session::getConfig(); + $language = new \language\Language(); + $config['language'] = $language->getLanguage($user->language); + $config['language']['language_code'] = $user->language; + Session::setConfig( $config ); + } + + } +} diff --git a/modules/cms/action/login/LoginLogoutAction.class.php b/modules/cms/action/login/LoginLogoutAction.class.php @@ -0,0 +1,32 @@ +<?php +namespace cms\action\login; +use cms\action\LoginAction; +use cms\action\Method; +use cms\base\Configuration; +use language\Messages; +use util\Session; + + +class LoginLogoutAction extends LoginAction implements Method { + public function view() { + // There is no view for this action. + } + public function post() { + if ( Configuration::subset('security')->is('renew_session_logout',false) ) + $this->recreateSession(); + + // Reading the login token cookie + list( $selector,$token ) = array_pad( explode('.',@$_COOKIE['or_token']),2,''); + + // Logout forces the removal of all login tokens + if ( $selector ) + $this->currentUser->deleteLoginToken( $selector ); + + // Cookie mit Logintoken löschen. + $this->setCookie('or_token' ,null ); + + Session::setUser(null); + + $this->addNoticeFor( $this->currentUser, Messages::LOGOUT_OK ); + } +} diff --git a/modules/cms/action/login/LoginOidcAction.class.php b/modules/cms/action/login/LoginOidcAction.class.php @@ -0,0 +1,59 @@ +<?php +namespace cms\action\login; +use cms\action\LoginAction; +use cms\action\Method; +use cms\base\Configuration; +use cms\model\User; +use Exception; +use openid_connect\OpenIDConnectClient; +use util\Session; + + +class LoginOidcAction extends LoginAction implements Method { + public function view() { + + if ( $this->hasRequestVar("id")) { + $providerName = $this->request->getRequestVar('id',RequestParams::FILTER_ALPHANUM); + Session::set(Session::KEY_OIDC_PROVIDER,$providerName); + }else { + $providerName = Session::get( Session::KEY_OIDC_PROVIDER); + } + + + $providerConfig = Configuration::subset(['security','oidc','provider',$providerName]); + + $oidc = new OpenIDConnectClient(); + $oidc->setProviderURL ( $providerConfig->get('url' )); + $oidc->setIssuer ( $providerConfig->get('url' )); + $oidc->setClientID ( $providerConfig->get('client_id' )); + $oidc->setClientSecret( $providerConfig->get('client_secret')); + + try { + $oidc->authenticate(); + $subjectIdentifier = $oidc->requestUserInfo('sub'); + + $user = User::loadWithName( $subjectIdentifier,User::AUTH_TYPE_OIDC,$providerName ); + + if ( ! $user ) { + // Create user + $user = new User(); + $user->name = $subjectIdentifier; + $user->type = User::AUTH_TYPE_OIDC; + $user->issuer = $providerName; + $user->add(); + + } + + Session::setUser( $user ); + + } catch( Exception $e) { + throw new \RuntimeException('OpenId-Connect authentication failed',0,$e); + } + + header( 'Location: ./'); + } + + + public function post() { + } +} diff --git a/modules/cms/action/login/LoginPasswordAction.class.php b/modules/cms/action/login/LoginPasswordAction.class.php @@ -0,0 +1,68 @@ +<?php +namespace cms\action\login; +use cms\action\LoginAction; +use cms\action\Method; +use cms\base\Configuration; +use cms\base\DB; +use cms\model\User; +use language\Messages; +use security\Password; +use util\exception\ValidationException; +use util\Mail; +use util\Session; + + +class LoginPasswordAction extends LoginAction implements Method { + public function view() { + // TODO: Attribut "Password" abfragen + + $this->setTemplateVar( 'dbids',$this->getSelectableDatabases() ); + + $db = DB::get(); + + if ( is_object($db) ) + $this->setTemplateVar('actdbid',$db->id); + else + $this->setTemplateVar('actdbid', Configuration::subset('database-default')->get('default-id','')); + } + + + + + + public function post() { + $username = $this->getRequestVar('username'); + if ( ! $username ) + throw new ValidationException('username'); + + $user = User::loadWithName( $username,User::AUTH_TYPE_INTERNAL ); + + Password::delay(); // Crypto-Wait + + if ( $user ) + { + srand ((double)microtime()*1000003); + $code = rand(); + $this->setSessionVar(Session::KEY_PASSWORD_COMMIT_CODE,$code); + + $eMail = new Mail( $user->mail,'password_commit_code' ); + $eMail->setVar('name',$user->getName()); + $eMail->setVar('code',$code); + if ( $eMail->send() ) + $this->addNoticeFor( new User(), Messages::MAIL_SENT); + else + // Yes, the mail is not sent but we are faking a sent mail. + // so no one is able to check if the username exists (if the mail system is down) + $this->addNoticeFor( new User(), Messages::MAIL_SENT); + + $this->setSessionVar(Session::KEY_PASSWORD_COMMIT_NAME,$user->name); + } + else + { + // There is no user with this name. + // We are faking a sending mail, so no one is able to check if this username exists. + sleep(1); + $this->addNoticeFor( new User(), Messages::MAIL_SENT); + } + } +} diff --git a/modules/cms/action/login/LoginPasswordcodeAction.class.php b/modules/cms/action/login/LoginPasswordcodeAction.class.php @@ -0,0 +1,51 @@ +<?php +namespace cms\action\login; +use cms\action\LoginAction; +use cms\action\Method; +use cms\model\User; +use util\Mail; +use util\Session; + + +class LoginPasswordcodeAction extends LoginAction implements Method { + public function view() { + + } + public function post() { + $username = $this->getSessionVar(Session::KEY_PASSWORD_COMMIT_NAME); + + if ( $this->getRequestVar("code")=='' || + $this->getSessionVar(Session::KEY_PASSWORD_COMMIT_CODE) != $this->getRequestVar("code") ) + { + $this->addValidationError('code','PASSWORDCODE_NOT_MATCH'); + return; + } + + $user = User::loadWithName( $username,User::AUTH_TYPE_INTERNAL ); + + if ( !$user->isValid() ) + { + // Benutzer konnte nicht geladen werden. + $this->addNotice('user', 0, $username, 'error', Action::NOTICE_ERROR); + return; + } + + $newPw = $user->createPassword(); // Neues Kennwort erzeugen. + + $eMail = new Mail( $user->mail,'password_new' ); + $eMail->setVar('name' ,$user->getName()); + $eMail->setVar('password',$newPw ); + + if ( $eMail->send() ) + { + $user->setPassword( $newPw, false ); // Kennwort muss beim n?. Login ge?ndert werden. + $this->addNotice('user', 0, $username, 'mail_sent', Action::NOTICE_OK); + } + else + { + // Sollte eigentlich nicht vorkommen, da der Benutzer ja auch schon den + // Code per E-Mail erhalten hat. + $this->addNotice('user', 0, $username, 'error', Action::NOTICE_ERROR, array(), $eMail->error); + } + } +} diff --git a/modules/cms/action/login/LoginRegisterAction.class.php b/modules/cms/action/login/LoginRegisterAction.class.php @@ -0,0 +1,46 @@ +<?php +namespace cms\action\login; +use cms\action\LoginAction; +use cms\action\Method; +use cms\model\User; +use language\Messages; +use util\Mail; +use util\Session; + + +class LoginRegisterAction extends LoginAction implements Method { + public function view() { + + } + public function post() { + $email_address = $this->getRequestVar('mail',RequestParams::FILTER_MAIL); + + if ( ! Mail::checkAddress($email_address) ) + { + $this->addValidationError('mail'); + return; + } + + Session::set( Session::KEY_REGISTER_MAIL,$email_address ); + + srand ((double)microtime()*1000003); + $registerCode = rand(); + + Session::set( Session::KEY_REGISTER_CODE,$registerCode ); + + + // E-Mail and die eingegebene Adresse verschicken + $mail = new Mail($email_address, + 'register_commit_code'); + $mail->setVar('code',$registerCode); // Registrierungscode als Text-Variable + + if ( $mail->send() ) + { + $this->addNoticeFor( new User(), Messages::MAIL_SENT); + } + else + { + $this->addErrorFor( new User(),Messages::MAIL_NOT_SENT, [], $mail->error); + } + } +} diff --git a/modules/cms/action/login/LoginRegistercodeAction.class.php b/modules/cms/action/login/LoginRegistercodeAction.class.php @@ -0,0 +1,70 @@ +<?php +namespace cms\action\login; +use cms\action\LoginAction; +use cms\action\Method; +use cms\base\Configuration; +use cms\base\DB; +use cms\model\User; +use language\Messages; +use util\exception\ValidationException; +use util\Session; + + +class LoginRegistercodeAction extends LoginAction implements Method { + public function view() { + $conf = Configuration::rawConfig(); + + $this->setTemplateVar( 'dbids',$this->getSelectableDatabases() ); + + $db = DB::get(); + if ( $db ) + $this->setTemplateVar('actdbid',$db->id); + else + $this->setTemplateVar('actdbid',$conf['database-defaults']['default-id']); + + + + } + + + + public function post() { + $conf = Configuration::rawConfig(); + + $origRegisterCode = Session::get( Session::KEY_REGISTER_CODE ); + $inputRegisterCode = $this->getRequestVar('code'); + + if ( $origRegisterCode != $inputRegisterCode ) + throw new ValidationException('code', Messages::CODE_NOT_MATCH ); // Validation code does not match. + + // Best?tigungscode stimmt ?berein. + // Neuen Benutzer anlegen. + + if ( !$this->hasRequestVar('username') ) + { + $this->addValidationError('username'); + return; + } + + $user = User::loadWithName( $this->getRequestVar('username'),User::AUTH_TYPE_INTERNAL ); + if ( $user ) + throw new ValidationException('username',Messages::USER_ALREADY_IN_DATABASE ); + + if ( strlen($this->getRequestVar('password')) < $conf['security']['password']['min_length'] ) + throw new ValidationException('password', Messages::PASSWORD_MINLENGTH/*,[ + 'minlength'=>$conf['security']['password']['min_length'] + ]*/); + + $newUser = new User(); + $newUser->name = $this->getRequestVar('username'); + $newUser->fullname = $newUser->name; + $newUser->add(); + + $newUser->mail = Session::get( Session::KEY_REGISTER_MAIL ); + $newUser->save(); + + $newUser->setPassword( $this->getRequestVar('password'),true ); + + $this->addNotice('user', 0, $newUser->name, 'user_added', 'ok'); + } +} diff --git a/modules/cms/action/login/LoginUserinfoAction.class.php b/modules/cms/action/login/LoginUserinfoAction.class.php @@ -0,0 +1,29 @@ +<?php +namespace cms\action\login; +use cms\action\LoginAction; +use cms\action\Method; +use util\Session; + + +class LoginUserinfoAction extends LoginAction implements Method { + + public function view() { + $user = Session::getUser(); + + $info = array('username' => $user->name, + 'fullname' => $user->fullname, + 'mail' => $user->mail, + 'telephone' => $user->tel, + 'style' => $user->style, + 'admin' => $user->isAdmin, + 'groups' => implode(',',$user->getGroups()), + 'description'=> $user->desc + ); + + $this->setTemplateVar('userinfo',$info); + } + + + public function post() { + } +} diff --git a/modules/cms/action/migrate.sh b/modules/cms/action/migrate.sh @@ -0,0 +1,50 @@ +#!/bin/bash + + +function read_section { + local id=$1 + while IFS= read -r p ; do + if [[ "$p" == *"function $id"* ]] ; then + # Read data here + while IFS= read -r p ; do + # Check for end of section - empty line + if [ "$p" = " }" -o "$p" = $'\t}' ] ; then + break + fi + # Do something with '$p' + echo "$p" + done + # Indicate section was found + return + fi + done + # Indicate section not found + return +} + + +for act in `ls -1 *Action.class.php|grep -o '^[A-Z][a-z]*'`; do + mkdir -v ${act,,} + + for mth in `grep "function " ${act}Action.class.php|grep -E -o '[A-Z]*[a-z]*(View|Post)'|grep -o '^[a-z]*'|uniq`; do + + out=${act,,}/$act${mth^}Action.class.php + touch $out + + echo "act: $act method: $mth" + + echo "<?php" > $out + echo "namespace cms\\action\\${act,,};" >> $out + echo "use cms\\action\\${act}Action;" >> $out + echo "use cms\\action\\Method;" >> $out + echo "class ${act}${mth^}Action extends ${act}Action implements Method {" >> $out + echo " public function view() {" >> $out + read_section "${mth}View" >> $out < ${act}Action.class.php + + echo " }" >> $out + echo " public function post() {" >> $out + read_section "${mth}Post" >> $out < ${act}Action.class.php + echo " }" >> $out + echo "}" >> $out + done +done+ \ No newline at end of file diff --git a/modules/cms/action/model/ModelInfoAction.class.php b/modules/cms/action/model/ModelInfoAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\action\model; +use cms\action\Method; +use cms\action\ModelAction; + + +class ModelInfoAction extends ModelAction implements Method { + + public function view() { + $this->model->load(); + + $this->setTemplateVars( $this->model->getProperties() ); + } + public function post() { + } +} diff --git a/modules/cms/action/model/ModelPropAction.class.php b/modules/cms/action/model/ModelPropAction.class.php @@ -0,0 +1,26 @@ +<?php +namespace cms\action\model; +use cms\action\Method; +use cms\action\ModelAction; +use language\Messages; + + +class ModelPropAction extends ModelAction implements Method { + + public function view() { + $this->setTemplateVar('name' ,$this->model->name ); + $this->setTemplateVar('is_default',$this->model->isDefault ); + } + + public function post() { + if ( $this->hasRequestVar('name') ) { + $this->model->name = $this->getRequestVar('name'); + $this->model->save(); + } + + if ( $this->hasRequestVar('is_default') ) + $this->model->setDefault(); + + $this->addNoticeFor( $this->model, Messages::DONE ); + } +} diff --git a/modules/cms/action/model/ModelRemoveAction.class.php b/modules/cms/action/model/ModelRemoveAction.class.php @@ -0,0 +1,25 @@ +<?php +namespace cms\action\model; +use cms\action\Method; +use cms\action\ModelAction; +use language\Messages; + + +class ModelRemoveAction extends ModelAction implements Method { + public function view() { + $this->model->load(); + + $this->setTemplateVar( 'name',$this->model->name ); + } + public function post() { + if ( $this->hasRequestVar('confirm') ) + { + $this->model->delete(); + $this->addNoticeFor( $this->model, Messages::DONE ); + } + else + { + $this->addWarningFor( $this->model, Messages::NOTHING_DONE); + } + } +} diff --git a/modules/cms/action/model/ModelSetdefaultAction.class.php b/modules/cms/action/model/ModelSetdefaultAction.class.php @@ -0,0 +1,18 @@ +<?php +namespace cms\action\model; +use cms\action\Method; +use cms\action\ModelAction; +use language\Messages; + + +class ModelSetdefaultAction extends ModelAction implements Method { + public function view() { + } + public function post() { + if ( !$this->userIsAdmin() ) exit(); + + $this->model->setDefault(); + + $this->addNoticeFor( $this->model, Messages::DONE ); + } +} diff --git a/modules/cms/action/modellist/ModellistAddAction.class.php b/modules/cms/action/modellist/ModellistAddAction.class.php @@ -0,0 +1,26 @@ +<?php +namespace cms\action\modellist; +use cms\action\Method; +use cms\action\ModellistAction; +use cms\model\Model; + +class ModellistAddAction extends ModellistAction implements Method { + public function view() { + } + + + public function post() { + $model = new Model(); + $model->projectid = $this->getRequestVar('projectid'); + $model->name = $this->getRequestVar('name'); + $model->add(); + + // Wenn kein Namen eingegeben, dann einen setzen. + if ( empty($model->name) ) + { + // Name ist "Variante <id>" + $model->name = \cms\base\Language::lang('MODEL').' '.$model->modelid; + $model->save(); + } + } +} diff --git a/modules/cms/action/modellist/ModellistEditAction.class.php b/modules/cms/action/modellist/ModellistEditAction.class.php @@ -0,0 +1,13 @@ +<?php +namespace cms\action\modellist; +use cms\action\Method; +use cms\action\ModellistAction; + +class ModellistEditAction extends ModellistAction implements Method { + public function view() { + $this->nextSubAction('show'); + } + + public function post() { + } +} diff --git a/modules/cms/action/modellist/ModellistShowAction.class.php b/modules/cms/action/modellist/ModellistShowAction.class.php @@ -0,0 +1,31 @@ +<?php +namespace cms\action\modellist; +use cms\action\Method; +use cms\action\ModellistAction; +use cms\model\Model; +use cms\model\Project; +use util\Html; + +class ModellistShowAction extends ModellistAction implements Method { + public function view() { + $project = new Project( $this->project->projectid ); + + $list = array(); + foreach( $project->getModelIds() as $id ) + { + $m = new Model( $id ); + $m->load(); + + $list[$id]['id' ] = $id; + $list[$id]['name'] = $m->name; + + $list[$id]['is_default'] = $m->isDefault; + $list[$id]['select_url'] = Html::url('index','model',$id); + } + $this->setTemplateVar( 'el',$list ); + $this->setTemplateVar( 'add',$this->userIsAdmin() ); + } + + public function post() { + } +} diff --git a/modules/cms/action/object/ObjectAclformAction.class.php b/modules/cms/action/object/ObjectAclformAction.class.php @@ -0,0 +1,120 @@ +<?php +namespace cms\action\object; +use cms\action\Action; +use cms\action\Method; +use cms\action\ObjectAction; +use cms\action\RequestParams; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\Folder; +use cms\model\Group; +use cms\model\Project; +use cms\model\User; + +class ObjectAclformAction extends ObjectAction implements Method { + public function view() { + $o = new BaseObject( $this->getRequestId() ); + $o->objectLoadRaw(); + + $this->setTemplateVars( $o->getAssocRelatedAclTypes() ); + $this->setTemplateVar( 'show',$o->getRelatedAclTypes() ); + + $this->setTemplateVar('users' ,User::listAll() ); + $this->setTemplateVar('groups' ,Group::getAll() ); + + $languages = array(0=>\cms\base\Language::lang('ALL_LANGUAGES')); + + $project = new Project( $this->baseObject->projectid ); + + $languages += $project->getLanguages(); + $this->setTemplateVar('languages',$languages ); + $this->setTemplateVar('objectid' ,$o->objectid ); + $this->setTemplateVar('action' ,$this->request->action); + } + public function post() { + $acl = new Acl(); + + $acl->objectid = $this->getRequestId(); + + // Nachschauen, ob der Benutzer ueberhaupt berechtigt ist, an + // diesem Objekt die ACLs zu aendern. + $o = new BaseObject( $acl->objectid ); + + if ( !$o->hasRight( Acl::ACL_GRANT ) ) + throw new \util\exception\SecurityException('Not allowed to insert permissions.'); // Scheiss Hacker ;) + + // Handelt es sich um eine Benutzer- oder Gruppen ACL? + switch( $this->getRequestVar('type') ) + { + case 'user': + $acl->userid = $this->getRequestVar('userid' ); + + if ( $acl->userid <= 0 ) + { + $this->addValidationError('type' ); + $this->addValidationError('userid',''); + $this->callSubAction('aclform'); + return; + } + break; + case 'group': + $acl->groupid = $this->getRequestVar('groupid'); + if ( $acl->groupid <= 0 ) + { + $this->addValidationError('type' ); + $this->addValidationError('groupid',''); + $this->callSubAction('aclform'); + return; + } + break; + case 'all': + break; + default: + $this->addValidationError('type'); + $this->callSubAction('aclform'); + return; + } + + $acl->languageid = $this->getRequestVar(RequestParams::PARAM_LANGUAGE_ID); + + $acl->write = ( $this->hasRequestVar('write' ) ); + $acl->prop = ( $this->hasRequestVar('prop' ) ); + $acl->delete = ( $this->hasRequestVar('delete' ) ); + $acl->release = ( $this->hasRequestVar('release' ) ); + $acl->publish = ( $this->hasRequestVar('publish' ) ); + $acl->create_folder = ( $this->hasRequestVar('create_folder') ); + $acl->create_file = ( $this->hasRequestVar('create_file' ) ); + $acl->create_link = ( $this->hasRequestVar('create_link' ) ); + $acl->create_page = ( $this->hasRequestVar('create_page' ) ); + $acl->grant = ( $this->hasRequestVar('grant' ) ); + $acl->transmit = ( $this->hasRequestVar('transmit' ) ); + + $acl->add(); + + // Falls die Berechtigung vererbbar ist, dann diese sofort an + // Unterobjekte vererben. + if ( $acl->transmit ) + { + $folder = new Folder( $acl->objectid ); + $oids = $folder->getObjectIds(); + foreach( $folder->getAllSubfolderIds() as $sfid ) + { + $subfolder = new Folder( $sfid ); + $oids = array_merge($oids,$subfolder->getObjectIds()); + } + + foreach( $oids as $oid ) + { + $acl->objectid = $oid; + $acl->add(); + } + } + + + + + $this->addNotice('', 0, '', 'ADDED', Action::NOTICE_OK); + + $o->setTimestamp(); + } +} diff --git a/modules/cms/action/object/ObjectCopyAction.class.php b/modules/cms/action/object/ObjectCopyAction.class.php @@ -0,0 +1,176 @@ +<?php +namespace cms\action\object; +use cms\action\Action; +use cms\action\Method; +use cms\action\ObjectAction; +use cms\action\RequestParams; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\File; +use cms\model\Folder; +use cms\model\Link; +use cms\model\Page; + + +class ObjectCopyAction extends ObjectAction implements Method { + public function view() { + $sourceObject = new BaseObject( $this->getRequestId()); + $sourceObject->load(); + + $targetFolder = new BaseObject( $this->getRequestVar('targetFolderId',RequestParams::FILTER_NUMBER)); + $targetFolder->load(); + + $this->setTemplateVar('source' ,$sourceObject->getProperties() ); + $this->setTemplateVar('sourceId',$sourceObject->objectid ); + $this->setTemplateVar('target' ,$targetFolder->getProperties() ); + $this->setTemplateVar('targetId',$targetFolder->objectid ); + $this->setTemplateVar('types' ,array('move'=>'move','moveandlink'=>'moveandlink','copy'=>'copy','link'=>'link') ); + + if ( ! $targetFolder->hasRight(Acl::ACL_WRITE) ) + { + $this->addNotice('folder', 0, $targetFolder->name, 'NOT_WRITABLE', Action::NOTICE_ERROR); + } + } + public function post() { + $type = $this->getRequestVar('type'); + $targetObjectId = $this->getRequestVar('targetid',RequestParams::FILTER_NUMBER); + $sourceObjectId = $this->getRequestVar('sourceid',RequestParams::FILTER_NUMBER); + + $sourceObject = new BaseObject( $sourceObjectId ); + $sourceObject->load(); + + $targetFolder = new BaseObject( $targetObjectId ); + $targetFolder->load(); + + // Prüfen, ob Schreibrechte im Zielordner bestehen. + if ( ! $targetFolder->hasRight(Acl::ACL_WRITE) ) + { + $this->addNotice('folder', 0, $targetFolder->name, 'NOT_WRITABLE', Action::NOTICE_ERROR); + return; + } + + switch( $type ) + { + case 'move': + + if ( $sourceObject->isFolder ) + { + $f = new Folder( $sourceObjectId ); + $allsubfolders = $f->getAllSubFolderIds(); + + // Plausibilisierungsprüfung: + // + // Wenn + // - Das Zielverzeichnis sich nicht in einem Unterverzeichnis des zu verschiebenen Ordners liegt + // und + // - Das Zielverzeichnis nicht der zu verschiebene Ordner ist + // dann verschieben + if ( in_array($targetObjectId,$allsubfolders) || $sourceObjectId == $targetObjectId ) + { + $this->addNotice('folder', 0, $sourceObject->name, 'ERROR', Action::NOTICE_ERROR); + return; + } + } + + // TODO: + // Beim Verschieben und Kopieren muss im Zielordner die Berechtigung + // zum Erstellen von Ordner, Dateien oder Seiten vorhanden sein. + $sourceObject->setParentId( $targetObjectId ); + $this->addNotice($sourceObject->type, 0, $sourceObject->name, 'moved'); + break; + + case 'moveandlink': + + $oldParentId = $sourceObject->parentid; + + $sourceObject->setParentId( $targetObjectId ); + $this->addNotice($sourceObject->type, 0, $sourceObject->name, 'moved'); + + $link = new Link(); + $link->parentid = $oldParentId; + $link->name = \cms\base\Language::lang('LINK_TO').' '.$sourceObject->name; + $link->filename = $sourceObject->filename; + $link->linkedObjectId = $sourceObjectId; + $link->add(); + $this->addNotice('link', 0, $link->name, 'added'); + + break; + + case 'copy': + + switch( $sourceObject->getType() ) + { + case 'folder': + // Ordner zur Zeit nicht kopieren + // Funktion waere zu verwirrend + $this->addNotice($sourceObject->getType(), 0, $sourceObject->name, 'CANNOT_COPY_FOLDER', 'error'); + break; + + case 'file': + $f = new File( $sourceObjectId ); + $f->load(); + $f->filename = ''; + $f->name = \cms\base\Language::lang('COPY_OF').' '.$f->name; + $f->parentid = $targetObjectId; + $f->add(); + $f->copyValueFromFile( $sourceObjectId ); + + $this->addNotice($sourceObject->getType(), 0, $sourceObject->name, 'COPIED', 'ok'); + break; + + case 'page': + $p = new Page( $sourceObjectId ); + $p->load(); + $p->filename = ''; + $p->name = \cms\base\Language::lang('COPY_OF').' '.$p->name; + $p->parentid = $targetObjectId; + $p->add(); + $p->copyValuesFromPage( $sourceObjectId ); + $this->addNotice($sourceObject->getType(), 0, $sourceObject->name, 'COPIED', 'ok'); + break; + + case 'link': + $l = new Link( $sourceObjectId ); + $l->load(); + $l->filename = ''; + $l->name = \cms\base\Language::lang('COPY_OF').' '.$l->name; + $l->parentid = $targetObjectId; + $l->add(); + $this->addNotice($sourceObject->getType(), 0, $sourceObject->name, 'COPIED', 'ok'); + break; + + default: + throw new \LogicException('fatal: unknown type while deleting'); + } + break; + + case 'link': + + // Beim Verkn�pfen muss im Zielordner die Berechtigung zum Erstellen + // von Verkn�pfungen vorhanden sein. + if ( ! $targetFolder->hasRight(Acl::ACL_CREATE_LINK) ) + { + $this->addNotice('folder', 0, $targetFolder->name, 'NOT_WRITABLE', Action::NOTICE_ERROR); + return; + } + + $link = new Link(); + $link->parentid = $targetObjectId; + $link->name = \cms\base\Language::lang('LINK_TO').' '.$sourceObject->name; + $link->filename = $sourceObject->filename; + $link->linkedObjectId = $sourceObjectId; + $link->isLinkToObject = true; + $link->add(); + $this->addNotice('link', 0, $link->name, 'added'); + // OK + break; + + default: + throw new \LogicException('Unknown type for copying'); + break; + } + + $targetFolder->setTimestamp(); + + } +} diff --git a/modules/cms/action/object/ObjectDelaclAction.class.php b/modules/cms/action/object/ObjectDelaclAction.class.php @@ -0,0 +1,28 @@ +<?php +namespace cms\action\object; +use cms\action\Action; +use cms\action\Method; +use cms\action\ObjectAction; +use cms\model\Acl; +use cms\model\BaseObject; +use util\Http; + +class ObjectDelaclAction extends ObjectAction implements Method { + public function view() { + } + public function post() { + $acl = new Acl($this->getRequestVar('aclid')); + $acl->load(); + + // Nachschauen, ob der Benutzer ueberhaupt berechtigt ist, an + // diesem Objekt die ACLs zu aendern. + $o = new BaseObject( $acl->objectid ); + + if ( !$o->hasRight( Acl::ACL_GRANT ) ) + Http::notAuthorized('no grant rights'); // Da wollte uns wohl einer vereimern. + + $acl->delete(); // Weg mit der ACL + + $this->addNotice('', 0, '', 'DELETED', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/object/ObjectInfoAction.class.php b/modules/cms/action/object/ObjectInfoAction.class.php @@ -0,0 +1,66 @@ +<?php +namespace cms\action\object; +use cms\action\Method; +use cms\action\ObjectAction; +use cms\model\BaseObject; +use util\ArrayUtils; + +class ObjectInfoAction extends ObjectAction implements Method { + public function view() { + $this->setTemplateVars( $this->baseObject->getProperties() ); + + $this->setTemplateVar( 'is_valid' ,$this->baseObject->isValid() ); + $this->setTemplateVar( 'full_filename',$this->baseObject->full_filename() ); + $this->setTemplateVar( 'extension' , '' ); + $this->setTemplateVar( 'mimetype' , $this->baseObject->mimeType() ); + + $this->setTemplateVar( 'name' , $this->baseObject->getDefaultName()->name ); + $this->setTemplateVar( 'description' , $this->baseObject->getDefaultName()->description ); + + $languages = $this->baseObject->getProject()->getLanguages(); + $languagesVars = array(); + + foreach( $languages as $languageId => $languageName ) + { + $name = $this->baseObject->getNameForLanguage( $languageId ); + + + $languagesVar = [ + 'name' => $name->name, + 'description' => $name->description, + 'languagename' => $languageName, + 'languageid' => $languageId, + ]; + + $languagesVars[] = $languagesVar; + } + + $this->setTemplateVar('languages',$languagesVars ); + + // Read all objects linking to us. + $pages = $this->baseObject->getDependentObjectIds(); + + $list = array(); + foreach( $pages as $languageid ) + { + $o = new BaseObject( $languageid ); + $o->load(); + $list[$languageid] = array(); + $list[$languageid]['name'] = $o->filename; + $list[$languageid]['type'] = $o->getType(); + } + + asort( $list ); + + $this->setTemplateVar('pages',$list); + + $this->setTemplateVar('size',number_format($this->baseObject->getSize()/1000,0,',','.').' kB' ); + + $pad = str_repeat("\xC2\xA0",5); // Hard spaces + $totalSettings = $this->baseObject->getTotalSettings(); + $this->setTemplateVar('total_settings', $totalSettings,$pad ); + $this->setTemplateVar('settings', ArrayUtils::dryFlattenArray( $totalSettings,$pad ) ); + } + public function post() { + } +} diff --git a/modules/cms/action/object/ObjectInheritAction.class.php b/modules/cms/action/object/ObjectInheritAction.class.php @@ -0,0 +1,79 @@ +<?php +namespace cms\action\object; +use cms\action\Action; +use cms\action\Method; +use cms\action\ObjectAction; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\Folder; +use logger\Logger; +use util\Session; + +class ObjectInheritAction extends ObjectAction implements Method { + public function view() { + $o = new BaseObject( $this->getRequestId() ); + $o->objectLoadRaw(); + $this->setTemplateVar( 'type',$o->getType() ); + + $acllist = array(); + $this->setTemplateVar('acls',$acllist ); + } + public function post() { + Session::close(); + + $folder = new Folder( $this->getRequestId() ); + $folder->load(); + + if ( ! $this->hasRequestVar('inherit') ) + { + $this->addNotice('folder', 0, $folder->name, 'NOTHING_DONE', Action::NOTICE_WARN); + return; + } + + + $aclids = $folder->getAllAclIds(); + + $newAclList = array(); + foreach( $aclids as $aclid ) + { + $acl = new Acl( $aclid ); + $acl->load(); + if ( $acl->transmit ) + $newAclList[] = $acl; + } + Logger::debug('inheriting '.count($newAclList).' acls'); + + $oids = $folder->getObjectIds(); + + foreach( $folder->getAllSubfolderIds() as $sfid ) + { + $subfolder = new Folder( $sfid ); + + $oids = array_merge($oids,$subfolder->getObjectIds()); + } + + foreach( $oids as $oid ) + { + $object = new BaseObject( $oid ); + + // Die alten ACLs des Objektes löschen. + foreach( $object->getAllAclIds() as $aclid ) + { + $acl = new Acl( $aclid ); + $acl->objectid = $oid; + $acl->delete(); + Logger::debug('removing acl '.$aclid.' for object '.$oid); + } + + // Vererbbare ACLs des aktuellen Ordners anwenden. + foreach( $newAclList as $newAcl ) + { + $newAcl->objectid = $oid; + $newAcl->add(); + Logger::debug('adding new acl '.$newAcl->aclid.' for object '.$oid); + } + } + + $this->addNotice('folder', 0, $folder->name, 'SAVED', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/object/ObjectNameAction.class.php b/modules/cms/action/object/ObjectNameAction.class.php @@ -0,0 +1,34 @@ +<?php +namespace cms\action\object; +use cms\action\Method; +use cms\action\ObjectAction; +use cms\model\Language; +use language\Messages; +use util\exception\ValidationException; + + +class ObjectNameAction extends ObjectAction implements Method { + public function view() { + $name = $this->baseObject->getNameForLanguage( $this->getRequestId('languageid') ); + + $nameProps = $name->getProperties(); + + $language = new Language( $name->languageid ); + $language->load(); + $nameProps[ 'languageName' ] = $language->name; + $this->setTemplateVars( $nameProps ); + } + public function post() { + if ( ! $this->hasRequestVar('name' ) ) + throw new ValidationException('name'); + + $name = $this->baseObject->getNameForLanguage( $this->getRequestId('languageid')); + + $name->name = $this->getRequestVar( 'name' ); + $name->description = $this->getRequestVar( 'description' ); + + $name->save(); + + $this->addNoticeFor($this->baseObject, Messages::SAVED); + } +} diff --git a/modules/cms/action/object/ObjectPropAction.class.php b/modules/cms/action/object/ObjectPropAction.class.php @@ -0,0 +1,50 @@ +<?php +namespace cms\action\object; +use cms\action\Method; +use cms\action\ObjectAction; +use cms\action\RequestParams; +use cms\model\BaseObject; +use cms\model\Project; +use util\exception\ValidationException; + + +class ObjectPropAction extends ObjectAction implements Method { + + public function view() { + $this->setTemplateVar( 'filename', $this->baseObject->filename ); + $alias = $this->baseObject->getAliasForLanguage(null ); + $this->setTemplateVar( 'alias_filename', $alias->filename ); + $this->setTemplateVar( 'alias_folderid', $alias->parentid ); + + $project = Project::create( $this->baseObject->projectid ); + $this->setTemplateVar( 'folders' , $project->getAllFlatFolders() ); + } + + + public function post() { + if ( ! $this->hasRequestVar('filename' ) ) + throw new ValidationException('filename'); + + $this->baseObject->filename = BaseObject::urlify( $this->getRequestVar('filename') ); + $this->baseObject->save(); + + $alias = $this->baseObject->getAliasForLanguage(null); + $alias->filename = BaseObject::urlify( $this->getRequestVar( 'alias_filename') ); + $alias->parentid = $this->getRequestId('alias_folderid'); + + // If no alias, remove the alias + if ( ! $alias->filename ) + $alias->delete(); + else + $alias->save(); + + + // Should we do this? + if ( $this->hasRequestVar('creationTimestamp') && $this->userIsAdmin() ) + $this->baseObject->createDate = $this->getRequestVar('creationTimestamp',RequestParams::FILTER_NUMBER); + $this->baseObject->setCreationTimestamp(); + + + $this->addNotice($this->baseObject->getType(), 0, $this->baseObject->filename, 'PROP_SAVED', 'ok'); + } +} diff --git a/modules/cms/action/object/ObjectRightsAction.class.php b/modules/cms/action/object/ObjectRightsAction.class.php @@ -0,0 +1,36 @@ +<?php +namespace cms\action\object; +use cms\action\Method; +use cms\action\ObjectAction; +use cms\model\Acl; +use cms\model\BaseObject; + + +class ObjectRightsAction extends ObjectAction implements Method { + + public function view() { + $o = new BaseObject( $this->getRequestId() ); + $o->objectLoadRaw(); + $this->setTemplateVar( 'show',$o->getRelatedAclTypes() ); + $this->setTemplateVar( 'type',$o->getType() ); + + $acllist = array(); + + + foreach( $o->getAllAclIds() as $aclid ) + { + $acl = new Acl( $aclid ); + $acl->load(); + $key = 'bu'.$acl->username.'g'.$acl->groupname.'a'.$aclid; + $acllist[$key] = $acl->getProperties(); + $acllist[$key]['aclid'] = $aclid; + } + ksort( $acllist ); + + $this->setTemplateVar('acls',$acllist ); + + $this->setTemplateVars( $o->getAssocRelatedAclTypes() ); + } + public function post() { + } +} diff --git a/modules/cms/action/object/ObjectSettingsAction.class.php b/modules/cms/action/object/ObjectSettingsAction.class.php @@ -0,0 +1,48 @@ +<?php +namespace cms\action\object; +use cms\action\Action; +use cms\action\Method; +use cms\action\ObjectAction; +use util\exception\ValidationException; + + +class ObjectSettingsAction extends ObjectAction implements Method { + public function view() { + $this->setTemplateVar('settings',$this->baseObject->settings); + + $this->setTemplateVar( 'valid_from_date' ,$this->baseObject->validFromDate==null?'':date('Y-m-d',$this->baseObject->validFromDate) ); + $this->setTemplateVar( 'valid_from_time' ,$this->baseObject->validFromDate==null?'':date('H:i' ,$this->baseObject->validFromDate) ); + $this->setTemplateVar( 'valid_until_date',$this->baseObject->validToDate ==null?'':date('Y-m-d',$this->baseObject->validToDate ) ); + $this->setTemplateVar( 'valid_until_time',$this->baseObject->validToDate ==null?'':date('H:i' ,$this->baseObject->validToDate ) ); + } + + + public function post() { + $this->baseObject->settings = $this->getRequestVar( 'settings'); + + // Validate YAML-Settings + try { + \util\YAML::parse( $this->baseObject->settings); + } + catch( \Exception $e ) + { + throw new ValidationException( 'settings' ); + } + + // Gültigkeitszeiträume speichern. + if ($this->hasRequestVar( 'valid_from_date' )) + $this->baseObject->validFromDate = strtotime( $this->getRequestVar( 'valid_from_date' ).' '.$this->getRequestVar( 'valid_from_time' ) ); + else + $this->baseObject->validFromDate = null; + + if ($this->hasRequestVar( 'valid_until_date')) + $this->baseObject->validToDate = strtotime( $this->getRequestVar( 'valid_until_date').' '.$this->getRequestVar( 'valid_until_time') ); + else + $this->baseObject->validToDate = null; + + + $this->baseObject->save(); + + $this->addNotice($this->baseObject->getType(), 0, $this->baseObject->filename, 'SAVED', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/page/PageChangetemplateAction.class.php b/modules/cms/action/page/PageChangetemplateAction.class.php @@ -0,0 +1,37 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\model\Project; +use cms\model\Template; +use util\Html; + +class PageChangetemplateAction extends PageAction implements Method { + public function view() { + $this->page->load(); + + + $this->setTemplateVars( $this->page->getProperties() ); + + if ( $this->userIsAdmin() ) + { + $this->setTemplateVar('template_url',Html::url('template','show',$this->page->templateid)); + } + + $template = new Template( $this->page->templateid ); + $template->load(); + $this->setTemplateVar('template_name',$template->name); + + $templates = Array(); + $project = new Project( $this->page->projectid ); + foreach( $project->getTemplates() as $id=>$name ) + { + if ( $id != $this->page->templateid ) + $templates[$id]=$name; + } + $this->setTemplateVar('templates',$templates); + } + + public function post() { + } +} diff --git a/modules/cms/action/page/PageChangetemplateselectelementsAction.class.php b/modules/cms/action/page/PageChangetemplateselectelementsAction.class.php @@ -0,0 +1,75 @@ +<?php +namespace cms\action\page; +use cms\action\Action; +use cms\action\Method; +use cms\action\PageAction; +use cms\model\Element; +use cms\model\Template; + +class PageChangetemplateselectelementsAction extends PageAction implements Method { + + public function view() { + $newTemplateId = $this->getRequestVar( 'newtemplateid' ); + + if ( $newTemplateId != 0 ) + { + $this->setTemplateVar('newtemplateid',$newTemplateId ); + + $oldElements = array(); + $oldTemplate = new Template( $this->page->templateid ); + $newTemplate = new Template( $newTemplateId ); + + foreach( $oldTemplate->getElementIds() as $elementid ) + { + $e = new Element( $elementid ); + $e->load(); + + if ( !$e->isWritable() ) + continue; + + $oldElement = array(); + $oldElement['name'] = $e->name.' - '.\cms\base\Language::lang('EL_'.$e->type ); + $oldElement['id' ] = $e->elementid; + + $newElements = Array(); + $newElements[0] = \cms\base\Language::lang('ELEMENT_DELETE_VALUES'); + + foreach( $newTemplate->getElementIds() as $newelementid ) + { + $ne = new Element( $newelementid ); + $ne->load(); + + // Nur neue Elemente anbieten, deren Typ identisch ist + if ( $ne->type == $e->type ) + $newElements[$newelementid] = \cms\base\Language::lang('ELEMENT').': '.$ne->name.' - '.\cms\base\Language::lang('EL_'.$e->type ); + } + $oldElement['newElementsName'] = 'from'.$e->elementid; + $oldElement['newElementsList'] = $newElements; + $oldElements[$elementid] = $oldElement; + } + $this->setTemplateVar('elements',$oldElements ); + } + else + { + $this->callSubAction('prop'); + } + } + + + public function post() { + $newTemplateId = $this->getRequestVar('newtemplateid'); + $replaceElementMap = Array(); + + $oldTemplate = new Template( $this->page->templateid ); + foreach( $oldTemplate->getElementIds() as $elementid ) + $replaceElementMap[$elementid] = $this->getRequestVar('from'.$elementid); + + if ( $newTemplateId != 0 ) + { + $this->page->replaceTemplate( $newTemplateId,$replaceElementMap ); + $this->addNotice('page', 0, $this->page->name, 'SAVED', Action::NOTICE_OK); + } + else + $this->addNotice('page', 0, $this->page->name, 'NOT_SAVED', Action::NOTICE_WARN); + } +} diff --git a/modules/cms/action/page/PageEditAction.class.php b/modules/cms/action/page/PageEditAction.class.php @@ -0,0 +1,185 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\Element; +use cms\model\Folder; +use cms\model\Page; +use cms\model\Project; +use cms\model\Template; +use cms\model\Value; + +class PageEditAction extends PageAction implements Method { + public function view() { + $template = new Template( $this->page->templateid ); + $template->load(); + + /** @var Element[] $elements */ + $elements = $template->getElements(); + + $elements = array_filter(/** + * @param $element Element + * @return Element + */ $elements, function($element ) { + return $element->isWritable(); + } ); + + $elements = array_map( function( $element ) { + return get_object_vars( $element ) + array('pageelementid'=>$this->page->id.'_'.$element->elementid,'typename'=>$element->getTypeName() ); + }, $elements); + + $this->setTemplateVar('elements',$elements); + } + + public function post() { + $value = new Value(); + $value->languageid = $this->page->languageid; + $value->objectid = $this->page->objectid; + $value->pageid = Page::getPageIdFromObjectId( $this->page->objectid ); + + if ( ! $this->hasRequestVar('elementid') ) + $this->addValidationError('elementid' ); + + $value->element = new Element( $this->getRequestVar('elementid') ); + + $value->element->load(); + $value->load(); + + $value->number = $this->getRequestVar('number') * pow(10,$value->element->decimals); + $value->linkToObjectId = intval($this->getRequestVar('linkobjectid')); + $value->text = $this->getRequestVar('text'); + + // Vorschau anzeigen + if ( $value->element->type=='longtext' && ($this->hasRequestVar('preview')||$this->hasRequestVar('addmarkup')) ) + { + /* + if ( $this->hasRequestVar('preview') ) + { + $value->page = $this->page; + $value->simple = false; + $value->page->languageid = $value->languageid; + $value->page->load(); + $value->generate(); + $this->setTemplateVar('preview_text',$value->value ); + }*/ + + if ( $this->hasRequestVar('addmarkup') ) + { + $addText = $this->getRequestVar('addtext'); + + if ( !empty($addText) ) // Nur, wenn ein Text eingegeben wurde + { + $addText = $this->getRequestVar('addtext'); + + if ( $this->hasRequestVar('strong') ) + $value->text .= '*'.$addText.'*'; + + if ( $this->hasRequestVar('emphatic') ) + $value->text .= '_'.$addText.'_'; + + if ( $this->hasRequestVar('link') ) + $value->text .= '"'.$addText.'"->"'.$this->getRequestVar('objectid').'"'; + } + + if ( $this->hasRequestVar('table') ) + $value->text .= "|$addText | |\n|$addText | |\n|$addText | |\n"; + + if ( $this->hasRequestVar('list') ) + $value->text .= "\n- ".$addText."\n".'- '.$addText."\n".'- '.$addText."\n"; + + if ( $this->hasRequestVar('numlist') ) + $value->text .= "\n# ".$addText."\n".'# '.$addText."\n".'# '.$addText."\n"; + + if ( $this->hasRequestVar('image') ) + $value->text .= '{'.$this->getRequestVar('objectid').'}'; + } + + // Ermitteln aller verlinkbaren Objekte (fuer Editor) + $objects = array(); + + foreach( Folder::getAllObjectIds() as $id ) + { + $o = new BaseObject( $id ); + $o->load(); + + if ( $o->getType() != 'folder' ) + { + $f = new Folder( $o->parentid ); + $objects[ $id ] = \cms\base\Language::lang( ''.$o->getType() ).': '; + $objects[ $id ] .= implode( \util\Text::FILE_SEP,$f->parentObjectNames(false,true) ); + $objects[ $id ] .= \util\Text::FILE_SEP.$o->name; + } + } + asort($objects); + $this->setTemplateVar( 'objects' ,$objects ); + + $this->setTemplateVar( 'release' ,$this->page->hasRight(Acl::ACL_RELEASE) ); + $this->setTemplateVar( 'publish' ,$this->page->hasRight(Acl::ACL_PUBLISH) ); + $this->setTemplateVar( 'html' ,$value->element->html ); + $this->setTemplateVar( 'wiki' ,$value->element->wiki ); + $this->setTemplateVar( 'text' ,$value->text ); + $this->setTemplateVar( 'name' ,$value->element->name ); + $this->setTemplateVar( 'desc' ,$value->element->desc ); + $this->setTemplateVar( 'objectid',$this->page->objectid ); + return; + } + + if ( $this->hasRequestVar('year') ) // Wird ein Datum gespeichert? + { + // Wenn ein ANSI-Datum eingegeben wurde, dann dieses verwenden + if ( $this->getRequestVar('ansidate') != $this->getRequestVar('ansidate_orig') ) + $value->date = strtotime($this->getRequestVar('ansidate') ); + else + // Sonst die Zeitwerte einzeln zu einem Datum zusammensetzen + $value->date = mktime( $this->getRequestVar('hour' ), + $this->getRequestVar('minute'), + $this->getRequestVar('second'), + $this->getRequestVar('month' ), + $this->getRequestVar('day' ), + $this->getRequestVar('year' ) ); + } + else $value->date = 0; // Datum nicht gesetzt. + + $value->text = $this->getRequestVar('text'); + + $value->page = new Page( $value->objectid ); + $value->page->load(); + + // Inhalt sofort freigegeben, wenn + // - Recht vorhanden + // - Freigabe gewuenscht + if ( $value->page->hasRight( Acl::ACL_RELEASE ) && $this->getRequestVar('release')!='' ) + $value->publish = true; + else + $value->publish = false; + + // Inhalt speichern + + // Wenn Inhalt in allen Sprachen gleich ist, dann wird der Inhalt + // fuer jede Sprache einzeln gespeichert. + if ( $value->element->allLanguages ) + { + $project = new Project( $this->page->projectid ); + foreach( $project->getLanguageIds() as $languageid ) + { + $value->languageid = $languageid; + $value->save(); + } + } + else + { + // sonst nur 1x speichern (fuer die aktuelle Sprache) + $value->save(); + } + + $this->page->setTimestamp(); // "Letzte Aenderung" setzen + + // Falls ausgewaehlt die Seite sofort veroeffentlichen + if ( $this->hasRequestVar('publish') ) + $this->callSubAction( 'pubnow' ); // Weiter zum veroeffentlichen + else + $this->callSubAction( 'el' ); // Element-Liste anzeigen + } +} diff --git a/modules/cms/action/page/PageFormAction.class.php b/modules/cms/action/page/PageFormAction.class.php @@ -0,0 +1,180 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\Element; +use cms\model\Folder; +use cms\model\Page; +use cms\model\Project; +use cms\model\Value; + +class PageFormAction extends PageAction implements Method { + + + public function view() { + $list = array(); + + foreach( $this->page->values as $id=>$value ) + { + if ( $value->element->isWritable() ) + { + $list[$id] = array(); + $list[$id]['name'] = $value->element->name; + $list[$id]['desc'] = $value->element->desc; + $list[$id]['type'] = $value->element->type; + $list[$id]['id' ] = 'id'.$value->element->elementid; + $list[$id]['saveid'] = 'saveid'.$value->element->elementid; + + switch( $value->element->type ) + { + case 'text': + case 'longtext': + $list[$id]['value'] = $value->text; + break; + + case 'date': + $list[$id]['value'] = date( 'Y-m-d H:i:s',$value->date ); + break; + + case 'number': + $list[$id]['value'] = $value->number / pow(10,$value->element->decimals); + break; + + case 'select': + $list[$id]['list' ] = $value->element->getSelectItems(); + $list[$id]['value'] = $value->text; + break; + + case 'link': + $objects = array(); + + foreach( Folder::getAllObjectIds() as $oid ) + { + $o = new BaseObject( $oid ); + $o->load(); + + if ( $o->getType() != 'folder' ) + { + $f = new Folder( $o->parentid ); + $f->load(); + + $objects[ $oid ] = \cms\base\Language::lang( $o->getType() ).': '; + $objects[ $oid ] .= implode( ' &raquo; ',$f->parentObjectNames(false,true) ); + $objects[ $oid ] .= ' &raquo; '.$o->name; + } + } + + asort( $objects ); // Sortieren + + $list[$id]['list' ] = $objects; + $list[$id]['value'] = $value->linkToObjectId; + break; + + case 'list': + $objects = array(); + foreach( Folder::getAllFolders() as $oid ) + { + $f = new Folder( $oid ); + $f->load(); + + $objects[ $oid ] = \cms\base\Language::lang( $f->getType() ).': '; + $objects[ $oid ] .= implode( ' &raquo; ',$f->parentObjectNames(false,true) ); + } + + asort( $objects ); // Sortieren + + $this->setTemplateVar('list' ,$objects); + $this->setTemplateVar('value',$this->value->linkToObjectId); + + break; + } + } + } + + $this->setTemplateVar( 'release',$this->page->hasRight(Acl::ACL_RELEASE) ); + $this->setTemplateVar( 'publish',$this->page->hasRight(Acl::ACL_PUBLISH) ); + + $this->setTemplateVar('el',$list); + } + + + public function post() { + foreach( $this->page->getElements() as $elementid=>$name ) + { + if ( $this->hasRequestVar('saveid'.$elementid) ) + { + $value = new Value(); + $value->objectid = $this->page->objectid; + $value->pageid = Page::getPageIdFromObjectId( $value->objectid ); + $value->element = new Element( $elementid ); + $value->element->load(); + $value->load(); + + // Eingegebenen Inhalt aus dem Request lesen + $inhalt = $this->getRequestVar( 'id'.$elementid ); + + // Den Inhalt speichern. + switch( $value->element->type ) + { + case 'number': + $value->number = $inhalt * pow(10,$value->element->decimals); + break; + + case 'date': + $value->date = strtotime( $inhalt ); + break; + + case 'text': + case 'longtext': + case 'select': + $value->text = $inhalt; + break; + + case 'link': + case 'list': + case 'insert': + $value->linkToObjectId = intval($inhalt); + break; + } + + $value->page = &$this->page; + + // Ermitteln, ob Inhalt sofort freigegeben werden kann und soll + if ( $this->page->hasRight( Acl::ACL_RELEASE ) && $this->hasRequestVar('release') ) + $value->publish = true; + else + $value->publish = false; + +// Html::debug($inhalt,'Eingabe'); +// Html::debug($value,'Inhalt'); + + // Inhalt speichern. + // Inhalt in allen Sprachen gleich? + if ( $value->element->allLanguages ) + { + // Inhalt fuer jede Sprache einzeln speichern. + $p = new Project(); + foreach( $p->getLanguageIds() as $languageid ) + { + $value->languageid = $languageid; + $value->save(); + } + } + else + { + // sonst nur 1x speichern (fuer die aktuelle Sprache) + $value->languageid = $this->getRequestVar(RequestParams::PARAM_LANGUAGE_ID); + $value->save(); + } + } + } + $this->page->setTimestamp(); // "Letzte Aenderung" setzen + + if ( $this->hasRequestVar('publish') ) + $this->callSubAction( 'pubnow' ); + else + $this->callSubAction( 'el' ); + } +} diff --git a/modules/cms/action/page/PageInfoAction.class.php b/modules/cms/action/page/PageInfoAction.class.php @@ -0,0 +1,55 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\generator\PageGenerator; +use cms\generator\Producer; +use cms\model\Template; + +class PageInfoAction extends PageAction implements Method { + public function view() { + $this->setTemplateVar('id',$this->page->objectid); + + parent::infoView(); + $this->page->load(); + + $this->setTemplateVars( $this->page->getProperties() ); + + $alias = $this->page->getAliasForLanguage(null); + $this->setTemplateVar( 'alias', $alias->full_filename() ); + + $languages = $this->page->getProject()->getLanguages(); + $languagesVars = array(); + + foreach( $languages as $id => $name ) + { + $this->page->languageid = $id; + $this->page->load(); + + $languagesVar = $this->page->getProperties(); + $languagesVar['languagename'] = $name; + $languagesVar['languageid' ] = $id; + $alias = $this->page->getAliasForLanguage( $id ); + $languagesVar['alias' ] = $alias->full_filename(); + + $languagesVars[] = $languagesVar; + } + + $this->setTemplateVar('languages',$languagesVars ); + + if ( $this->userIsProjectAdmin() ) + { + $this->setTemplateVar('templateid',$this->page->templateid); + } + + $template = new Template( $this->page->templateid ); + $template->load(); + $this->setTemplateVar('template_name',$template->name ); + + $generator = new PageGenerator( $this->createPageContext( Producer::SCHEME_PUBLIC) ); + + $this->setTemplateVar('tmp_filename' ,$generator->getPublicFilename() ); + } + public function post() { + } +} diff --git a/modules/cms/action/page/PageNameAction.class.php b/modules/cms/action/page/PageNameAction.class.php @@ -0,0 +1,46 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\model\BaseObject; +use cms\model\Project; + +class PageNameAction extends PageAction implements Method { + public function view() { + $languageId = $this->getRequestVar('languageid'); + + $name = $this->page->getNameForLanguage($languageId); + + $this->setTemplateVars( $name->getProperties() ); + + $alias = $this->page->getAliasForLanguage( $languageId ); + + $this->setTemplateVar( 'alias_filename', $alias->filename ); + $this->setTemplateVar( 'alias_folderid', $alias->parentid ); + + $project = Project::create( $this->page->projectid ); + $this->setTemplateVar( 'folders' , $project->getAllFlatFolders() ); + } + public function post() { + + parent::namePost(); // Save name and description + + $alias = $this->page->getAliasForLanguage( $this->getRequestId('languageid')); + + $alias->filename = BaseObject::urlify( $this->getRequestVar( 'alias_filename') ); + $alias->parentid = $this->getRequestId('alias_folderid'); + + // If no alias, remove the alias + if ( ! $alias->filename ) { + + $alias->delete(); + $this->addNotice($alias->getType(), 0, '', 'DELETED', 'ok'); + } + else + { + $alias->save(); + $this->addNotice($alias->getType(), 0, $alias->filename, 'SAVED', 'ok'); + } + + } +} diff --git a/modules/cms/action/page/PagePreviewAction.class.php b/modules/cms/action/page/PagePreviewAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\action\RequestParams; +use util\Html; + +class PagePreviewAction extends PageAction implements Method { + public function view() { + $this->setModelAndLanguage(); + + $this->setTemplateVar('preview_url',Html::url('page','show',$this->page->objectid,array(RequestParams::PARAM_LANGUAGE_ID=>$this->page->getProject()->getDefaultLanguageId(),RequestParams::PARAM_MODEL_ID=>$this->page->getProject()->getDefaultModelId()) ) ); + } + public function post() { + } +} diff --git a/modules/cms/action/page/PagePubAction.class.php b/modules/cms/action/page/PagePubAction.class.php @@ -0,0 +1,50 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\generator\PageContext; +use cms\generator\PageGenerator; +use cms\generator\Producer; +use cms\generator\Publisher; +use cms\generator\PublishOrder; +use cms\model\Acl; +use util\Session; + +class PagePubAction extends PageAction implements Method { + public function view() { + + } + public function post() { + if ( !$this->page->hasRight( Acl::ACL_PUBLISH ) ) + throw new \util\exception\SecurityException( 'no right for publish' ); + + $project = $this->page->getProject(); + + // Nothing is written to the session from this point. so we should free the session. + Session::close(); + + $publisher = new Publisher( $project->projectid ); + + foreach( $project->getModelIds() as $modelId ) { + + foreach( $project->getLanguageIds() as $languageId ) { + + $pageContext = new PageContext( $this->page->objectid, Producer::SCHEME_PUBLIC ); + $pageContext->modelId = $modelId; + $pageContext->languageId = $languageId; + + $pageGenerator = new PageGenerator( $pageContext ); + + $publisher->addOrderForPublishing( new PublishOrder( $pageGenerator->getCache()->load()->getFilename(),$pageGenerator->getPublicFilename(), $this->page->lastchangeDate ) ); + } + } + + $publisher->publish(); + + $this->addNoticeFor( $this->page, + 'PUBLISHED', + array(), + implode("\n",$publisher->getDestinationFilenames() ) + ); + } +} diff --git a/modules/cms/action/page/PageRemoveAction.class.php b/modules/cms/action/page/PageRemoveAction.class.php @@ -0,0 +1,22 @@ +<?php +namespace cms\action\page; +use cms\action\Action; +use cms\action\Method; +use cms\action\PageAction; + +class PageRemoveAction extends PageAction implements Method { + public function view() { + $this->setTemplateVar( 'name',$this->page->filename ); + } + public function post() { + if ( $this->getRequestVar('delete') != '' ) + { + $this->page->delete(); + $this->addNotice('page', 0, $this->page->filename, 'DELETED', Action::NOTICE_OK); + } + else + { + $this->addNotice('page', 0, $this->page->filename, 'CANCELED', Action::NOTICE_WARN); + } + } +} diff --git a/modules/cms/action/page/PageShowAction.class.php b/modules/cms/action/page/PageShowAction.class.php @@ -0,0 +1,57 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\base\Configuration; +use cms\generator\PageGenerator; +use cms\generator\Producer; +use cms\model\Language; +use cms\model\Template; +use configuration\Config; +use logger\Logger; + +class PageShowAction extends PageAction implements Method { + public function view() { + // We must overwrite the CSP here. + // The output is only shown in an iframe, so there is no security impact to the CMS. + // But if the template is using inline JS or CSS, we would break this with a CSP-header. + $pageSettingsConfig = new Config( $this->page->getTotalSettings() ); + header('Content-Security-Policy: '.$pageSettingsConfig->get('content-security-policy','') ); + + $this->page->load(); + + $project = $this->page->getProject(); + + header('Content-Type: '.$this->page->mimeType().'; charset=UTF-8' ); + + // HTTP-Header mit Sprachinformation setzen. + $language = new Language( $this->page->languageid); + $language->load(); + header('Content-Language: '.$language->isoCode); + + Logger::debug("Preview page: ".$this->page->__toString() ); + + $pageContext = $this->createPageContext( Producer::SCHEME_PREVIEW); + $generator = new PageGenerator( $pageContext ); + + $template = new Template( $this->page->templateid ); + $templateModel = $template->loadTemplateModelFor( $pageContext->modelId ); + $templateModel->load(); + + // Executing PHP in Pages. + $enablePHP = Configuration::subset('publish')->get('enable_php_in_page_content'); + if ( ( $enablePHP=='auto' && $templateModel->extension == 'php') || + $enablePHP===true ) + { + ob_start(); + require( $generator->getCache()->load()->getFilename() ); + $this->setTemplateVar('output',ob_get_contents() ); + ob_end_clean(); + } + else + $this->setTemplateVar('output',$generator->getCache()->get()); + } + + public function post() { + } +} diff --git a/modules/cms/action/page/PageSrcAction.class.php b/modules/cms/action/page/PageSrcAction.class.php @@ -0,0 +1,25 @@ +<?php +namespace cms\action\page; +use cms\action\Method; +use cms\action\PageAction; +use cms\generator\PageContext; +use cms\generator\PageGenerator; +use cms\generator\Producer; +use cms\model\Project; + +class PageSrcAction extends PageAction implements Method { + public function view() { + $project = new Project( $this->page->projectid ); + $this->setModelAndLanguage(); + + $pageContext = new PageContext( $this->page->objectid,Producer::SCHEME_PUBLIC); + $pageContext->languageId = $project->getDefaultLanguageId(); + $pageContext->modelId = $project->getDefaultModelId(); + + $generator = new PageGenerator( $pageContext ); + + $this->setTemplateVar('src',$generator->getCache()->get() ); + } + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementAdvancedAction.class.php b/modules/cms/action/pageelement/PageelementAdvancedAction.class.php @@ -0,0 +1,43 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Element; + +class PageelementAdvancedAction extends PageelementAction implements Method { + public function view() { + $this->value->objectid = $this->page->objectid; + $this->value->pageid = $this->page->pageid; + $this->value->page = $this->page; + $this->value->element = &$this->element; + $this->value->elementid = $this->element->elementid; + $this->value->element->load(); + + $this->setTemplateVar('name' ,$this->value->element->label ); + $this->setTemplateVar('description',$this->value->element->desc ); + $this->setTemplateVar('elementid' ,$this->value->element->elementid); + $this->setTemplateVar('type' ,$this->value->element->getTypeName() ); + + $languages = array(); + + foreach ( $this->page->getProject()->getLanguages() as $languageId=>$languageName ) + { + $this->value->languageid = $languageId; + $this->value->load(); + + $languages[$languageId] = array( + 'languageid' => $languageId, + 'languagename' => $languageName, + 'text' => $this->calculateValue( $this->value ), + 'number' => $this->value->number, + 'date' => $this->value->date, + 'linkObjectId' => $this->value->linkToObjectId, + 'editors' => Element::getAvailableFormats() + ); + } + + $this->setTemplateVar('languages',$languages); + } + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementDiffAction.class.php b/modules/cms/action/pageelement/PageelementDiffAction.class.php @@ -0,0 +1,58 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\generator\PublishEdit; +use cms\generator\PublishPreview; +use cms\model\Value; +use util\Text; + +class PageelementDiffAction extends PageelementAction implements Method { + + public function view() { + $value1id = $this->getRequestVar('compareid'); + $value2id = $this->getRequestVar('withid' ); + + // Wenn Value1-Id groesser als Value2-Id, dann Variablen tauschen + if ( $value1id == $value2id ) + { + $this->addValidationError('compareid' ); + $this->addValidationError('withid' ,''); + $this->callSubAction('archive'); + return; + } + + // Wenn Value1-Id groesser als Value2-Id, dann Variablen tauschen + if ( $value1id > $value2id ) + list($value1id,$value2id) = array( $value2id,$value1id ); + + + $value1 = new Value( $value1id ); + $value2 = new Value( $value2id ); + $value1->valueid = $value1id; + $value2->valueid = $value2id; + + $value1->loadWithId(); + $value2->loadWithId(); + + $this->setTemplateVar('date_left' ,$value1->lastchangeTimeStamp); + $this->setTemplateVar('date_right',$value2->lastchangeTimeStamp); + + $text1 = explode("\n",$value1->text); + $text2 = explode("\n",$value2->text); + + // Unterschiede feststellen. + $diffResult = Text::diff($text1,$text2); + + $outputResult = array_map( function( $left,$right) { + return [ + 'left' => $left, + 'right'=> $right + ]; + },$diffResult[0],$diffResult[1] ); + + $this->setTemplateVar('diff',$outputResult ); + } + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementEditAction.class.php b/modules/cms/action/pageelement/PageelementEditAction.class.php @@ -0,0 +1,44 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; + +class PageelementEditAction extends PageelementAction implements Method { + public function view() { + $this->value->objectid = $this->page->objectid; + $this->value->pageid = $this->page->pageid; + $this->value->page = $this->page; + $this->value->element = &$this->element; + $this->value->elementid = $this->element->elementid; + $this->value->element->load(); + + $this->setTemplateVar('name' ,$this->value->element->label ); + $this->setTemplateVar('description',$this->value->element->desc ); + $this->setTemplateVar('elementid' ,$this->value->element->elementid); + $this->setTemplateVar('type' ,$this->value->element->getTypeName() ); + + $languages = array(); + + foreach ( $this->page->getProject()->getLanguages() as $languageId=>$languageName ) + { + $value = clone $this->value; // do not overwrite the value + $value->languageid = $languageId; + $value->load(); + + $languages[$languageId] = array( + 'languageid' => $languageId, + 'languagename' => $languageName, + 'text' => $this->calculateValue( $value ), + 'number' => $value->number, + 'date' => $value->date, + 'linkObjectId' => $value->linkToObjectId, + ); + } + + $this->setTemplateVar('languages',$languages); + } + + + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementHistoryAction.class.php b/modules/cms/action/pageelement/PageelementHistoryAction.class.php @@ -0,0 +1,59 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Element; +use cms\model\Value; + +class PageelementHistoryAction extends PageelementAction implements Method { + public function view() { + + $this->page->load(); + + $this->value->objectid = $this->page->objectid; + $this->value->pageid = $this->page->pageid; + $this->value->page = $this->page; + $this->value->element = &$this->element; + $this->value->elementid = $this->element->elementid; + $this->value->element->load(); + + $languages = array(); + + foreach ( $this->page->getProject()->getLanguages() as $languageId=>$languageName ) + { + $language = [ + 'id' => $languageId, + 'name' => $languageName, + 'values' => [], + ]; + + $value = clone $this->value; // do not overwrite the value + $value->languageid = $languageId; + + /** @var Value $value */ + foreach($value->getVersionList() as $value) { + + $language['values'][] = [ + 'text' => $this->calculateValue( $value ), + 'active' => $value->active, + 'publish' => $value->publish, + 'user' => $value->lastchangeUserName, + 'date' => $value->lastchangeTimeStamp, + 'id' => $value->getId(), + 'usable' => ! $value->active, + 'releasable' => $value->active && ! $value->publish, + 'comparable' => in_array($this->element->typeid,[Element::ELEMENT_TYPE_LONGTEXT]), + ]; + } + + $languages[$languageId] = $language; + } + + $this->setTemplateVar('name' ,$this->element->label ); + $this->setTemplateVar('languages',$languages ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementInfoAction.class.php b/modules/cms/action/pageelement/PageelementInfoAction.class.php @@ -0,0 +1,50 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Element; +use cms\model\Template; +use cms\model\User; + +class PageelementInfoAction extends PageelementAction implements Method { + + public function view() { + $this->value->languageid = $this->page->languageid; + $this->value->objectid = $this->page->objectid; + $this->value->pageid = $this->page->pageid; + $this->value->page = $this->page; + $this->value->simple = false; + $this->value->element = &$this->element; + $this->value->element->load(); + $this->value->load(); + + $this->setTemplateVar('name' ,$this->value->element->name ); + $this->setTemplateVar('description' ,$this->value->element->desc ); + $this->setTemplateVar('elementid' ,$this->value->element->elementid); + $this->setTemplateVar('element_id' ,$this->value->element->elementid ); + $this->setTemplateVar('element_name' ,$this->value->element->name ); + $this->setTemplateVar('element_type' ,$this->value->element->getTypeName() ); + $this->setTemplateVar('element_format',Element::getAvailableFormats()[ $this->value->element->format] ); + $this->setTemplateVar('format' ,@Element::getAvailableFormats()[ $this->value->format ] ); + + $user = new User( $this->value->lastchangeUserId ); + + try{ + $user->load(); + }catch (\util\exception\ObjectNotFoundException $e) { + $user = new User(); // Empty User. + } + + $this->setTemplateVar('lastchange_user',$user->getProperties()); + $this->setTemplateVar('lastchange_date',$this->value->lastchangeTimeStamp); + + $t = new Template( $this->page->templateid ); + $t->load(); + $this->setTemplateVar('template_name',$t->name ); + $this->setTemplateVar('template_id' ,$t->templateid ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementLinkAction.class.php b/modules/cms/action/pageelement/PageelementLinkAction.class.php @@ -0,0 +1,74 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\Folder; +use cms\model\Page; +use cms\model\Project; +use cms\model\Template; + +class PageelementLinkAction extends PageelementAction implements Method { + public function view() { + $this->value->languageid = $this->page->languageid; + $this->value->objectid = $this->page->objectid; + $this->value->pageid = $this->page->pageid; + $this->value->element = &$this->element; + $this->value->element->load(); + $this->value->load(); + + $this->setTemplateVar('name' ,$this->value->element->name ); + $this->setTemplateVar('desc' ,$this->value->element->desc ); + + $project = new Project($this->page->projectid); + $this->setTemplateVar('rootfolderid' ,$project->getRootObjectId() ); + + // Ermitteln, welche Objekttypen verlinkt werden d�rfen. + if ( empty($this->value->element->subtype) ) + $types = array('page','file','link'); // Fallback: Alle erlauben :) + else + $types = explode(',',$this->value->element->subtype ); + + $objects = array(); + + $objects[ 0 ] = \cms\base\Language::lang('LIST_ENTRY_EMPTY'); // Wert "nicht ausgewählt" + + + $t = new Template( $this->page->templateid ); + + foreach( $t->getDependentObjectIds() as $id ) + { + $o = new BaseObject( $id ); + $o->load(); + + // if ( in_array( $o->getType(),$types )) + // { + $f = new Folder( $o->parentid ); + // $f->load(); + + $objects[ $id ] = \cms\base\Language::lang( $o->getType() ).': '; + $objects[ $id ] .= implode( \util\Text::FILE_SEP,$f->parentObjectNames(false,true) ); + $objects[ $id ] .= \util\Text::FILE_SEP.$o->name; + // } + } + + asort( $objects ); // Sortieren + + $this->setTemplateVar('objects' ,$objects); + $this->setTemplateVar('linkobjectid',$this->value->linkToObjectId); + + $this->value->page = new Page( $this->page->objectid ); + $this->value->page->languageid = $this->value->languageid; + $this->value->page->load(); + + $this->setTemplateVar( 'release',$this->value->page->hasRight(Acl::ACL_RELEASE) ); + $this->setTemplateVar( 'publish',$this->value->page->hasRight(Acl::ACL_PUBLISH) ); + + $this->setTemplateVar( 'objectid',$this->value->page->objectid ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementPreviewAction.class.php b/modules/cms/action/pageelement/PageelementPreviewAction.class.php @@ -0,0 +1,15 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\generator\Producer; +use cms\generator\ValueGenerator; + +class PageelementPreviewAction extends PageelementAction implements Method { + public function view() { + $valueGenerator = new ValueGenerator( $this->createValueContext( Producer::SCHEME_PREVIEW) ); + $this->setTemplateVar('preview' ,$valueGenerator->getCache()->get() ); + } + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementPropAction.class.php b/modules/cms/action/pageelement/PageelementPropAction.class.php @@ -0,0 +1,42 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Template; +use cms\model\User; +use util\Html; + +class PageelementPropAction extends PageelementAction implements Method { + + public function view() { + $this->value->languageid = $this->page->languageid; + $this->value->objectid = $this->page->objectid; + $this->value->pageid = $this->page->pageid; + $this->value->page = $this->page; + $this->value->simple = false; + $this->value->element = &$this->element; + $this->value->element->load(); + $this->value->load(); + + $this->setTemplateVar('name' ,$this->value->element->name ); + $this->setTemplateVar('description' ,$this->value->element->desc ); + $this->setTemplateVar('elementid' ,$this->value->element->elementid); + $this->setTemplateVar('element_type',$this->value->element->type ); + + $user = new User( $this->value->lastchangeUserId ); + $user->load(); + $this->setTemplateVar('lastchange_user',$user->getProperties()); + $this->setTemplateVar('lastchange_date',$this->value->lastchangeTimeStamp); + + $t = new Template( $this->page->templateid ); + $t->load(); + $this->setTemplateVar('template_name',$t->name ); + $this->setTemplateVar('template_url' ,Html::url('template','prop',$t->templateid) ); + + $this->setTemplateVar('element_name' ,$this->value->element->name ); + $this->setTemplateVar('element_url' ,Html::url('element','name',$this->value->element->elementid) ); + } + + public function post() { + } +} diff --git a/modules/cms/action/pageelement/PageelementPubAction.class.php b/modules/cms/action/pageelement/PageelementPubAction.class.php @@ -0,0 +1,17 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Acl; +use util\exception\SecurityException; + +class PageelementPubAction extends PageelementAction implements Method { + public function view() { + } + public function post() { + if ( !$this->page->hasRight( Acl::ACL_PUBLISH ) ) + throw new SecurityException( 'no right for publish' ); + + $this->publishPage(); + } +} diff --git a/modules/cms/action/pageelement/PageelementReleaseAction.class.php b/modules/cms/action/pageelement/PageelementReleaseAction.class.php @@ -0,0 +1,36 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Acl; +use language\Messages; +use LogicException; +use util\exception\SecurityException; + +class PageelementReleaseAction extends PageelementAction implements Method { + public function view() { + } + public function post() { + $this->value->objectid = $this->page->objectid; + $this->value->pageid = $this->page->pageid; + $this->value->page = $this->page; + $this->value->element = &$this->element; + $this->value->elementid = $this->element->elementid; + $this->value->element->load(); + + $this->value->valueid = intval($this->getRequestVar('valueid')); + $this->value->loadWithId(); + + if ( $this->value->pageid != $this->page->pageid ) + throw new LogicException( 'cannot release, bad page' ); + + // Pruefen, ob Berechtigung zum Freigeben besteht + if ( !$this->page->hasRight(Acl::ACL_RELEASE) ) + throw new SecurityException( 'Cannot release','no right' ); + + // Inhalt freigeben + $this->value->release(); + + $this->addNoticeFor($this->value, Messages::PAGEELEMENT_RELEASED ); + } +} diff --git a/modules/cms/action/pageelement/PageelementRestoreAction.class.php b/modules/cms/action/pageelement/PageelementRestoreAction.class.php @@ -0,0 +1,28 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Action; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Element; + +class PageelementRestoreAction extends PageelementAction implements Method { + public function view() { + } + public function post() { + $this->value->valueid = $this->getRequestVar('valueid'); + $this->value->loadWithId(); + $this->value->element = new Element( $this->value->elementid ); + + if ( $this->value->pageid != $this->page->pageid ) + throw new \LogicException( 'Cannot find value','page-id does not match' ); + + // Pruefen, ob Berechtigung zum Freigeben besteht + //$this->value->release = $this->page->hasRight(Acl::ACL_RELEASE); + $this->value->release = false; + + // Inhalt wieder herstellen, in dem er neu gespeichert wird. + $this->value->save(); + + $this->addNotice('pageelement', 0, $this->value->element->name, 'PAGEELEMENT_USE_FROM_ARCHIVE', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/pageelement/PageelementValueAction.class.php b/modules/cms/action/pageelement/PageelementValueAction.class.php @@ -0,0 +1,71 @@ +<?php +namespace cms\action\pageelement; +use cms\action\Method; +use cms\action\PageelementAction; +use cms\model\Acl; +use cms\model\Page; + +class PageelementValueAction extends PageelementAction implements Method { + + public function view() { + $this->value->languageid = $this->page->languageid; + $this->value->objectid = $this->page->objectid; + $this->value->pageid = $this->page->pageid; + $this->value->element = &$this->element; + $this->value->elementid = &$this->element->elementid; + $this->value->element->load(); + $this->value->publish = false; + + + $valueId =$this->getRequestId('valueid'); + if ( $valueId ) { + $this->value->valueid = $valueId; + $this->value->loadWithId(); + } + else { + $this->value->load(); + } + + $this->setTemplateVar('name' ,$this->value->element->name ); + $this->setTemplateVar('desc' ,$this->value->element->desc ); + $this->setTemplateVar('elementid',$this->value->element->elementid); + $this->setTemplateVar('languageid',$this->value->languageid ); + $this->setTemplateVar('type' ,$this->value->element->getTypeName() ); + $this->setTemplateVar('value_time',time() ); + + + $this->value->page = new Page( $this->page->objectid ); + $this->value->page->languageid = $this->value->languageid; + $this->value->page->load(); + + $this->setTemplateVar( 'objectid',$this->value->page->objectid ); + + if ( $this->value->page->hasRight(Acl::ACL_RELEASE) ) + $this->setTemplateVar( 'release',true ); + if ( $this->value->page->hasRight(Acl::ACL_PUBLISH) ) + $this->setTemplateVar( 'publish',false ); + + $funktionName = 'edit'.$this->value->element->type; + + if ( ! method_exists($this,$funktionName) ) + throw new \LogicException('Method does not exist: PageElementAction#'.$funktionName ); + + $this->$funktionName(); // Aufruf der Funktion "edit<Elementtyp>()". + } + + + public function post() { + $this->element->load(); + $type = $this->element->type; + + if ( empty($type)) + throw new \InvalidArgumentException('No element type available'); + + $funktionName = 'save'.$type; + + if ( !method_exists($this,$funktionName)) + throw new \InvalidArgumentException('Function not available: '.$funktionName); + + $this->$funktionName(); // Aufruf Methode "save<ElementTyp>()" + } +} diff --git a/modules/cms/action/profile/ProfileAvailableAction.class.php b/modules/cms/action/profile/ProfileAvailableAction.class.php @@ -0,0 +1,45 @@ +<?php +namespace cms\action\profile; +use cms\action\Action; +use cms\action\Method; +use cms\action\ProfileAction; +use util\ClassName; + +class ProfileAvailableAction extends ProfileAction implements Method { + + public $security = Action::SECURITY_GUEST; + + public function view() { + + $action = $this->getRequestVar('queryaction'); + + $viewMethods = array_filter( ['pub','prop','history','rights','add','pw','memberships','advanced','switch','changetemplate','src','size','maintenance','settings','archive','rights','remove','preview','order'], + function ($methodName) use ($action) { + + // Filter existent methods + while( true ) { + $actionClassName = new ClassName( ucfirst($action) . ucfirst($methodName) . 'Action'); + $actionClassName->addNamespace( ['cms','action',$action] ); + //echo "check: "; print_r($actionClassName->get() ); echo "\n"; + + if ( $actionClassName->exists() ) + return true; + + $baseActionClassName = new ClassName( ucfirst($action) . 'Action' ); + $baseActionClassName->addNamespace( ['cms','action'] ); + + if ( ! $baseActionClassName->exists() ) + return false; + + if ( ! $baseActionClassName->getParent()->exists() ) + return false; + + $action = strtolower( $baseActionClassName->dropNamespace()->dropSuffix('Action')->get() ); + } + }); + + $this->setTemplateVar('views', $viewMethods); + } + public function post() { + } +} diff --git a/modules/cms/action/profile/ProfileConfirmmailAction.class.php b/modules/cms/action/profile/ProfileConfirmmailAction.class.php @@ -0,0 +1,33 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; +use language\Messages; +use util\exception\ValidationException; +use util\Session; + +class ProfileConfirmmailAction extends ProfileAction implements Method { + public function view() { + } + public function post() { + $sessionCode = Session::get( Session::KEY_MAIL_CHANGE_CODE ); + $newMail = Session::get( Session::KEY_MAIL_CHANGE_MAIL ); + $inputRegisterCode = $this->getRequestVar('code'); + + if ( $sessionCode == $inputRegisterCode ) + { + // Best�tigungscode stimmt �berein. + // E-Mail-Adresse �ndern. + $this->user->mail = $newMail; + $this->user->save(); + + $this->addNoticeFor( $this->user,Messages::SAVED ); + } + else + { + // Validation code does not match + throw new ValidationException('code',Messages::CODE_NOT_MATCH ); + } + + } +} diff --git a/modules/cms/action/profile/ProfileEditAction.class.php b/modules/cms/action/profile/ProfileEditAction.class.php @@ -0,0 +1,76 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; +use cms\base\Configuration; +use cms\base\Startup; +use language\Language; +use language\Messages; +use security\Base2n; +use util\Session; + +class ProfileEditAction extends ProfileAction implements Method { + public function view() { + $issuer = urlencode(Configuration::subset('application')->get('operator',Startup::TITLE)); + $account = $this->user->name.'@'.$_SERVER['SERVER_NAME']; + + $base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', FALSE, TRUE, TRUE); + $secret = $base32->encode(hex2bin($this->user->otpSecret)); + $counter = $this->user->hotpCount; + + $this->setTemplateVars( $this->user->getProperties() ); + + $this->setTemplateVar( 'allstyles',$this->user->getAvailableStyles() ); + + $this->setTemplateVar('timezone_list',timezone_identifiers_list() ); + + $languageList = []; + + foreach( Messages::$AVAILABLE_LANGUAGES as $languageIsoCode) + { + $language = (new Language)->getLanguage($languageIsoCode); + $label = $language[ Messages::SELF_NAME ]; + $languageList[ $languageIsoCode ] = $label; + } + $this->setTemplateVar('language_list',$languageList ); + + $this->setTemplateVars( + $this->user->getProperties() + + array('totpSecretUrl' => "otpauth://totp/{$issuer}:{$account}?secret={$secret}&issuer={$issuer}", + 'hotpSecretUrl' => "otpauth://hotp/{$issuer}:{$account}?secret={$secret}&issuer={$issuer}&counter={$counter}" + ) + ); + + + } + public function post() { + $this->user->fullname = $this->getRequestVar('fullname'); + $this->user->tel = $this->getRequestVar('tel' ); + $this->user->desc = $this->getRequestVar('desc' ); + $this->user->style = $this->getRequestVar('style' ); + $this->user->language = $this->getRequestVar('language'); + $this->user->timezone = $this->getRequestVar('timezone'); + $this->user->hotp = $this->hasRequestVar('hotp' ); + $this->user->totp = $this->hasRequestVar('totp' ); + + + Session::setUser( $this->user ); + + if ( !empty($this->user->fullname) ) + { + $this->user->save(); + $this->addNoticeFor( $this->user,Messages::SAVED); + } + else + { + $this->addValidationError('fullname'); + } + + + // Ausgewählte Sprache sofort verwenden. + $l = $this->getRequestVar('language'); + + if ( $l ) + $this->setLanguage($l); + } +} diff --git a/modules/cms/action/profile/ProfileHistoryAction.class.php b/modules/cms/action/profile/ProfileHistoryAction.class.php @@ -0,0 +1,26 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; +use cms\model\BaseObject; + +class ProfileHistoryAction extends ProfileAction implements Method { + public function view() { + $lastChanges = $this->user->getLastChanges(); + + $timeline = array(); + + foreach( $lastChanges as $entry ) + { + $timeline[ $entry['objectid'] ] = $entry; + $baseObject = new BaseObject( $entry['objectid']); + $baseObject->objectLoad(); + $timeline[ $entry['objectid'] ]['type'] = $baseObject->getType(); + } + $this->setTemplateVar('timeline', $timeline); + } + + + public function post() { + } +} diff --git a/modules/cms/action/profile/ProfileLanguageAction.class.php b/modules/cms/action/profile/ProfileLanguageAction.class.php @@ -0,0 +1,14 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; +use cms\base\Configuration; + +class ProfileLanguageAction extends ProfileAction implements Method { + public function view() { + + $this->setTemplateVar('language',Configuration::Conf()->get('language') ); + } + public function post() { + } +} diff --git a/modules/cms/action/profile/ProfileMailAction.class.php b/modules/cms/action/profile/ProfileMailAction.class.php @@ -0,0 +1,46 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; +use language\Messages; +use logger\Logger; +use util\exception\ValidationException; +use util\Mail; +use util\Session; + +class ProfileMailAction extends ProfileAction implements Method { + public function view() { + } + public function post() { + srand ((double)microtime()*1000003); + $code = rand(); // Zufalls-Freischaltcode erzeugen + $newMail = $this->getRequestVar('mail'); + + if ( empty($newMail) ) + { + // Keine E-Mail-Adresse eingegeben. + throw new ValidationException('mail'); + } + else + { + // Der Freischaltcode wird in der Sitzung gespeichert. + Session::set( Session::KEY_MAIL_CHANGE_CODE,$code ); + Session::set( Session::KEY_MAIL_CHANGE_MAIL,$newMail); + + // E-Mail an die neue Adresse senden. + $mail = new Mail( $newMail,'mail_change_code' ); + $mail->setVar('code',$code ); + $mail->setVar('name',$this->user->getName()); + + if ( $mail->send() ) + { + $this->addNoticeFor( $this->user, Messages::MAIL_SENT); + } + else + { + Logger::warn('Mail could not be sent: '.$mail->error); + $this->addNoticeFor($this->user, Messages::MAIL_NOT_SENT,[],$mail->error); // Meldung + } + } + } +} diff --git a/modules/cms/action/profile/ProfileMembershipsAction.class.php b/modules/cms/action/profile/ProfileMembershipsAction.class.php @@ -0,0 +1,13 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; + + +class ProfileMembershipsAction extends ProfileAction implements Method { + public function view() { + $this->setTemplateVar( 'groups',$this->user->getGroups() ); + } + public function post() { + } +} diff --git a/modules/cms/action/profile/ProfilePingAction.class.php b/modules/cms/action/profile/ProfilePingAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\action\profile; +use cms\action\Action; +use cms\action\Method; +use cms\action\ProfileAction; + +class ProfilePingAction extends ProfileAction implements Method { + + public $security = Action::SECURITY_GUEST; + + public function view() { + $this->setTemplateVar('pong',1); + } + public function post() { + } +} diff --git a/modules/cms/action/profile/ProfilePwAction.class.php b/modules/cms/action/profile/ProfilePwAction.class.php @@ -0,0 +1,46 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; +use cms\base\Configuration; +use cms\model\User; + +class ProfilePwAction extends ProfileAction implements Method { + public function view() { + // Kennwortänderung funktioniert natürlich nur in der internen Datenbank. + // + // Hier wird festgestellt, ob der Benutzer sich über die interne Datenbank angemeldet hat. + // Nur dann kann man auch sein Kennwort ändern. + $user = $this->getUserFromSession(); + $pwchangePossible = $user->type == User::AUTH_TYPE_INTERNAL; + $this->setTemplateVar('pwchange_enabled', $pwchangePossible); + } + + + + public function post() { + $pwMinLength = Configuration::subset(['security','password'])->get('min_length',10); + + if ( ! $this->user->checkPassword( $this->getRequestVar('act_password') ) ) + { + $this->addValidationError('act_password'); + } + elseif ( $this->getRequestVar('password1') == '' ) + { + $this->addValidationError('password1'); + } + elseif ( $this->getRequestVar('password1') != $this->getRequestVar('password2') ) + { + $this->addValidationError('password2','PASSWORDS_DO_NOT_MATCH'); + } + elseif ( strlen($this->getRequestVar('password1'))<$pwMinLength ) + { + $this->addValidationError('password1','PASSWORD_MINLENGTH',array('minlength'=> $pwMinLength)); + } + else + { + $this->user->setPassword( $this->getRequestVar('password1') ); + $this->addNotice('user', 0, $this->user->name, 'SAVED', 'ok'); + } + } +} diff --git a/modules/cms/action/profile/ProfileUisettingsAction.class.php b/modules/cms/action/profile/ProfileUisettingsAction.class.php @@ -0,0 +1,15 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; +use cms\base\Configuration; + + +class ProfileUisettingsAction extends ProfileAction implements Method { + public function view() { + + $this->setTemplateVar('settings',Configuration::Conf()->get('ui') ); + } + public function post() { + } +} diff --git a/modules/cms/action/profile/ProfileUserinfoAction.class.php b/modules/cms/action/profile/ProfileUserinfoAction.class.php @@ -0,0 +1,35 @@ +<?php +namespace cms\action\profile; +use cms\action\Method; +use cms\action\ProfileAction; +use cms\base\Configuration; +use util\Session; +use util\UIUtils; + +class ProfileUserinfoAction extends ProfileAction implements Method { + + + public function view() { + + $user = Session::getUser(); + + $currentStyle = $this->getUserStyle($user); + $this->setTemplateVar('style',$currentStyle); + + + $defaultStyleConfig = Configuration::Conf()->get('style-default',[]); // default style config + $userStyleConfig = Configuration::subset('style')->get($currentStyle,[]); // user style config + + if ( $userStyleConfig ) + $defaultStyleConfig = array_merge($defaultStyleConfig, $userStyleConfig ); // Merging user style into default style + else + ; // Unknown style name, we are ignoring this. + + // Theme base color for smartphones colorizing their status bar. + $this->setTemplateVar('theme-color', UIUtils::getColorHexCode($defaultStyleConfig['title_background_color'])); + } + + + public function post() { + } +} diff --git a/modules/cms/action/project/ProjectCopyAction.class.php b/modules/cms/action/project/ProjectCopyAction.class.php @@ -0,0 +1,35 @@ +<?php +namespace cms\action\project; +use cms\action\Method; +use cms\action\ProjectAction; +use cms\base\Configuration; +use cms\base\DB; + +class ProjectCopyAction extends ProjectAction implements Method { + public function view() { + + } + public function post() { + $db = DB::get(); + $this->setTemplateVar( 'dbid',$db->id ); + + $conf = Configuration::rawConfig(); + $dbids = array(); + + foreach( $conf['database'] as $dbname=>$dbconf ) + { + if ( is_array($dbconf) && $dbconf['enabled']) + $dbids[$dbname] = $dbconf['description']; + } + $this->setTemplateVar( 'dbids',$dbids ); + + + if ( $this->hasRequestVar('ok') ) + { + $this->project->export( $this->getRequestVar('dbid') ); + + $this->addNotice('project', 0, $this->project->name, 'DONE'); + $this->setTemplateVar('done',true); + } + } +} diff --git a/modules/cms/action/project/ProjectEditAction.class.php b/modules/cms/action/project/ProjectEditAction.class.php @@ -0,0 +1,15 @@ +<?php +namespace cms\action\project; +use cms\action\Method; +use cms\action\ProjectAction; + +class ProjectEditAction extends ProjectAction implements Method { + public function view() { + + $this->setTemplateVar('projectid' ,$this->project->projectid); + $this->setTemplateVar('rootobjectid' ,$this->project->getRootObjectId()); + $this->setTemplateVar('is_project_admin',$this->userIsProjectAdmin()); + } + public function post() { + } +} diff --git a/modules/cms/action/project/ProjectHistoryAction.class.php b/modules/cms/action/project/ProjectHistoryAction.class.php @@ -0,0 +1,14 @@ +<?php +namespace cms\action\project; +use cms\action\Method; +use cms\action\ProjectAction; + +class ProjectHistoryAction extends ProjectAction implements Method { + public function view() { + $result = $this->project->getLastChanges(); + + $this->setTemplateVar('timeline', $result); + } + public function post() { + } +} diff --git a/modules/cms/action/project/ProjectInfoAction.class.php b/modules/cms/action/project/ProjectInfoAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\action\project; +use cms\action\Method; +use cms\action\ProjectAction; + +class ProjectInfoAction extends ProjectAction implements Method { + + public function view() { + $this->setTemplateVar( 'info', $this->project->info() ); + $this->setTemplateVar( 'name', $this->project->name ); + $this->setTemplateVar( 'url' , $this->makeAbsoluteHostnameLink($this->project->url) ); + } + + public function post() { + } +} diff --git a/modules/cms/action/project/ProjectListingAction.class.php b/modules/cms/action/project/ProjectListingAction.class.php @@ -0,0 +1,24 @@ +<?php +namespace cms\action\project; +use cms\action\Method; +use cms\action\ProjectAction; +use cms\model\Project; +use util\Html; + +class ProjectListingAction extends ProjectAction implements Method { + public function view() { + // Projekte ermitteln + $list = array(); + + foreach(Project::getAllProjects() as $id=> $name ) + { + $list[$id] = array(); + $list[$id]['url' ] = Html::url('project','edit',$id); + $list[$id]['use_url' ] = Html::url('tree' ,'load',0 ,array('projectid'=>$id,'target'=>'tree')); + $list[$id]['name' ] = $name; + } + $this->setTemplateVar('el',$list); + } + public function post() { + } +} diff --git a/modules/cms/action/project/ProjectMaintenanceAction.class.php b/modules/cms/action/project/ProjectMaintenanceAction.class.php @@ -0,0 +1,30 @@ +<?php +namespace cms\action\project; +use cms\action\Method; +use cms\action\ProjectAction; +use language\Messages; + +class ProjectMaintenanceAction extends ProjectAction implements Method { + public function view() { + } + public function post() { + switch( $this->getRequestVar('type') ) + { + case 'check_files': + // Konsistenzprüfungen + $log = $this->project->checkLostFiles(); + + $this->addNoticeFor($this->project,Messages::DONE, [], implode("\n",$log) ); + break; + + case 'check_limit': + // Alte Versionen löschen. + $this->project->checkLimit(); + $this->addNoticeFor($this->project,Messages::DONE); + break; + + default: + $this->addValidationError('type'); + } + } +} diff --git a/modules/cms/action/project/ProjectPropAction.class.php b/modules/cms/action/project/ProjectPropAction.class.php @@ -0,0 +1,46 @@ +<?php +namespace cms\action\project; +use cms\action\Method; +use cms\action\ProjectAction; +use cms\action\RequestParams; +use cms\model\Folder; +use language\Messages; + +class ProjectPropAction extends ProjectAction implements Method { + public function view() { + $extraProperties = array( + 'rootobjectid' => $this->project->getRootObjectId(), + 'linksAbsolute' => $this->project->linkAbsolute?'1':'0' + ); + + $this->setTemplateVars( $this->project->getProperties() + $extraProperties ); + + } + public function post() { + if ( $this->getRequestVar('name') != '') + { + $this->project->name = $this->getRequestVar('name' ,RequestParams::FILTER_ALPHANUM); + $this->project->url = $this->getRequestVar('url' ,RequestParams::FILTER_ALPHANUM); + $this->project->target_dir = $this->getRequestVar('target_dir' ,RequestParams::FILTER_RAW ); + $this->project->ftp_url = $this->getRequestVar('ftp_url' ,RequestParams::FILTER_RAW ); + $this->project->ftp_passive = $this->getRequestVar('ftp_passive' ,RequestParams::FILTER_RAW ); + $this->project->cmd_after_publish = $this->getRequestVar('cmd_after_publish' ,RequestParams::FILTER_RAW ); + $this->project->content_negotiation = $this->getRequestVar('content_negotiation',RequestParams::FILTER_NUMBER ); + $this->project->cut_index = $this->getRequestVar('cut_index' ,RequestParams::FILTER_NUMBER ); + $this->project->publishFileExtension = $this->getRequestVar('publishFileExtension',RequestParams::FILTER_NUMBER ); + $this->project->publishPageExtension = $this->getRequestVar('publishPageExtension',RequestParams::FILTER_NUMBER ); + $this->project->linkAbsolute = $this->getRequestVar('linksAbsolute' ,RequestParams::FILTER_NUMBER ) == '1'; + + $this->addNoticeFor($this->project,Messages::SAVED); + $this->project->save(); // speichern + + $root = new Folder( $this->project->getRootObjectId() ); + $root->setTimestamp(); + } + else + { + $this->addValidationError('name'); + $this->callSubAction('edit'); + } + } +} diff --git a/modules/cms/action/project/ProjectRemoveAction.class.php b/modules/cms/action/project/ProjectRemoveAction.class.php @@ -0,0 +1,25 @@ +<?php +namespace cms\action\project; +use cms\action\Method; +use cms\action\ProjectAction; + +class ProjectRemoveAction extends ProjectAction implements Method { + public function view() { + $this->setTemplateVar( 'name',$this->project->name ); + } + + + public function post() { + if ( !$this->hasRequestVar('delete') ) + { + $this->addValidationError('delete'); + return; + } + + // Gesamtes Projekt loeschen + $this->project->delete(); + + $this->setTemplateVar('tree_refresh',true); + $this->addNotice('project', 0, $this->project->name, 'DELETED'); + } +} diff --git a/modules/cms/action/projectlist/ProjectlistAddAction.class.php b/modules/cms/action/projectlist/ProjectlistAddAction.class.php @@ -0,0 +1,48 @@ +<?php +namespace cms\action\projectlist; +use cms\action\Method; +use cms\action\ProjectlistAction; +use cms\model\Project; +use language\Messages; +use util\exception\SecurityException; + +class ProjectlistAddAction extends ProjectlistAction implements Method { + + public function view() { + if( ! $this->userIsAdmin() ) + throw new SecurityException('user is not allowed to add a project'); + + $this->setTemplateVar( 'projects',Project::getAllProjects() ); + } + + + public function post() { + + if( !$this->userIsAdmin()) + throw new SecurityException(); + + $projectid = $this->getRequestVar('projectid'); + + if ( $projectid ) { + + $db = \cms\base\DB::get(); + $project = Project::create($projectid); + $project->load(); + $project->export($db->id); + $this->addNoticeFor($project,Messages::DONE); + + } else { + $name = $this->hasRequestVar('name'); + + if ( !$name ) + throw new \util\exception\ValidationException('name'); + + $project = new Project(); + $project->name = $name; + $project->add(); + $this->addNoticeFor($project,Messages::ADDED); + + } + + } +} diff --git a/modules/cms/action/projectlist/ProjectlistEditAction.class.php b/modules/cms/action/projectlist/ProjectlistEditAction.class.php @@ -0,0 +1,38 @@ +<?php +namespace cms\action\projectlist; +use cms\action\Method; +use cms\action\ProjectlistAction; +use cms\model\Acl; +use cms\model\Folder; +use cms\model\Project; + +class ProjectlistEditAction extends ProjectlistAction implements Method { + public function view() { + // Projekte ermitteln + $list = array(); + + foreach(Project::getAllProjects() as $id=> $name ) + { + + // Schleife ueber alle Projekte + foreach (Project::getAllProjects() as $id => $name) { + + $project = new Project($id); + $rootFolder = new Folder($project->getRootObjectId()); + $rootFolder->load(); + + // Berechtigt für das Projekt? + if ($rootFolder->hasRight(Acl::ACL_READ)) { + $list[$id] = array(); + $list[$id]['id' ] = $id; + $list[$id]['name' ] = $name; + } + } + } + + $this->setTemplateVar('projects',$list); + $this->setTemplateVar('add',$this->userIsAdmin()); + } + public function post() { + } +} diff --git a/modules/cms/action/projectlist/ProjectlistHistoryAction.class.php b/modules/cms/action/projectlist/ProjectlistHistoryAction.class.php @@ -0,0 +1,14 @@ +<?php +namespace cms\action\projectlist; +use cms\action\Method; +use cms\action\ProjectlistAction; +use cms\model\Project; + +class ProjectlistHistoryAction extends ProjectlistAction implements Method { + public function view() { + $result = Project::getAllLastChanges(); + $this->setTemplateVar('timeline', $result); + } + public function post() { + } +} diff --git a/modules/cms/action/search/SearchEditAction.class.php b/modules/cms/action/search/SearchEditAction.class.php @@ -0,0 +1,20 @@ +<?php +namespace cms\action\search; +use cms\action\Method; +use cms\action\SearchAction; +use cms\model\User; +use util\Session; + +class SearchEditAction extends SearchAction implements Method { + public function view() { + + $user = Session::getUser(); + + $this->setTemplateVar( 'users' ,User::listAll() ); + $this->setTemplateVar( 'act_userid',$user->userid ); + } + + + public function post() { + } +} diff --git a/modules/cms/action/search/SearchQuicksearchAction.class.php b/modules/cms/action/search/SearchQuicksearchAction.class.php @@ -0,0 +1,34 @@ +<?php +namespace cms\action\search; +use cms\action\Method; +use cms\action\SearchAction; +use cms\base\Configuration; + +class SearchQuicksearchAction extends SearchAction implements Method { + public function view() { + $searchConfig = Configuration::subset('search')->subset('quicksearch'); + + $text = $this->getRequestVar('search'); + + $flag = $searchConfig->subset('flag'); + + $searchFlags = 0; + + // Always search for the id without a max length + if ( $flag->is('id' ) ) $searchFlags |= self::FLAG_ID; + + if ( strlen($text) >= $searchConfig->get('maxlength',3 ) ) { + + if ( $flag->is('name' ) ) $searchFlags |= self::FLAG_NAME; + if ( $flag->is('filename' ) ) $searchFlags |= self::FLAG_FILENAME; + if ( $flag->is('description') ) $searchFlags |= self::FLAG_DESCRIPTION; + if ( $flag->is('content' ) ) $searchFlags |= self::FLAG_VALUE; + } + + $this->performSearch($text, $searchFlags); + } + + + public function post() { + } +} diff --git a/modules/cms/action/search/SearchResultAction.class.php b/modules/cms/action/search/SearchResultAction.class.php @@ -0,0 +1,35 @@ +<?php +namespace cms\action\search; +use cms\action\Method; +use cms\action\SearchAction; + +class SearchResultAction extends SearchAction implements Method { + + public function view() { + + $suchText = $this->getRequestVar('text'); + $searchFlags = 0; + + if ( $this->hasRequestVar('id' ) ) $searchFlags |= self::FLAG_ID; + if ( $this->hasRequestVar('filename' ) ) $searchFlags |= self::FLAG_FILENAME; + if ( $this->hasRequestVar('name' ) ) $searchFlags |= self::FLAG_NAME; + if ( $this->hasRequestVar('description') ) $searchFlags |= self::FLAG_DESCRIPTION; + if ( $this->hasRequestVar('content' ) ) $searchFlags |= self::FLAG_VALUE; + + $this->performSearch($suchText, $searchFlags); + + /* + case 'lastchange_user': + $e = new Value(); + + $language = Session::getProjectLanguage(); + $e->languageid = $language->languageid; + + $listObjectIds = $e->getObjectIdsByLastChangeUserId( $this->getRequestVar('userid') ); + break; + }*/ + } + + public function post() { + } +} diff --git a/modules/cms/action/template/TemplateAddelAction.class.php b/modules/cms/action/template/TemplateAddelAction.class.php @@ -0,0 +1,59 @@ +<?php +namespace cms\action\template; +use cms\action\Action; +use cms\action\Method; +use cms\action\RequestParams; +use cms\action\TemplateAction; +use cms\model\Element; +use cms\model\Project; +use cms\model\Template; + + +class TemplateAddelAction extends TemplateAction implements Method { + public function view() { + // Die verschiedenen Element-Typen + $types = array(); + + foreach( Element::getAvailableTypes() as $typeid => $t ) + { + $types[ $typeid ] = 'EL_'.$t; + } + + // Code-Element nur fuer Administratoren (da voller Systemzugriff!) + if ( !$this->userIsAdmin() ) + unset( $types[Element::ELEMENT_TYPE_CODE] ); + + // Auswahlmoeglichkeiten: + $this->setTemplateVar('types',$types); + + // Vorbelegung: + $this->setTemplateVar('typeid',Element::ELEMENT_TYPE_TEXT); + } + public function post() { + + $name = $this->getRequestVar('name',RequestParams::FILTER_ALPHANUM); + + if ( empty($name) ) + throw new \util\exception\ValidationException('name'); + + $newElement = $this->template->addElement( $name,$this->getRequestVar('description'),$this->getRequestVar('typeid') ); + + if ( $this->hasRequestVar('addtotemplate') ) + { + $project = new Project( $this->template->projectid); + $modelIds = $project->getModelIds(); + + foreach( $modelIds as $modelId ) + { + $template = new Template( $this->template->templateid ); + $templateModel = $template->loadTemplateModelFor( $modelId ); + $templateModel->load(); + $templateModel->src .= "\n".'{{'.$newElement->name.'}}'; + $templateModel->save(); + } + + } + + $this->addNotice('template', 0, $this->template->name, 'SAVED', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/template/TemplateEditAction.class.php b/modules/cms/action/template/TemplateEditAction.class.php @@ -0,0 +1,83 @@ +<?php +namespace cms\action\template; +use cms\action\Method; +use cms\action\TemplateAction; +use cms\model\Element; +use cms\model\Project; +use cms\model\TemplateModel; + + +class TemplateEditAction extends TemplateAction implements Method { + public function view() { + // Elemente laden + $list = array(); + + foreach( $this->template->getElementIds() as $elid ) + { + $element = new Element( $elid ); + $element->load(); + + $list[$elid] = array(); + $list[$elid]['id' ] = $elid; + $list[$elid]['name' ] = $element->name; + $list[$elid]['description'] = $element->desc; + $list[$elid]['type' ] = $element->getTypeName(); + $list[$elid]['typeid' ] = $element->typeid; + + unset( $element ); + } + $this->setTemplateVar('elements',$list); + + + $project = new Project( $this->template->projectid ); + + + $models = array(); + + foreach( $project->getModels() as $modelId => $modelName ) + { + $templatemodel = new TemplateModel( $this->template->templateid, $modelId ); + $templatemodel->load(); + + $text = $templatemodel->src; + + foreach( $this->template->getElementIds() as $elid ) + { + $element = new Element( $elid ); + $element->load(); + + // Fix old stuff: + $text = str_replace('{{'.$elid.'}}', + '{{'.$element->name.'}}', + $text ); + $text = str_replace('{{->'.$elid.'}}', + '{{goto.'.$element->name.'}}', + $text ); + $text = str_replace('{{IFEMPTY:'.$elid.':BEGIN}}', + '{{^'.$element->name.'}}', + $text ); + $text = str_replace('{{IFEMPTY:'.$elid.':END}}', + '{{/'.$element->name.'}}', + $text ); + $text = str_replace('{{IFNOTEMPTY:'.$elid.':BEGIN}}', + '{{#'.$element->name.'}}', + $text ); + $text = str_replace('{{IFNOTEMPTY:'.$elid.':END}}', + '{{/'.$element->name.'}}', + $text ); + } + + $models[ $modelId ] = array( + 'name' => $modelName, + 'source' => $text, + 'modelid' => $modelId + ); + } + + $this->setTemplateVar( 'models',$models ); + + + } + public function post() { + } +} diff --git a/modules/cms/action/template/TemplateExtensionAction.class.php b/modules/cms/action/template/TemplateExtensionAction.class.php @@ -0,0 +1,43 @@ +<?php +namespace cms\action\template; +use cms\action\Method; +use cms\action\TemplateAction; +use cms\model\Project; +use cms\model\TemplateModel; + + +class TemplateExtensionAction extends TemplateAction implements Method { + public function view() { + } + public function post() { + $project = new Project( $this->template->projectid ); + $models = $project->getModels(); + + $extensions = array(); + foreach( $models as $modelId => $modelName ) { + + $input = $this->getRequestVar( $modelName ); + + // Validierung: Werte dürfen nicht doppelt vorkommen. + if ( in_array($input, $extensions) ) + { + $this->addNotice('template', 0, $this->template->name, 'DUPLICATE_INPUT', 'error'); + throw new \util\exception\ValidationException( $modelName ); + } + + $extensions[ $modelId ] = $input; + } + + foreach( $models as $modelId => $modelName ) { + + $templatemodel = new TemplateModel($this->template->templateid, $modelId); + $templatemodel->load(); + + $templatemodel->extension = $extensions[ $modelId ]; + + $templatemodel->save(); + } + + $this->addNotice('template', 0, $this->template->name, 'SAVED', 'ok'); + } +} diff --git a/modules/cms/action/template/TemplateInfoAction.class.php b/modules/cms/action/template/TemplateInfoAction.class.php @@ -0,0 +1,27 @@ +<?php +namespace cms\action\template; +use cms\action\Method; +use cms\action\TemplateAction; +use cms\model\Page; + + +class TemplateInfoAction extends TemplateAction implements Method { + public function view() { + $pages = array(); + $pageids = $this->template->getDependentObjectIds(); + + foreach( $pageids as $pageid ) + { + $page = new Page($pageid); + $page->load(); + + $pages[$pageid] = $page->filename; + } + + $this->setTemplateVar('pages',$pages); + $this->setTemplateVar('id' ,$this->template->getId() ); + $this->setTemplateVar('name' ,$this->template->getName() ); + } + public function post() { + } +} diff --git a/modules/cms/action/template/TemplateListingAction.class.php b/modules/cms/action/template/TemplateListingAction.class.php @@ -0,0 +1,29 @@ +<?php +namespace cms\action\template; +use cms\action\Method; +use cms\action\TemplateAction; +use cms\model\Project; +use util\Html; + + +class TemplateListingAction extends TemplateAction implements Method { + + public function view() { + $list = array(); + + $project = new Project( $this->template->projectid ); + + foreach( $project->getTemplates() as $id=>$name ) + { + $list[$id] = array(); + $list[$id]['name'] = $name; + $list[$id]['url' ] = Html::url('template','el',$id,array()); + } + +// $var['templatemodelid'] = htmlentities( $id ); +// $var['text'] = htmlentities( $text ); + $this->setTemplateVar('templates',$list); + } + public function post() { + } +} diff --git a/modules/cms/action/template/TemplatePreviewAction.class.php b/modules/cms/action/template/TemplatePreviewAction.class.php @@ -0,0 +1,27 @@ +<?php +namespace cms\action\template; +use cms\action\Method; +use cms\action\RequestParams; +use cms\action\TemplateAction; +use cms\model\Project; +use util\Html; + + +class TemplatePreviewAction extends TemplateAction implements Method { + + public function view() { + $project = new Project( $this->template->projectid); + + $this->setTemplateVar('models',$project->getModels() ); + + $modelId = $this->request->getRequestVar(RequestParams::PARAM_MODEL_ID); + if ( ! $modelId ) + $modelId = Project::create( $this->template->projectid )->getDefaultModelId(); + + $this->setTemplateVar('modelid' ,$modelId); + + $this->setTemplateVar('preview_url',Html::url('template','show',$this->template->templateid,array('target'=>'none','modelid'=>$modelId ) ) ); + } + public function post() { + } +} diff --git a/modules/cms/action/template/TemplatePropAction.class.php b/modules/cms/action/template/TemplatePropAction.class.php @@ -0,0 +1,30 @@ +<?php +namespace cms\action\template; +use cms\action\Action; +use cms\action\Method; +use cms\action\TemplateAction; + + +class TemplatePropAction extends TemplateAction implements Method { + + public function view() { + $this->setTemplateVar('name' , $this->template->name ); + $this->setTemplateVar('extension','' ); + $this->setTemplateVar('mime_type','' ); + } + public function post() { + + if ($this->getRequestVar('name') == "") + { + $this->addValidationError('name'); + $this->callSubAction('name'); + return; + } + else + { + $this->template->name = $this->getRequestVar('name'); + $this->template->save(); + $this->addNotice('template', 0, $this->template->name, 'SAVED', Action::NOTICE_OK); + } + } +} diff --git a/modules/cms/action/template/TemplatePubAction.class.php b/modules/cms/action/template/TemplatePubAction.class.php @@ -0,0 +1,40 @@ +<?php +namespace cms\action\template; +use cms\action\Method; +use cms\action\TemplateAction; +use cms\model\Acl; +use cms\model\Page; +use util\Session; + + +class TemplatePubAction extends TemplateAction implements Method { + public function view() { + + } + public function post() { + $objectIds = $this->template->getDependentObjectIds(); + + Session::close(); + + // FIXME use generators + $publisher = new PublishPublic( $this->template->projectid ); + + foreach( $objectIds as $objectid ) + { + $page = new Page( $objectid ); + $page->load(); + + if ( !$page->hasRight( Acl::ACL_PUBLISH ) ) + continue; + + $page->publisher = $publisher; + $page->publish(); + } + + $this->addNotice('template', 0, $this->template->name, 'PUBLISHED', Action::NOTICE_OK, array(), array_map(function ($obj) { + return $obj['full_filename']; + }, $publisher->publishedObjects)); + + $publisher->close(); + } +} diff --git a/modules/cms/action/template/TemplateRemoveAction.class.php b/modules/cms/action/template/TemplateRemoveAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\template; +use cms\action\Action; +use cms\action\Method; +use cms\action\TemplateAction; + + +class TemplateRemoveAction extends TemplateAction implements Method { + public function view() { + $this->setTemplateVar('name',$this->template->name); + } + public function post() { + if ( $this->getRequestVar('delete') != '' ) + { + $this->template->delete(); + $this->addNotice('template', 0, $this->template->name, 'DELETED', Action::NOTICE_OK); + } + else + { + $this->addNotice('template', 0, $this->template->name, 'CANCELED', Action::NOTICE_WARN); + } + } +} diff --git a/modules/cms/action/template/TemplateShowAction.class.php b/modules/cms/action/template/TemplateShowAction.class.php @@ -0,0 +1,52 @@ +<?php +namespace cms\action\template; +use cms\action\Method; +use cms\action\RequestParams; +use cms\action\TemplateAction; +use cms\model\Element; +use cms\model\Project; +use cms\model\TemplateModel; + + +class TemplateShowAction extends TemplateAction implements Method { + public function view() { + $modelId = $this->request->getRequestVar(RequestParams::PARAM_MODEL_ID); + if ( ! $modelId ) + $modelId = Project::create( $this->template->projectid )->getDefaultModelId(); + + $templatemodel = new TemplateModel($this->template->templateid, $modelId); + $templatemodel->load(); + + header('Content-Type: '.$templatemodel->mimeType().'; charset=UTF-8' ); + $text = $templatemodel->src; + + foreach( $this->template->getElementIds() as $elid ) + { + $element = new Element( $elid ); + $element->load(); + + $text = str_replace('{{'.$elid.'}}',$element->name, + $text ); + $text = str_replace('{{->'.$elid.'}}','', + $text ); + + $text = str_replace('{{IFEMPTY:'.$elid.':BEGIN}}','', + $text ); + $text = str_replace('{{IFEMPTY:'.$elid.':END}}','', + $text ); + + $text = str_replace('{{IFNOTEMPTY:'.$elid.':BEGIN}}','', + $text ); + $text = str_replace('{{IFNOTEMPTY:'.$elid.':END}}','', + $text ); + + unset( $element ); + } + + $this->setTemplateVar('text',$text); + } + + + public function post() { + } +} diff --git a/modules/cms/action/template/TemplateSrcAction.class.php b/modules/cms/action/template/TemplateSrcAction.class.php @@ -0,0 +1,82 @@ +<?php +namespace cms\action\template; +use cms\action\Action; +use cms\action\Method; +use cms\action\RequestParams; +use cms\action\TemplateAction; +use cms\model\Element; +use cms\model\Project; +use cms\model\TemplateModel; + + +class TemplateSrcAction extends TemplateAction implements Method { + public function view() { + $project = new Project( $this->template->projectid ); + $modelId = $this->getRequestId('modelid'); + + $modelSrc = array(); + + $templatemodel = new TemplateModel( $this->template->templateid, $modelId ); + $templatemodel->load(); + + $text = $templatemodel->src; + + foreach( $this->template->getElementIds() as $elid ) + { + $element = new Element( $elid ); + $element->load(); + + // Fix old stuff: + $text = str_replace('{{'.$elid.'}}', + '{{'.$element->name.'}}', + $text ); + $text = str_replace('{{->'.$elid.'}}', + '{{goto.'.$element->name.'}}', + $text ); + $text = str_replace('{{IFEMPTY:'.$elid.':BEGIN}}', + '{{^'.$element->name.'}}', + $text ); + $text = str_replace('{{IFEMPTY:'.$elid.':END}}', + '{{/'.$element->name.'}}', + $text ); + $text = str_replace('{{IFNOTEMPTY:'.$elid.':BEGIN}}', + '{{#'.$element->name.'}}', + $text ); + $text = str_replace('{{IFNOTEMPTY:'.$elid.':END}}', + '{{/'.$element->name.'}}', + $text ); + } + + $this->setTemplateVar( 'modelid',$modelId ); + $this->setTemplateVar( 'source' ,$text ); + $this->setTemplateVar( 'extension',$templatemodel->extension ); + } + + + public function post() { + $modelId = $this->getRequestId('modelid'); + + $templatemodel = new TemplateModel($this->template->templateid, $modelId); + $templatemodel->load(); + + $newSource = $this->request->getRequestVar('source',RequestParams::FILTER_RAW); + + /* + // Not useful any more. Technical name of a element should not be changed. + foreach ($this->template->getElementNames() as $elid => $elname) { + $newSource = str_replace('{{' . $elname . '}}', '{{' . $elid . '}}', $newSource); + $newSource = str_replace('{{->' . $elname . '}}', '{{->' . $elid . '}}', $newSource); + $newSource = str_replace('{{' . \cms\base\Language::lang('TEMPLATE_SRC_IFEMPTY') . ':' . $elname . ':' . \cms\base\Language::lang('TEMPLATE_SRC_BEGIN') . '}}', '{{IFEMPTY:' . $elid . ':BEGIN}}', $newSource); + $newSource = str_replace('{{' . \cms\base\Language::lang('TEMPLATE_SRC_IFEMPTY') . ':' . $elname . ':' . \cms\base\Language::lang('TEMPLATE_SRC_END') . '}}', '{{IFEMPTY:' . $elid . ':END}}', $newSource); + $newSource = str_replace('{{' . \cms\base\Language::lang('TEMPLATE_SRC_IFNOTEMPTY') . ':' . $elname . ':' . \cms\base\Language::lang('TEMPLATE_SRC_BEGIN') . '}}', '{{IFNOTEMPTY:' . $elid . ':BEGIN}}', $newSource); + $newSource = str_replace('{{' . \cms\base\Language::lang('TEMPLATE_SRC_IFNOTEMPTY') . ':' . $elname . ':' . \cms\base\Language::lang('TEMPLATE_SRC_END') . '}}', '{{IFNOTEMPTY:' . $elid . ':END}}', $newSource); + } + */ + + $templatemodel->src = $newSource; + $templatemodel->extension = $this->getRequestVar('extension'); + $templatemodel->save(); + + $this->addNotice('template', 0, $this->template->name, 'SAVED', Action::NOTICE_OK); + } +} diff --git a/modules/cms/action/template/TemplateSrcelementAction.class.php b/modules/cms/action/template/TemplateSrcelementAction.class.php @@ -0,0 +1,53 @@ +<?php +namespace cms\action\template; +use cms\action\Method; +use cms\action\RequestParams; +use cms\action\TemplateAction; +use cms\model\Element; +use language\Messages; +use util\exception\ValidationException; + + +class TemplateSrcelementAction extends TemplateAction implements Method { + public function view() { + $elements = array(); + $writable_elements = array(); + + foreach( $this->template->getElementIds() as $elid ) + { + $element = new Element( $elid ); + $element->load(); + + $elements[$elid] = $element->name; + + if ( $element->isWritable() ) + $writable_elements[$elid] = $element->name; + } + + $this->setTemplateVar('elements' ,$elements ); + $this->setTemplateVar('writable_elements',$writable_elements); + } + + + + public function post() { + $tplModel = $this->template->loadTemplateModelFor( $this->request->getRequestVar(RequestParams::PARAM_MODEL_ID)); + + $elementToAdd = new Element( $this->getRequestVar('elementid') ); + $elementToAdd->load(); + + switch( $this->getRequestVar('type') ) + { + case 'addelement': + $tplModel->src .= "\n".'{{'.$elementToAdd->name.'}}'; + break; + + default: + throw new ValidationException('type'); + } + + $tplModel->save(); + + $this->addNoticeFor($this->template,Messages::SAVED); + } +} diff --git a/modules/cms/action/templatelist/TemplatelistAddAction.class.php b/modules/cms/action/templatelist/TemplatelistAddAction.class.php @@ -0,0 +1,133 @@ +<?php +namespace cms\action\templatelist; +use cms\action\Method; +use cms\action\TemplatelistAction; +use cms\model\Element; +use cms\model\Template; +use language\Messages; + +class TemplatelistAddAction extends TemplatelistAction implements Method { + + + public function view() { + $this->setTemplateVar( 'templates',$this->project->getTemplates() ); + $this->setTemplateVar( 'copytemplateid','' ); + + /* + $examples = array(); + $dir = opendir( 'examples/templates'); + while( $file = readdir($dir) ) + { + if ( substr($file,0,1) != '.') + { + $examples[$file] = $file; + } + } + + $this->setTemplateVar( 'examples',$examples ); + $this->setTemplateVar( 'example','' ); + */ + + } + + + public function post() { + + $name = $this->getRequestVar('name'); + + // create a new template. + $template = new Template(); + $template->projectid = $this->project->projectid; + $template->name = $name; + $template->add(); + + $this->addNoticeFor($template, Messages::ADDED); + + $copytemplateid = $this->getRequestId('copytemplateid'); + if ( $copytemplateid ) { + + // Template kopieren. + $copyTemplate = new Template( $copytemplateid ); + $copyTemplate->load(); + + // Copy all elements + foreach( $copyTemplate->getElements() as $element ) + { + /* @type $element Element */ + $element->load(); + $element->templateid = $template->templateid; + $element->add(); + $element->save(); + } + + // copy all template models + foreach( $this->project->getModelIds() as $modelid ) + { + // Template laden + $copyTemplate->load(); + + $copyTemplateModel = $copyTemplate->loadTemplateModelFor( $modelid ); + + $newTemplateModel = $template->loadTemplateModelFor( $modelid ); + $newTemplateModel->src = $copyTemplateModel->src; + $newTemplateModel->extension = $copyTemplateModel->extension; + $newTemplateModel->save(); + } + + $this->addNoticeFor( $copyTemplate, Messages::COPIED); + + /* + case 'example': + + // Neues Template anlegen. + $template = new Template(); + $template->projectid = $this->project->projectid; + + $template->add( $this->getRequestVar('name') ); + + $templateModel = $template->loadTemplateModelFor( $this->project->getDefaultModelId() ); + + // FIXME + $example = parse_ini_file('examples/templates/'.$this->getRequestVar('example'),true); + + foreach( $example as $exampleKey=>$exampleElement ) + { + if ( !is_array($exampleElement) ) + { + $template->$exampleKey = $exampleElement; + } + else + { + $element = new Element(); + $element->templateid = $template->templateid; + $element->name = $exampleKey; + $element->writable = true; + $element->add(); + + foreach( $exampleElement as $ePropName=>$ePropValue) + $element->$ePropName = $ePropValue; + + $element->defaultText = str_replace(';',"\n",$element->defaultText); + $element->save(); + } + } + $template->name = $this->getRequestVar('name'); + $templateModel->src = str_replace(';',"\n",$templateModel->src); + + foreach( $template->getElementNames() as $elid=>$elname ) + { + $templateModel->src = str_replace('{{'.$elname.'}}' ,'{{'.$elid.'}}' ,$templateModel->src ); + $templateModel->src = str_replace('{{->'.$elname.'}}','{{->'.$elid.'}}',$templateModel->src ); + } + + $template->save(); + $templateModel->save(); + + $this->addNotice('template', 0, $template->name, 'ADDED', 'ok'); + + break; +*/ + } + + } +} diff --git a/modules/cms/action/templatelist/TemplatelistEditAction.class.php b/modules/cms/action/templatelist/TemplatelistEditAction.class.php @@ -0,0 +1,12 @@ +<?php +namespace cms\action\templatelist; +use cms\action\Method; +use cms\action\TemplatelistAction; + +class TemplatelistEditAction extends TemplatelistAction implements Method { + public function view() { + $this->nextSubAction('show'); + } + public function post() { + } +} diff --git a/modules/cms/action/templatelist/TemplatelistShowAction.class.php b/modules/cms/action/templatelist/TemplatelistShowAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\templatelist; +use cms\action\Method; +use cms\action\TemplatelistAction; + +class TemplatelistShowAction extends TemplatelistAction implements Method { + public function view() { + $list = array(); + + foreach( $this->project->getTemplates() as $id=>$name ) + { + $list[$id] = array(); + $list[$id]['name'] = $name; + $list[$id]['id' ] = $id; + } + + $this->setTemplateVar('templates',$list); + } + + + public function post() { + } +} diff --git a/modules/cms/action/text/TextPreviewAction.class.php b/modules/cms/action/text/TextPreviewAction.class.php @@ -0,0 +1,19 @@ +<?php +namespace cms\action\text; +use cms\action\Method; +use cms\action\TextAction; + + +class TextPreviewAction extends TextAction implements Method { + + + public function view() + { + $this->setTemplateVar('text', $this->text->loadValue()); + + parent::previewView(); + } + + public function post() { + } +} diff --git a/modules/cms/action/text/TextShowAction.class.php b/modules/cms/action/text/TextShowAction.class.php @@ -0,0 +1,13 @@ +<?php +namespace cms\action\text; +use cms\action\Method; +use cms\action\TextAction; + +class TextShowAction extends TextAction implements Method { + public function view() { + + parent::showView(); + } + public function post() { + } +} diff --git a/modules/cms/action/text/TextValueAction.class.php b/modules/cms/action/text/TextValueAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\text; +use cms\action\Method; +use cms\action\RequestParams; +use cms\action\TextAction; +use language\Messages; + + +class TextValueAction extends TextAction implements Method { + public function view() { + $this->setTemplateVar( 'text', $this->text->loadValue() ); + + parent::valueView(); + } + + public function post() { + $this->text->value = $this->getRequestVar('text', RequestParams::FILTER_RAW); + $this->text->saveValue(); + + $this->addNoticeFor($this->text,Messages::VALUE_SAVED); + $this->text->setTimestamp(); + } +} diff --git a/modules/cms/action/url/UrlEditAction.class.php b/modules/cms/action/url/UrlEditAction.class.php @@ -0,0 +1,17 @@ +<?php +namespace cms\action\url; +use cms\action\Method; +use cms\action\UrlAction; + + +class UrlEditAction extends UrlAction implements Method { + public function view() { + $this->setTemplateVars( $this->url->getProperties() ); + + // Typ der Verknuepfung + $this->setTemplateVar('type' ,$this->url->getType() ); + $this->setTemplateVar('url' ,$this->url->url ); + } + public function post() { + } +} diff --git a/modules/cms/action/url/UrlPreviewAction.class.php b/modules/cms/action/url/UrlPreviewAction.class.php @@ -0,0 +1,13 @@ +<?php +namespace cms\action\url; +use cms\action\Method; +use cms\action\UrlAction; + + +class UrlPreviewAction extends UrlAction implements Method { + public function view() { + $this->setTemplateVar('preview_url',$this->url->url ); + } + public function post() { + } +} diff --git a/modules/cms/action/url/UrlRemoveAction.class.php b/modules/cms/action/url/UrlRemoveAction.class.php @@ -0,0 +1,24 @@ +<?php +namespace cms\action\url; +use cms\action\Action; +use cms\action\Method; +use cms\action\UrlAction; + + +class UrlRemoveAction extends UrlAction implements Method { + public function view() { + $this->setTemplateVar( 'name',$this->url->filename ); + } + public function post() { + + if ( $this->getRequestVar('delete') != '' ) + { + $this->url->delete(); + $this->addNotice('url', 0, $this->url->filename, 'DELETED', Action::NOTICE_OK); + } + else + { + $this->addNotice('url', 0, $this->url->filename, 'CANCELED', Action::NOTICE_WARN); + } + } +} diff --git a/modules/cms/action/url/UrlShowAction.class.php b/modules/cms/action/url/UrlShowAction.class.php @@ -0,0 +1,31 @@ +<?php +namespace cms\action\url; +use cms\action\Method; +use cms\action\UrlAction; + + +class UrlShowAction extends UrlAction implements Method { + + + public function view() { + // Angabe Content-Type + header('Content-Type: text/html' ); + + header('X-Url-Id: ' .$this->url->urlid ); + header('X-Id: ' .$this->url->id ); + header('Content-Description: '.$this->url->filename() ); + + echo '<html><body>'; + echo '<h1>'.$this->url->filename.'</h1>'; + echo '<hr />'; + echo '<a href="'.$this->url->url.'">'.$this->url->url.'</a>'; + echo '</body></html>'; + + exit; + + } + + + public function post() { + } +} diff --git a/modules/cms/action/url/UrlValueAction.class.php b/modules/cms/action/url/UrlValueAction.class.php @@ -0,0 +1,26 @@ +<?php +namespace cms\action\url; +use cms\action\Method; +use cms\action\UrlAction; +use language\Messages; + + +class UrlValueAction extends UrlAction implements Method { + + + public function view() { + $this->setTemplateVars( $this->url->getProperties() ); + + // Typ der Verknuepfung + $this->setTemplateVar('type' ,$this->url->getType() ); + $this->setTemplateVar('url' ,$this->url->url ); + } + + + public function post() { + $this->url->url = $this->getRequestVar('url'); + $this->url->save(); + + $this->addNoticeFor( $this->url,Messages::SAVED ); + } +} diff --git a/modules/cms/action/user/UserAddgrouptouserAction.class.php b/modules/cms/action/user/UserAddgrouptouserAction.class.php @@ -0,0 +1,20 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use cms\model\Group; +use language\Messages; + +class UserAddgrouptouserAction extends UserAction implements Method { + public function view() { + + } + public function post() { + $group = new Group( $this->request->getRequiredRequestId('groupid' ) ); + $group->load(); + + $this->user->addGroup( $group->groupid ); + + $this->addNoticeFor( $this->user, Messages::ADDED); + } +} diff --git a/modules/cms/action/user/UserHistoryAction.class.php b/modules/cms/action/user/UserHistoryAction.class.php @@ -0,0 +1,24 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use cms\model\BaseObject; + +class UserHistoryAction extends UserAction implements Method { + public function view() { + $lastChanges = $this->user->getLastChanges(); + + $timeline = array(); + + foreach( $lastChanges as $entry ) + { + $timeline[ $entry['objectid'] ] = $entry; + $baseObject = new BaseObject( $entry['objectid']); + $baseObject->objectLoad(); + $timeline[ $entry['objectid'] ]['type'] = $baseObject->getType(); + } + $this->setTemplateVar('timeline', $timeline); + } + public function post() { + } +} diff --git a/modules/cms/action/user/UserInfoAction.class.php b/modules/cms/action/user/UserInfoAction.class.php @@ -0,0 +1,53 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use cms\base\Configuration; +use cms\base\Startup; +use security\Base2n; +use security\Password; + + +class UserInfoAction extends UserAction implements Method { + public function view() { + $this->setTemplateVars( $this->user->getProperties() ); + + $gravatarConfig = Configuration::subset(['interface','gravatar'] ); + + + if ( $gravatarConfig->is('enabled',true) && $this->user->mail ) + { + $url = 'http://www.gravatar.com/avatar/'.md5($this->user->mail).'?'; + + $url .= '&s='.$gravatarConfig->get('size' ,80 ); + $url .= '&d='.$gravatarConfig->get('default',404); + $url .= '&r='.$gravatarConfig->get('rating' ,'g'); + + $this->setTemplateVar( 'image', $url ); + } else { + $this->setTemplateVar( 'image', 'about:blank' ); + } + + + + + $issuer = urlencode(Configuration::subset('application')->get('operator',Startup::TITLE)); + $account = $this->user->name.'@'.$_SERVER['SERVER_NAME']; + + $base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', FALSE, TRUE, TRUE); + $secret = $base32->encode(@hex2bin($this->user->otpSecret)); + + $counter = $this->user->hotpCount; + + $this->setTemplateVars( + $this->user->getProperties() + + array('totpSecretUrl' => "otpauth://totp/{$issuer}:{$account}?secret={$secret}&issuer={$issuer}", + 'hotpSecretUrl' => "otpauth://hotp/{$issuer}:{$account}?secret={$secret}&issuer={$issuer}&counter={$counter}" + ) + + array('totpToken'=>Password::getTOTPCode($this->user->otpSecret)) + ); + + } + public function post() { + } +} diff --git a/modules/cms/action/user/UserListingAction.class.php b/modules/cms/action/user/UserListingAction.class.php @@ -0,0 +1,21 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use cms\model\User; + +class UserListingAction extends UserAction implements Method { + public function view() { + $list = array(); + + foreach( User::getAllUsers() as $user ) + { + /* @var $user User */ + $list[$user->userid] = $user->getProperties(); + } + $this->setTemplateVar('el',$list); + } + + public function post() { + } +} diff --git a/modules/cms/action/user/UserMembershipsAction.class.php b/modules/cms/action/user/UserMembershipsAction.class.php @@ -0,0 +1,57 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use cms\model\Group; + + +class UserMembershipsAction extends UserAction implements Method { + public function view() { + $gruppenListe = array(); + + $allGroups = Group::getAll(); + $userGroups = $this->user->getGroups(); + + foreach( $allGroups as $id=>$name ) + { + + $hasGroup = array_key_exists($id,$userGroups); + $varName = 'group'.$id; + $gruppenListe[$id] = array('name' =>$name, + 'id' =>$id, + 'var' =>$varName, + 'member' =>$hasGroup + ); + $this->setTemplateVar($varName,$hasGroup); + } + $this->setTemplateVar('memberships',$gruppenListe); + } + + public function post() { + $allGroups = Group::getAll(); + $userGroups = $this->user->getGroups(); + $aenderung = false; + + foreach( $allGroups as $id=>$name ) + { + $hasGroup = array_key_exists($id,$userGroups); + + if ( !$hasGroup && $this->hasRequestVar('group'.$id) ) + { + $this->user->addGroup($id); + $this->addNotice('group', 0, $name, 'ADDED'); + $aenderung = true; + } + + if ( $hasGroup && !$this->hasRequestVar('group'.$id) ) + { + $this->user->delGroup($id); + $this->addNotice('group', 0, $name, 'DELETED'); + $aenderung = true; + } + } + + if ( ! $aenderung ) + $this->addNotice('group', 0, $name, 'NOTHING_DONE'); + } +} diff --git a/modules/cms/action/user/UserPropAction.class.php b/modules/cms/action/user/UserPropAction.class.php @@ -0,0 +1,67 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use cms\base\Configuration; +use cms\base\Startup; +use language\Messages; +use security\Base2n; +use security\Password; + + +class UserPropAction extends UserAction implements Method { + public function view() { + $issuer = urlencode(Configuration::subset('application')->get('operator',Startup::TITLE)); + $account = $this->user->name.'@'.$_SERVER['SERVER_NAME']; + + $base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', FALSE, TRUE, TRUE); + $secret = $base32->encode(@hex2bin($this->user->otpSecret)); + + $counter = $this->user->hotpCount; + + $this->setTemplateVars( + $this->user->getProperties() + + array('totpSecretUrl' => "otpauth://totp/{$issuer}:{$account}?secret={$secret}&issuer={$issuer}", + 'hotpSecretUrl' => "otpauth://hotp/{$issuer}:{$account}?secret={$secret}&issuer={$issuer}&counter={$counter}" + ) + + array('totpToken'=>Password::getTOTPCode($this->user->otpSecret)) + ); + + $this->setTemplateVar( 'allstyles',$this->user->getAvailableStyles() ); + + $this->setTemplateVar('timezone_list',timezone_identifiers_list() ); + + $languages = Messages::$AVAILABLE_LANGUAGES; + foreach($languages as $id=>$name) + { + unset($languages[$id]); + $languages[$name] = $name; + } + $this->setTemplateVar('language_list',$languages); + + } + + public function post() { + if ( ! $this->getRequestVar('name') ) + throw new \util\exception\ValidationException( 'name'); + + // Benutzer speichern + $this->user->name = $this->getRequestVar('name' ); + $this->user->fullname = $this->getRequestVar('fullname'); + $this->user->isAdmin = $this->hasRequestVar('is_admin'); + $this->user->tel = $this->getRequestVar('tel' ); + $this->user->desc = $this->getRequestVar('desc' ); + $this->user->language = $this->getRequestVar('language'); + $this->user->timezone = $this->getRequestVar('timezone'); + $this->user->hotp = $this->hasRequestVar('hotp' ); + $this->user->totp = $this->hasRequestVar('totp' ); + + if ( Configuration::get(['security','user','show_admin_mail']) ) + $this->user->mail = $this->getRequestVar('mail' ); + + $this->user->style = $this->getRequestVar('style' ); + + $this->user->save(); + $this->addNotice('user', 0, $this->user->name, 'SAVED', 'ok'); + } +} diff --git a/modules/cms/action/user/UserPwAction.class.php b/modules/cms/action/user/UserPwAction.class.php @@ -0,0 +1,42 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use cms\base\Configuration; +use cms\model\User; +use language\Messages; +use util\exception\ValidationException; + + +class UserPwAction extends UserAction implements Method { + public function view() { + $this->setTemplateVar('enabled',$this->user->type == User::AUTH_TYPE_INTERNAL ); + + $this->setTemplateVar('password_proposal', $this->user->createPassword() ); + } + + + public function post() { + $password = $this->getRequestVar('password'); + + if ( !$password ) + $password = $this->getRequestVar('password_proposal'); + + if ( strlen($password) < Configuration::subset(['security','password'])->get('min_length',8) ) + throw new ValidationException('password',Messages::PASSWORD_MINLENGTH ); + + $this->user->setPassword($password,!$this->hasRequestVar('timeout') ); // Kennwort setzen + + // E-Mail mit dem neuen Kennwort an Benutzer senden + if ( $this->hasRequestVar('email') && + $this->user->mail && // user has an e-mail. + Configuration::subset('mail')->is('enabled',true) + ) { + $this->mailPw( $password ); + $this->addNoticeFor( $this->user, Messages::MAIL_SENT); + } + + $this->addNoticeFor($this->user, Messages::SAVED); + + } +} diff --git a/modules/cms/action/user/UserRemoveAction.class.php b/modules/cms/action/user/UserRemoveAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use language\Messages; + + +class UserRemoveAction extends UserAction implements Method { + public function view() { + $this->setTemplateVars( $this->user->getProperties() ); + } + public function post() { + $this->user->delete(); + $this->addNoticeFor( $this->user ,Messages::DELETED); + } +} diff --git a/modules/cms/action/user/UserRightsAction.class.php b/modules/cms/action/user/UserRightsAction.class.php @@ -0,0 +1,89 @@ +<?php +namespace cms\action\user; +use cms\action\Action; +use cms\action\Method; +use cms\action\UserAction; +use cms\model\Acl; +use cms\model\BaseObject; +use cms\model\Group; +use cms\model\Language; +use cms\model\Project; +use cms\model\User; + + +class UserRightsAction extends UserAction implements Method { + public function view() { + $rights = $this->user->getAllAcls(); + + $projects = array(); + + foreach( $rights as $acl ) + { + /* @var $acl Acl */ + if ( !isset($projects[$acl->projectid])) + { + $p = Project::create( $acl->projectid ); + + $projects[$acl->projectid] = array(); + $projects[$acl->projectid]['projectname'] = $p->load()->name; + $projects[$acl->projectid]['rights' ] = array(); + } + + $right = array(); + + if ( $acl->languageid > 0 ) + { + $language = new Language($acl->languageid); + $language->load(); + $right['languagename'] = $language->name; + } + else + { + $right['languagename'] = \cms\base\Language::lang('ALL_LANGUAGES'); + } + + + $o = new BaseObject($acl->objectid); + $o->objectLoad(); + $right['objectname'] = $o->name; + $right['objectid' ] = $o->objectid; + $right['objecttype'] = $o->getType(); + + if ( $acl->userid > 0 ) + { + $user = new User($acl->userid); + $user->load(); + $right['username'] = $user->name; + } + elseif ( $acl->groupid > 0 ) + { + $group = new Group($acl->groupid); + $group->load(); + $right['groupname'] = $group->name; + } + else + { + ; + // Berechtigung fuer "alle". + } + +// $show = array(); +// foreach( $acl->getProperties() as $p=>$set) +// $show[$p] = $set; +// +// $right['show'] = $show; + $right['bits'] = $acl->getProperties(); + + $projects[$acl->projectid]['rights'][] = $right; + } + + $this->setTemplateVar('projects' ,$projects ); + + $this->setTemplateVar('show',Acl::getAvailableRights() ); + + if ( $this->user->isAdmin ) + $this->addNotice('user', 0, $this->user->name, 'ADMIN_NEEDS_NO_RIGHTS', Action::NOTICE_WARN); + } + public function post() { + } +} diff --git a/modules/cms/action/user/UserSwitchAction.class.php b/modules/cms/action/user/UserSwitchAction.class.php @@ -0,0 +1,19 @@ +<?php +namespace cms\action\user; +use cms\action\Method; +use cms\action\UserAction; +use language\Messages; +use util\Session; + + +class UserSwitchAction extends UserAction implements Method { + public function view() { + $this->setTemplateVar('username',$this->user->getName() ); + } + public function post() { + $this->addNoticeFor( $this->user,Messages::USER_LOGIN ); + + // Und in der Sitzung speichern. + Session::setUser( $this->user ); + } +} diff --git a/modules/cms/action/userlist/UserlistAddAction.class.php b/modules/cms/action/userlist/UserlistAddAction.class.php @@ -0,0 +1,27 @@ +<?php +namespace cms\action\userlist; +use cms\action\Method; +use cms\action\RequestParams; +use cms\action\UserlistAction; +use cms\model\User; +use language\Messages; +use util\exception\ValidationException; + +class UserlistAddAction extends UserlistAction implements Method { + public function view() { + } + public function post( ) { + $name = $this->getRequestVar('name'); + $name = $this->request->cleanText($name,RequestParams::FILTER_ALPHANUM); + + $user = User::loadWithName($name,User::AUTH_TYPE_INTERNAL); + + if ( !empty($user) ) + throw new ValidationException( 'name',Messages::USER_ALREADY_IN_DATABASE); + + $user = new User(); + $user->name = $name; + $user->add(); + $this->addNoticeFor($user, Messages::ADDED); + } +} diff --git a/modules/cms/action/userlist/UserlistEditAction.class.php b/modules/cms/action/userlist/UserlistEditAction.class.php @@ -0,0 +1,23 @@ +<?php +namespace cms\action\userlist; +use cms\action\Method; +use cms\action\UserlistAction; +use cms\model\User; + +class UserlistEditAction extends UserlistAction implements Method { + + public function view() { + $list = array(); + + foreach( User::getAllUsers() as $user ) + { + $list[$user->userid] = $user->getProperties(); + $list[$user->userid]['id' ] = $user->userid; + } + $this->setTemplateVar('list',$list); + } + + + public function post() { + } +} diff --git a/modules/cms/model/File.class.php b/modules/cms/model/File.class.php @@ -49,7 +49,7 @@ class File extends BaseObject public $tmpfile; - protected static $MIME_TYPES = [ + public static $MIME_TYPES = [ 'ez' => 'application/andrew-inset', 'csm' => 'application/cu-seeme', 'cu' => 'application/cu-seeme', diff --git a/modules/cms/ui/action/IndexAction.class.php b/modules/cms/ui/action/IndexAction.class.php @@ -186,7 +186,7 @@ class IndexAction extends Action * * @return string */ - private function getStyleLink() + protected function getStyleLink() { // Ok, for now there is only 1 CSS file, which contains all UI styles. return Startup::THEMES_DIR . 'default/'.(PRODUCTION?Theme::STYLE_MINIFIED_FILENAME:Theme::STYLE_FILENAME); @@ -209,7 +209,7 @@ class IndexAction extends Action * * @return string */ - private function getThemeCSS() + protected function getThemeCSS() { // Je Theme die Theme-CSS-Datei ausgeben. $lessFile = Startup::THEMES_DIR . 'default/style/theme/openrat-theme.less'; @@ -263,7 +263,7 @@ class IndexAction extends Action * * @return string */ - private function getScriptLink() + protected function getScriptLink() { return Startup::THEMES_DIR . 'default/'.(PRODUCTION?Theme::SCRIPT_MINIFIED_FILENAME:Theme::SCRIPT_FILENAME); } @@ -274,7 +274,7 @@ class IndexAction extends Action * @param $action * @param $id */ - private function updateStartAction( &$action, &$id ) + protected function updateStartAction(&$action, &$id ) { $user = Session::getUser(); @@ -328,7 +328,7 @@ class IndexAction extends Action $id = 0; } - private function tryAutoLogin() + protected function tryAutoLogin() { $username = AuthRunner::getUsername('autologin'); @@ -360,7 +360,7 @@ class IndexAction extends Action * @param User $user * @return \configuration\Config|string */ - private function getUserStyle( $user ) + protected function getUserStyle($user ) { // Theme für den angemeldeten Benuter ermitteln if ( $user && C::subset('style')->has($user->style) ) @@ -376,7 +376,7 @@ class IndexAction extends Action /** * Content-Security-Policy. */ - private function setContentSecurityPolicy() + protected function setContentSecurityPolicy() { $csp = Configuration::subset('security' )->get('csp', [ 'default-src' =>'\'self\'', // Default for all is 'self' (CSS, styles, etc) diff --git a/modules/cms/ui/action/TreeAction.class.php b/modules/cms/ui/action/TreeAction.class.php @@ -80,7 +80,7 @@ class TreeAction extends BaseAction - private function loadTreeBranch( $type ) + protected function loadTreeBranch($type ) { $tree = new Tree(); @@ -128,7 +128,7 @@ class TreeAction extends BaseAction /** * The path to an object. */ - private function calculatePath($type, $id) { + protected function calculatePath($type, $id) { switch( $type ) { @@ -268,7 +268,7 @@ class TreeAction extends BaseAction - private function pathItem( $action, $id = 0, $name = '' ) { + protected function pathItem($action, $id = 0, $name = '' ) { return array('type'=>$this->typeToInternal($action),'action'=>$action ,'id'=>$id,'name'=>$name ); } diff --git a/modules/cms/ui/action/index/IndexManifestAction.class.php b/modules/cms/ui/action/index/IndexManifestAction.class.php @@ -0,0 +1,67 @@ +<?php +namespace cms\ui\action\index; +use cms\action\Method; +use cms\ui\action\IndexAction; +use util\Session; +use cms\action\RequestParams; +use cms\auth\Auth; +use cms\auth\AuthRunner; +use cms\base\Configuration; +use cms\base\Configuration as C; +use cms\base\Startup; +use cms\model\BaseObject; +use cms\model\Project; +use cms\model\User; +use cms\model\Value; +use cms\ui\themes\Theme; +use Exception; +use language\Messages; +use util\Html; +use util\json\JSON; +use logger\Logger; +use util\Less; +use util\UIUtils; +use \util\exception\ObjectNotFoundException; + + +class IndexManifestAction extends IndexAction implements Method { + public function view() { + $user = Session::getUser(); + + if ( $user ) + $this->lastModified( C::subset('config')->get('last_modification_time',time() ) ); + else + $this->lastModified( time() ); + + $style = $this->getUserStyle( $user ); + + $styleConfig = C::Conf()->subset('style-default' ); // default style config + $userStyleConfig = C::subset('style')->subset( $style ); // user style config + + if ( $userStyleConfig->hasContent() ) + $styleConfig->merge( $userStyleConfig ); // Merging user style into default style + else + ; // Unknown style name, we are ignoring this. + + // Theme base color for smartphones colorizing their status bar. + $themeColor = UIUtils::getColorHexCode($styleConfig['title_background_color']); + + + $appName = C::subset(['application'])->get('name',Startup::TITLE); + + $value = array( + 'name' => $appName, + 'description' => $appName, + 'short_name' => 'CMS', + 'display' => 'standalone', + 'orientation' => 'landscape', + 'background_color' => $themeColor, + ); + + header("Content-Type: application/manifest+json"); + $json = new JSON(); + $this->setTemplateVar( 'manifest',$json->encode($value) ); + } + public function post() { + } +} diff --git a/modules/cms/ui/action/index/IndexShowAction.class.php b/modules/cms/ui/action/index/IndexShowAction.class.php @@ -0,0 +1,114 @@ +<?php +namespace cms\ui\action\index; +use cms\action\Method; +use cms\model\User; +use cms\ui\action\IndexAction; +use language\Messages; +use util\Html; +use util\Session; +use util\UIUtils; +use cms\base\Configuration as C; +use cms\action\RequestParams; +use cms\auth\Auth; +use cms\auth\AuthRunner; +use cms\base\Configuration; +use cms\base\Startup; +use cms\model\BaseObject; +use cms\model\Project; +use cms\model\Value; +use cms\ui\themes\Theme; +use Exception; +use util\json\JSON; +use logger\Logger; +use util\Less; +use \util\exception\ObjectNotFoundException; +class IndexShowAction extends IndexAction implements Method { + public function view() { + $this->setContentSecurityPolicy(); + + $user = Session::getUser(); + + // Is a user logged in? + if ( !is_object($user) ) + { + // Lets try an auto login. + $this->tryAutoLogin(); + + $user = Session::getUser(); + } + + $configLastModificationTime = C::subset('config')->get('last_modification_time', 0); + + if ( $user ) + $this->lastModified( max( $user->loginDate, $configLastModificationTime) ); + else + $this->lastModified( $configLastModificationTime ); + + // Theme für den angemeldeten Benuter ermitteln + $style = $this->getUserStyle($user); + + $this->setTemplateVar('style',$style ); + + $userIsLoggedIn = is_object($user); + + // Welche Aktion soll ausgeführt werden? + $action = ''; + $id = 0; + $this->updateStartAction( $action, $id ); + + $this->setTemplateVar('action',$action); + $this->setTemplateVar('id' ,$id ); + + $this->setTemplateVar('scriptLink', $this->getScriptLink() ); + $this->setTemplateVar('styleLink' , $this->getStyleLink() ); + + $this->setTemplateVar('themeStyleLink', Html::url('index','themestyle') ); + $this->setTemplateVar('manifestLink' , Html::url('index','manifest' ) ); + + $styleConfig = C::Conf()->get('style-default',[]); // default style config + $userStyleConfig = C::subset('style')->get( $style,[]); // user style config + + if ( $userStyleConfig ) + $styleConfig = array_merge($styleConfig,$userStyleConfig); // Merging user style into default style + else + ; // Unknown style name, we are ignoring this. + + // Theme base color for smartphones colorizing their status bar. + $this->setTemplateVar('themeColor', UIUtils::getColorHexCode($styleConfig['title_background_color'])); + + $messageOfTheDay = C::subset('login')->get('motd',''); + + if ( $messageOfTheDay ) + $this->addInfoFor( new User(),Messages::MOTD,array('motd' => $messageOfTheDay) ); + + if ( DEVELOPMENT ) + $this->addInfoFor( new User(),Messages::DEVELOPMENT_MODE ); + + $methods = array( + 'edit' => true, + 'preview' => true, + 'info' => true, + ); + + $methodList = array(); + foreach( $methods as $method=>$openByDefault ) + { + $methodList[] = array('name'=>$method,'open'=>$openByDefault); + } + $this->setTemplateVar('methodList', $methodList); + $this->setTemplateVar('favicon_url', C::subset('theme')->get('favicon','modules/cms/ui/themes/default/images/openrat-logo.ico') ); + + $vars = $this->getOutputData(); + $this->setTemplateVar( 'notices',$vars['notices'] ); // will be extracted in the included template file. + $this->setTemplateVar( 'charset','UTF-8' ); + + $app = C::subset('application'); + $appName = $app->get('name' ); + $appOperator = $app->get('operator'); + $this->setTemplateVar( 'defaultTitle', $appName.(($appOperator!=$appName)?' - '.$appOperator:'')); + + $this->setTemplateVar('language',C::subset('language')->get('language_code') ); + } + public function post() { + } +} diff --git a/modules/cms/ui/action/index/IndexThemestyleAction.class.php b/modules/cms/ui/action/index/IndexThemestyleAction.class.php @@ -0,0 +1,36 @@ +<?php +namespace cms\ui\action\index; +use cms\action\Method; +use cms\base\Startup; +use cms\ui\action\IndexAction; +use cms\action\RequestParams; +use cms\auth\Auth; +use cms\auth\AuthRunner; +use cms\base\Configuration; +use cms\base\Configuration as C; +use cms\model\BaseObject; +use cms\model\Project; +use cms\model\User; +use cms\model\Value; +use cms\ui\themes\Theme; +use Exception; +use language\Messages; +use util\Html; +use util\json\JSON; +use logger\Logger; +use util\Less; +use util\UIUtils; +use \util\exception\ObjectNotFoundException; +use util\Session; +class IndexThemestyleAction extends IndexAction implements Method { + public function view() { + $themeLessFile = Startup::THEMES_DIR . 'default/style/theme/openrat-theme.less'; + $this->lastModified(filemtime($themeLessFile)); + + header('Content-Type: text/css'); + + $this->setTemplateVar('style',$this->getThemeCSS() ); + } + public function post() { + } +} diff --git a/modules/cms/ui/action/title/TitleAvailableAction.class.php b/modules/cms/ui/action/title/TitleAvailableAction.class.php @@ -0,0 +1,27 @@ +<?php +namespace cms\action\base; +use cms\action\BaseAction; +use cms\action\Method; +use cms\ui\action\TitleAction; +use util\ClassName; + +class TitleAvailableAction extends TitleAction implements Method { + public function view() { + + $action = $this->getRequestVar('queryaction'); + + $viewMethods = array_filter( ['pub','prop','history','rights','add','pw','memberships','advanced','changeto','changetemplate','src','size','maintanance','settings','archive','rights','delete','preview'], + function ($methodName) use ($action) { + // Filter existent methods + $className = new ClassName( ucfirst($action).ucfirst($methodName).'Action'); + $className->addNamespace( ['cms']['action'][$action]); + + return $className->exists(); + }); + + $this->setTemplateVar('views', $viewMethods); + } + + public function post() { + } +} diff --git a/modules/cms/ui/action/title/TitleHistoryAction.class.php b/modules/cms/ui/action/title/TitleHistoryAction.class.php @@ -0,0 +1,38 @@ +<?php +namespace cms\ui\action\title; +use cms\action\Method; +use cms\model\BaseObject; +use cms\ui\action\TitleAction; +use util\Html; +use util\Session; + +class TitleHistoryAction extends TitleAction implements Method { + public function view() { + $resultList = array(); + + $history = Session::get('history'); + + if ( is_array($history) ) + { + foreach( array_reverse($history) as $objectid ) + { + $o = new BaseObject( $objectid ); + $o->load(); + $resultList[$objectid] = array(); + $resultList[$objectid]['url'] = Html::url($o->getType(),'',$objectid); + $resultList[$objectid]['type'] = $o->getType(); + $resultList[$objectid]['name'] = $o->name; + $resultList[$objectid]['lastchange_date'] = $o->lastchangeDate; + + if ( $o->desc != '' ) + $resultList[$objectid]['desc'] = $o->desc; + else + $resultList[$objectid]['desc'] = \cms\base\Language::lang('NO_DESCRIPTION_AVAILABLE'); + } + } + + $this->setTemplateVar( 'history',$resultList ); + } + public function post() { + } +} diff --git a/modules/cms/ui/action/title/TitleShowAction.class.php b/modules/cms/ui/action/title/TitleShowAction.class.php @@ -0,0 +1,48 @@ +<?php +namespace cms\ui\action\title; +use cms\action\Method; +use cms\base\Configuration; +use cms\base\DB; +use cms\base\Startup; +use cms\ui\action\TitleAction; +use util\Html; +use util\Session; + +class TitleShowAction extends TitleAction implements Method { + public function view() { + $this->setTemplateVar('buildinfo',Startup::TITLE.' '.Startup::VERSION.' - build date '.Startup::DATE ); + + $user = Session::getUser(); + + if ( !is_object($user) ) + { + $this->setTemplateVar('isLoggedIn' ,false ); + $this->setTemplateVar('userfullname',\cms\base\Language::lang('NOT_LOGGED_IN') ); + return; // Kein Benutzer angemeldet. + } + + $this->setTemplateVar('isLoggedIn',true ); + + if ( DEVELOPMENT ) { + $db = DB::get(); + $this->setTemplateVar('dbname',$db->conf['name'].(Startup::readonly()?' ('.\cms\base\Language::lang('readonly').')':'')); + $this->setTemplateVar('dbid' ,$db->id); + } + + $this->setTemplateVar('username' ,$user->name ); + $this->setTemplateVar('userfullname',$user->fullname); + + // Urls zum Benutzerprofil und zum Abmelden + //$this->setTemplateVar('profile_url',Html::url( 'profile' )); + //$this->setTemplateVar('logout_url' ,Html::url( 'index','logout' )); + $this->setTemplateVar('isAdmin',$this->userIsAdmin() ); + + if ( Configuration::subset(['interface','session'])->is('auto_extend',true) ) + { + $this->setTemplateVar('ping_url' ,Html::url('title','ping') ); + $this->setTemplateVar('ping_timeout',ini_get('session.gc_maxlifetime')-60 ); + } + } + public function post() { + } +} diff --git a/modules/cms/ui/action/tree/TreeBranchAction.class.php b/modules/cms/ui/action/tree/TreeBranchAction.class.php @@ -0,0 +1,16 @@ +<?php +namespace cms\ui\action\tree; +use cms\ui\action\TreeAction; +use cms\action\Method; +class TreeBranchAction extends TreeAction implements Method { + public function view() { + + $type = $this->getRequestVar('type'); + + $branch = $this->loadTreeBranch( $type ); + + $this->setTemplateVar( 'branch',$branch ); + } + public function post() { + } +} diff --git a/modules/cms/ui/action/tree/TreePathAction.class.php b/modules/cms/ui/action/tree/TreePathAction.class.php @@ -0,0 +1,19 @@ +<?php +namespace cms\ui\action\tree; +use cms\action\RequestParams; +use cms\ui\action\TreeAction; +use cms\action\Method; +class TreePathAction extends TreeAction implements Method { + public function view() { + $type = $this->getRequestVar('type'); + $id = $this->getRequestVar('id', RequestParams::FILTER_ALPHANUM); + + $result = $this->calculatePath($type, $id); + $this->setTemplateVar('path', $result); + + $name = $this->calculateName($type, $id); + $this->setTemplateVar('actual', $this->pathItem($type, $id, $name)); + } + public function post() { + } +} diff --git a/modules/cms/ui/action/tree/TreeShowAction.class.php b/modules/cms/ui/action/tree/TreeShowAction.class.php @@ -0,0 +1,12 @@ +<?php +namespace cms\ui\action\tree; +use cms\ui\action\TreeAction; +use cms\action\Method; +class TreeShowAction extends TreeAction implements Method { + public function view() { + + // no data required here. + } + public function post() { + } +} diff --git a/modules/cms/ui/themes/default/html/views/folder/preview.php b/modules/cms/ui/themes/default/html/views/folder/preview.php @@ -0,0 +1,6 @@ +<?php /* THIS FILE IS GENERATED from preview.tpl.src.xml - DO NOT CHANGE */ defined('APP_STARTED') || die('Forbidden'); use \template_engine\Output as O; ?> + <div class="<?php echo O::escapeHtml('or-act-clickable') ?>"><?php echo O::escapeHtml('') ?> + <a target="<?php echo O::escapeHtml('_self') ?>" data-url="<?php echo O::escapeHtml(''.@$preview_url.'') ?>" data-type="<?php echo O::escapeHtml('popup') ?>" data-action="<?php echo O::escapeHtml('') ?>" data-method="<?php echo O::escapeHtml('') ?>" data-id="<?php echo O::escapeHtml('') ?>" data-extra="<?php echo O::escapeHtml('[]') ?>" href="<?php echo O::escapeHtml('') ?>" class="<?php echo O::escapeHtml('or-link or-action') ?>"><?php echo O::escapeHtml('') ?> + <span><?php echo O::escapeHtml(''.@O::lang('LINK_OPEN_IN_NEW_WINDOW').'') ?></span> + </a> + </div>+ \ No newline at end of file diff --git a/modules/cms/ui/themes/default/html/views/folder/preview.tpl.src.xml b/modules/cms/ui/themes/default/html/views/folder/preview.tpl.src.xml @@ -0,0 +1,8 @@ +<output xmlns="http://www.openrat.de/template" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.openrat.de/template ../../../../../../../template_engine/components/template.xsd"> + <part class="act-clickable"> + <link type="popup" url="${preview_url}" class="action"> + <text value="${message:LINK_OPEN_IN_NEW_WINDOW}"/> + </link> + </part> +</output> diff --git a/modules/cms/ui/themes/default/html/views/project/history.php b/modules/cms/ui/themes/default/html/views/project/history.php @@ -21,23 +21,23 @@ </tr> <?php foreach((array)$timeline as $list_key=>$list_value) { extract($list_value); ?> <?php $if4=($typeid=='1'); if($if4) { ?> - <?php { $type= folder; ?> + <?php { $type= 'folder'; ?> <?php } ?> <?php } ?> <?php $if4=($typeid=='2'); if($if4) { ?> - <?php { $type= file; ?> + <?php { $type= 'file'; ?> <?php } ?> <?php } ?> <?php $if4=($typeid=='3'); if($if4) { ?> - <?php { $type= page; ?> + <?php { $type= 'page'; ?> <?php } ?> <?php } ?> <?php $if4=($typeid=='4'); if($if4) { ?> - <?php { $type= link; ?> + <?php { $type= 'link'; ?> <?php } ?> <?php } ?> <?php $if4=($typeid=='5'); if($if4) { ?> - <?php { $type= url; ?> + <?php { $type= 'url'; ?> <?php } ?> <?php } ?> <tr class="<?php echo O::escapeHtml('or-data') ?>"><?php echo O::escapeHtml('') ?> diff --git a/modules/cms/ui/themes/default/html/views/project/history.tpl.src.xml b/modules/cms/ui/themes/default/html/views/project/history.tpl.src.xml @@ -17,19 +17,19 @@ <list list="${timeline}" extract="true"> <!-- Den Typ des Objektes ermitteln --> <if value="${typeid}" equals="1"> - <set var="type" value="folder"/> + <set var="type" value="'folder'"/> </if> <if value="${typeid}" equals="2"> - <set var="type" value="file"/> + <set var="type" value="'file'"/> </if> <if value="${typeid}" equals="3"> - <set var="type" value="page"/> + <set var="type" value="'page'"/> </if> <if value="${typeid}" equals="4"> - <set var="type" value="link"/> + <set var="type" value="'link'"/> </if> <if value="${typeid}" equals="5"> - <set var="type" value="url"/> + <set var="type" value="'url'"/> </if> <row class="data"> <column class="act-clickable"> diff --git a/modules/cms/ui/themes/default/html/views/userlist/edit.php b/modules/cms/ui/themes/default/html/views/userlist/edit.php @@ -0,0 +1,45 @@ +<?php /* THIS FILE IS GENERATED from edit.tpl.src.xml - DO NOT CHANGE */ defined('APP_STARTED') || die('Forbidden'); use \template_engine\Output as O; ?> + <div class="<?php echo O::escapeHtml('or-table-wrapper') ?>"><?php echo O::escapeHtml('') ?> + <div class="<?php echo O::escapeHtml('or-table-filter') ?>"><?php echo O::escapeHtml('') ?> + <input type="<?php echo O::escapeHtml('search') ?>" name="<?php echo O::escapeHtml('filter') ?>" placeholder="<?php echo O::escapeHtml(''.@O::lang('SEARCH_FILTER').'') ?>" class="<?php echo O::escapeHtml('or-input or-table-filter-input') ?>" /><?php echo O::escapeHtml('') ?> + </div> + <div class="<?php echo O::escapeHtml('or-table-area') ?>"><?php echo O::escapeHtml('') ?> + <table width="<?php echo O::escapeHtml('100%') ?>" class="<?php echo O::escapeHtml('or-table') ?>"><?php echo O::escapeHtml('') ?> + <tr class="<?php echo O::escapeHtml('or-headline') ?>"><?php echo O::escapeHtml('') ?> + <td><?php echo O::escapeHtml('') ?> + <img src="<?php echo O::escapeHtml('./modules/cms/ui/themes/default/images/icon_user.png') ?>" /><?php echo O::escapeHtml('') ?> + <span><?php echo O::escapeHtml(''.@O::lang('name').'') ?></span> + </td> + <td><?php echo O::escapeHtml('') ?> + <span><?php echo O::escapeHtml('') ?></span> + </td> + </tr> + <?php foreach((array)$list as $list_key=>$list_value) { extract($list_value); ?> + <tr class="<?php echo O::escapeHtml('or-data or-act-clickable') ?>"><?php echo O::escapeHtml('') ?> + <td data-name="<?php echo O::escapeHtml(''.@$name.'') ?>" data-action="<?php echo O::escapeHtml('user') ?>" data-id="<?php echo O::escapeHtml(''.@$id.'') ?>"><?php echo O::escapeHtml('') ?> + <a target="<?php echo O::escapeHtml('_self') ?>" date-name="<?php echo O::escapeHtml(''.@$name.'') ?>" name="<?php echo O::escapeHtml(''.@$name.'') ?>" data-type="<?php echo O::escapeHtml('open') ?>" data-action="<?php echo O::escapeHtml('user') ?>" data-method="<?php echo O::escapeHtml('') ?>" data-id="<?php echo O::escapeHtml(''.@$id.'') ?>" data-extra="<?php echo O::escapeHtml('[]') ?>" href="<?php echo O::escapeHtml('#/user/'.@$id.'') ?>" class="<?php echo O::escapeHtml('or-link') ?>"><?php echo O::escapeHtml('') ?> + <i class="<?php echo O::escapeHtml('or-image-icon or-image-icon--action-user') ?>"><?php echo O::escapeHtml('') ?></i> + <span><?php echo O::escapeHtml(''.@$name.'') ?></span> + </a> + </td> + <td data-name="<?php echo O::escapeHtml(''.@$name.'') ?>" data-action="<?php echo O::escapeHtml('user') ?>" data-id="<?php echo O::escapeHtml(''.@$id.'') ?>"><?php echo O::escapeHtml('') ?> + <span><?php echo O::escapeHtml(''.@$fullname.'') ?></span> + <?php $if6=($isAdmin); if($if6) { ?> + <span><?php echo O::escapeHtml('_(') ?></span> + <span><?php echo O::escapeHtml(''.@O::lang('USER_ADMIN').'') ?></span> + <span><?php echo O::escapeHtml(')') ?></span> + <?php } ?> + </td> + </tr> + <?php } ?> + <tr class="<?php echo O::escapeHtml('or-data') ?>"><?php echo O::escapeHtml('') ?> + <td colspan="<?php echo O::escapeHtml('2') ?>" class="<?php echo O::escapeHtml('or-act-clickable') ?>"><?php echo O::escapeHtml('') ?> + <a target="<?php echo O::escapeHtml('_self') ?>" date-name="<?php echo O::escapeHtml(''.@O::lang('add').'') ?>" name="<?php echo O::escapeHtml(''.@O::lang('add').'') ?>" data-type="<?php echo O::escapeHtml('dialog') ?>" data-action="<?php echo O::escapeHtml('') ?>" data-method="<?php echo O::escapeHtml('add') ?>" data-id="<?php echo O::escapeHtml('') ?>" data-extra-dialogAction="<?php echo O::escapeHtml('') ?>" data-extra-dialogMethod="<?php echo O::escapeHtml('add') ?>" data-extra="<?php echo O::escapeHtml('{\'dialogAction\':null,\'dialogMethod\':\'add\'}') ?>" href="<?php echo O::escapeHtml('') ?>" class="<?php echo O::escapeHtml('or-link') ?>"><?php echo O::escapeHtml('') ?> + <i class="<?php echo O::escapeHtml('or-image-icon or-image-icon--method-add') ?>"><?php echo O::escapeHtml('') ?></i> + <span><?php echo O::escapeHtml(''.@O::lang('add').'') ?></span> + </a> + </td> + </tr> + </table> + </div> + </div>+ \ No newline at end of file diff --git a/modules/cms/ui/themes/default/html/views/userlist/show.tpl.src.xml b/modules/cms/ui/themes/default/html/views/userlist/edit.tpl.src.xml diff --git a/modules/cms/ui/themes/default/html/views/userlist/show.php b/modules/cms/ui/themes/default/html/views/userlist/show.php @@ -1,45 +0,0 @@ -<?php /* THIS FILE IS GENERATED from show.tpl.src.xml - DO NOT CHANGE */ defined('APP_STARTED') || die('Forbidden'); use \template_engine\Output as O; ?> - <div class="<?php echo O::escapeHtml('or-table-wrapper') ?>"><?php echo O::escapeHtml('') ?> - <div class="<?php echo O::escapeHtml('or-table-filter') ?>"><?php echo O::escapeHtml('') ?> - <input type="<?php echo O::escapeHtml('search') ?>" name="<?php echo O::escapeHtml('filter') ?>" placeholder="<?php echo O::escapeHtml(''.@O::lang('SEARCH_FILTER').'') ?>" class="<?php echo O::escapeHtml('or-input or-table-filter-input') ?>" /><?php echo O::escapeHtml('') ?> - </div> - <div class="<?php echo O::escapeHtml('or-table-area') ?>"><?php echo O::escapeHtml('') ?> - <table width="<?php echo O::escapeHtml('100%') ?>" class="<?php echo O::escapeHtml('or-table') ?>"><?php echo O::escapeHtml('') ?> - <tr class="<?php echo O::escapeHtml('or-headline') ?>"><?php echo O::escapeHtml('') ?> - <td><?php echo O::escapeHtml('') ?> - <img src="<?php echo O::escapeHtml('./modules/cms/ui/themes/default/images/icon_user.png') ?>" /><?php echo O::escapeHtml('') ?> - <span><?php echo O::escapeHtml(''.@O::lang('name').'') ?></span> - </td> - <td><?php echo O::escapeHtml('') ?> - <span><?php echo O::escapeHtml('') ?></span> - </td> - </tr> - <?php foreach((array)$list as $list_key=>$list_value) { extract($list_value); ?> - <tr class="<?php echo O::escapeHtml('or-data or-act-clickable') ?>"><?php echo O::escapeHtml('') ?> - <td data-name="<?php echo O::escapeHtml(''.@$name.'') ?>" data-action="<?php echo O::escapeHtml('user') ?>" data-id="<?php echo O::escapeHtml(''.@$id.'') ?>"><?php echo O::escapeHtml('') ?> - <a target="<?php echo O::escapeHtml('_self') ?>" date-name="<?php echo O::escapeHtml(''.@$name.'') ?>" name="<?php echo O::escapeHtml(''.@$name.'') ?>" data-type="<?php echo O::escapeHtml('open') ?>" data-action="<?php echo O::escapeHtml('user') ?>" data-method="<?php echo O::escapeHtml('') ?>" data-id="<?php echo O::escapeHtml(''.@$id.'') ?>" data-extra="<?php echo O::escapeHtml('[]') ?>" href="<?php echo O::escapeHtml('#/user/'.@$id.'') ?>" class="<?php echo O::escapeHtml('or-link') ?>"><?php echo O::escapeHtml('') ?> - <i class="<?php echo O::escapeHtml('or-image-icon or-image-icon--action-user') ?>"><?php echo O::escapeHtml('') ?></i> - <span><?php echo O::escapeHtml(''.@$name.'') ?></span> - </a> - </td> - <td data-name="<?php echo O::escapeHtml(''.@$name.'') ?>" data-action="<?php echo O::escapeHtml('user') ?>" data-id="<?php echo O::escapeHtml(''.@$id.'') ?>"><?php echo O::escapeHtml('') ?> - <span><?php echo O::escapeHtml(''.@$fullname.'') ?></span> - <?php $if6=($isAdmin); if($if6) { ?> - <span><?php echo O::escapeHtml('_(') ?></span> - <span><?php echo O::escapeHtml(''.@O::lang('USER_ADMIN').'') ?></span> - <span><?php echo O::escapeHtml(')') ?></span> - <?php } ?> - </td> - </tr> - <?php } ?> - <tr class="<?php echo O::escapeHtml('or-data') ?>"><?php echo O::escapeHtml('') ?> - <td colspan="<?php echo O::escapeHtml('2') ?>" class="<?php echo O::escapeHtml('or-act-clickable') ?>"><?php echo O::escapeHtml('') ?> - <a target="<?php echo O::escapeHtml('_self') ?>" date-name="<?php echo O::escapeHtml(''.@O::lang('add').'') ?>" name="<?php echo O::escapeHtml(''.@O::lang('add').'') ?>" data-type="<?php echo O::escapeHtml('dialog') ?>" data-action="<?php echo O::escapeHtml('') ?>" data-method="<?php echo O::escapeHtml('add') ?>" data-id="<?php echo O::escapeHtml('') ?>" data-extra-dialogAction="<?php echo O::escapeHtml('') ?>" data-extra-dialogMethod="<?php echo O::escapeHtml('add') ?>" data-extra="<?php echo O::escapeHtml('{\'dialogAction\':null,\'dialogMethod\':\'add\'}') ?>" href="<?php echo O::escapeHtml('') ?>" class="<?php echo O::escapeHtml('or-link') ?>"><?php echo O::escapeHtml('') ?> - <i class="<?php echo O::escapeHtml('or-image-icon or-image-icon--method-add') ?>"><?php echo O::escapeHtml('') ?></i> - <span><?php echo O::escapeHtml(''.@O::lang('add').'') ?></span> - </a> - </td> - </tr> - </table> - </div> - </div>- \ No newline at end of file diff --git a/modules/cms/ui/themes/default/script/openrat.js b/modules/cms/ui/themes/default/script/openrat.js @@ -2812,7 +2812,7 @@ let filterMenus = function () // Jeder Menüeintrag bekommt die Id und Parameter. $('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered .or-link').attr('data-id' ,id ); - let url = Openrat.View.createUrl(action,'available',id, {},true ); + let url = Openrat.View.createUrl('profile','available',id, {'queryaction':action},true ); // Die Inhalte des Zweiges laden. let promise = $.getJSON(url); diff --git a/modules/cms/ui/themes/default/script/openrat.min.js b/modules/cms/ui/themes/default/script/openrat.min.js @@ -1184,7 +1184,7 @@ else{}})};let timeoutMinutes=5;window.setInterval(ping,timeoutMinutes*60*1000)}; else if(Notification.permission==='granted'){let notification=new Notification(e)} else if(Notification.permission!=='denied'){Notification.requestPermission(function(t){if(t==='granted'){let notification=new Notification(e)}})}};this.notify=function(t,i,n,o,a,log=null,notifyTheBrowser=!1){if(notifyTheBrowser)notifyBrowser(a);let notice=$('<div class="or-notice or-notice--'+o+'"></div>');let toolbar=$('<div class="or-notice-toolbar"></div>');if(log)$(toolbar).append('<i class="or-act-notice-full or-image-icon or-image-icon--menu-fullscreen"></i>');$(toolbar).append('<i class="or-image-icon or-image-icon--menu-close or-act-notice-close"></i>');$(notice).append(toolbar);if(n)$(notice).append('<div class="or-notice-name"><a class="or-act-clickable" href="'+Openrat.Navigator.createShortUrl(t,i)+'" data-type="open" data-action="'+t+'" data-id="'+i+'"><i class="or-notice-action-full or-image-icon or-image-icon--action-'+t+'"></i> '+n+'</a></div>');$(notice).append('<div class="or-notice-text">'+e(a)+'</div>');if(log)$(notice).append('<div class="or-notice-log"><pre>'+e(log)+'</pre></div>');$('#noticebar').prepend(notice);$(notice).orLinkify();$(notice).find('.or-act-notice-full').click(function(){$(notice).toggleClass('notice--is-full')});$(notice).find('.or-act-notice-close').click(function(){$(notice).fadeOut('fast',function(){$(notice).remove()})});let timeout=1;if(o=='ok')timeout=20;if(o=='info')timeout=60;if(o=='warning')timeout=120;if(o=='error')timeout=120;if(timeout>0)setTimeout(function(){$(notice).fadeOut('slow',function(){$(this).remove()})},timeout*1000)};this.dataChangedHandler=$.Callbacks();this.dataChangedHandler.add(function(){if(Openrat.Workbench.popupWindow)Openrat.Workbench.popupWindow.location.reload()});this.afterViewLoadedHandler=$.Callbacks();this.setApplicationTitle=function(e){if(e)$('head > title').text(e+' - '+$('head > title').data('default'));else $('head > title').text($('head > title').data('default'))};var e=function(e){return String(e).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;')};this.registerOpenClose=function(e){$(e).children('.or-collapsible-act-switch').click(function(){$(this).closest('.or-collapsible').toggleClass('collapsible--is-open').toggleClass('collapsible--is-closed')})};this.openNewAction=function(e,t,i){$('.or-workbench-navigation').removeClass('workbench-navigation--is-open');Openrat.Workbench.setApplicationTitle(e);Openrat.Navigator.navigateToNew({'action':t,'id':i})};this.startDialog=function(e,t,i,o,n){if(!t)t=Openrat.Workbench.state.action;if(!o)o=Openrat.Workbench.state.id;let view=new Openrat.View(t,i,o,n);view.before=function(){$('#dialog > .view').html('<div class="header"><img class="or-icon" title="" src="./themes/default/images/icon/'+i+'.png" />'+e+'</div>');$('#dialog > .view').data('id',o);$('#dialog').removeClass('dialog--is-closed').addClass('dialog--is-open');let view=this;this.escapeKeyClosingHandler=function(e){if(e.keyCode==27){view.close();$(document).off('keyup')}};$(document).keyup(this.escapeKeyClosingHandler);$('.or-dialog-filler').click(function(){view.close()})};view.close=function(){if($('.or-dialog').hasClass('or-dialog--modal'))return;$('.or-view.or-view--is-dirty').removeClass('or-view--is-dirty');$('#dialog .or-view').html('');$('#dialog').removeClass('dialog--is-open').addClass('dialog--is-closed');$(document).unbind('keyup',this.escapeKeyClosingHandler)};return view.start($('.or-dialog > .or-view'))};this.registerDraggable=function(e){$(e).find('.or-draggable').draggable({helper:'clone',opacity:0.7,zIndex:2,distance:10,cursor:'move',revert:'false'})};this.registerDroppable=function(e){$(e).find('.or-droppable').droppable({accept:'.or-draggable',hoverClass:'or-droppable--hover',activeClass:'or-droppable--active',drop:function(e,t){let dropped=t.draggable;let id=dropped.data('id');let name=dropped.data('name');if(!name)name=id;$(this).find('.or-selector-link-value').val(id);$(this).find('.or-selector-link-name').val(name).attr('placeholder',name)}})}}; ;Openrat.Navigator=new function(){'use strict';this.navigateTo=function(t){Openrat.Workbench.loadNewActionState(t)};this.navigateToNew=function(t){this.navigateTo(t);window.history.pushState(t,t.name,this.createShortUrl(t.action,t.id))};this.toActualHistory=function(t){window.history.replaceState(t,t.name,this.createShortUrl(t.action,t.id))};this.createShortUrl=function(t,i){return'./#/'+t+(i?'/'+i:'')}}; -;$(function(){$('html').removeClass('nojs');$('.or--initial-hidden').removeClass('-initial-hidden');function e(){function e(e){$(e).closest('div.panel').fadeOut('fast',function(){$(this).toggleClass('fullscreen').fadeIn('fast')})};$('div.header').dblclick(function(){e(this)})};e();window.onpopstate=function(e){Openrat.Navigator.navigateTo(e.state)};Openrat.Workbench.initialize();Openrat.Workbench.reloadAll();let registerWorkbenchGlobalEvents=function(){$('.keystroke').each(function(){let keystrokeElement=$(this);let keystroke=keystrokeElement.text();if(keystroke.length==0)return;let keyaction=function(){keystrokeElement.click()};$(document).bind('keydown',keystroke,keyaction)});$('section.toggle-open-close .on-click-open-close').click(function(){var n=$(this).closest('section');if(n.hasClass('disabled'))return;var e=n.find('div.view-loader');if(e.children().length==0)Openrat.Workbench.loadNewActionIntoElement(e)})};$('.or-act-initial-notice').each(function(){Openrat.Workbench.notify('',0,'','info',$(this).text());$(this).remove()});registerWorkbenchGlobalEvents();let closeMenu=function(){$('body').click(function(){$('.or-menu').removeClass('menu--is-open')})};closeMenu();let closeMobileNavigation=function(){$('.or-workbench-workplace').click(function(){$('.or-workbench-navigation').removeClass('workbench-navigation--is-open')})};closeMobileNavigation();Openrat.Workbench.afterNewActionHandler.add(function(){let url=Openrat.View.createUrl('tree','path',Openrat.Workbench.state.id,{'type':Openrat.Workbench.state.action});let loadPromise=$.get(url);loadPromise.done(function(e){$('.or-breadcrumb').empty().append(e).find('.or-act-clickable').orLinkify();$('nav .or-navtree-node').removeClass('or-navtree-node--selected');$('.or-breadcrumb a').each(function(){let action=$(this).data('action');let id=$(this).data('id');let $navControl=$('nav .or-navtree-node[data-type='+action+'][data-id='+id+'].or-navtree-node--is-closed .or-navtree-node-control');$navControl.click()})}).fail(function(e){console.warn(e);console.warn('failed to load path from '+url)}).always(function(){})});Openrat.Workbench.afterNewActionHandler.fire()});let filterMenus=function(){let action=Openrat.Workbench.state.action;let id=Openrat.Workbench.state.id;$('.or-workbench-title .or-dropdown-entry.or-act-clickable').addClass('dropdown-entry--active');$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered').removeClass('dropdown-entry--active').addClass('dropdown-entry--inactive');$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered .or-link').attr('data-id',id);let url=Openrat.View.createUrl(action,'available',id,{},!0);let promise=$.getJSON(url);promise.done(function(e){jQuery.each(e.output.views,function(e,n){$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered > .or-link[data-method=\''+n+'\']').parent().addClass('dropdown-entry--active').removeClass('dropdown-entry--inactive')})})};Openrat.Workbench.afterAllViewsLoaded.add(function(){filterMenus()});Openrat.Workbench.afterViewLoadedHandler.add(function(e){if(Openrat.Workbench.popupWindow)$(e).find('a[data-type=\'popup\']').each(function(){Openrat.Workbench.popupWindow.location.href=$(this).attr('data-url')})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){e.find('.or-act-load-nav-tree').each(function(){let type=$(this).data('type')||'root';let loadBranchUrl='./?action=tree&subaction=branch&id=0&type='+type;let $targetElement=$(this);$.get(loadBranchUrl).done(function(e){let $ul=$('<ul class="or-navtree-list" />');$ul.appendTo($targetElement.empty()).append(e);$ul.find('li').orTree({'openAction':function(e,n,o){Openrat.Workbench.openNewAction(e,n,o)}});$ul.find('.or-act-clickable').orLinkify();$ul.find('.or-navtree-node-control').first().click()})})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){var n=$(e).closest('section');n.toggleClass('is-empty',$(e).is(':empty'));if(!$(e).is(':empty'))n.slideDown('fast');else n.slideUp('fast');$(e).find('.or-act-nav-open-close').click(function(){$('.or-workbench').toggleClass('workbench--navigation-is-open');$('.or-workbench-navigation').toggleClass('workbench-navigation--is-open')});$(e).find('.or-act-nav-small').click(function(){$('.or-workbench').addClass('workbench--navigation-is-small');$('.or-workbench-navigation').addClass('workbench-navigation--is-small')});$(e).find('.or-act-nav-wide').click(function(){$('.or-workbench').removeClass('workbench--navigation-is-small');$('.or-workbench-navigation').removeClass('workbench-navigation--is-small')});$(e).find('.or-act-load-selector-tree').each(function(){var n=this;let id=$(this).data('init-folder-id');let type=id?'folder':'projects';let loadBranchUrl='./?action=tree&subaction=branch&id='+id+'&type='+type;let $targetElement=$(this);$.get(loadBranchUrl).done(function(n){let $ul=$('<ul class="or-navtree-list" />');$ul.appendTo($targetElement.empty()).append(n);$ul.find('li').orTree({'openAction':function(n,o,t){e.find('.or-selector-link-value').val(t);e.find('.or-selector-link-name').val(n).attr('placeholder',n)}});$ul.find('.or-act-clickable').orLinkify();$ul.find('.or-navtree-node-control').first().click()})});o(e);$(e).find('.or-input').change(function(){$(this).closest('.view').addClass('dirty')});$(e).find('.or-theme-chooser').change(function(){Openrat.Workbench.setUserStyle(this.value)});function t(e){$(e).find('.or-menu-category').click(function(e){e.stopPropagation();$(this).parents('.or-menu').toggleClass('menu--is-open')});$(e).find('.or-menu-category').mouseover(function(){$(this).parents('.or-menu').find('.or-menu-category').removeClass('menu-category--is-open');$(this).addClass('menu-category--is-open')})};function r(e){$(e).find('.or-search .or-input').orSearch({dropdown:'.or-dropdown.or-act-global-search-results',openDropdown:!1,select:function(e){Openrat.Workbench.openNewAction(e.name,e.action,e.id)}})};function a(e){$(e).find('.or-selector .or-selector-link-name').orSearch({dropdown:'.or-dropdown.or-act-selector-search-results',select:function(n){$(e).find('.or-selector-link-value').val(n.id);$(e).find('.or-selector-link-name').val(n.name).attr('placeholder',n.name)},afterSelect:function(){$('.or-dropdown.or-act-selector-search-results').empty()}})};function i(e){};t(e);r(e);a(e);i(e);function o(e){Openrat.Workbench.registerDraggable(e);Openrat.Workbench.registerDroppable(e)};o(e)}); +;$(function(){$('html').removeClass('nojs');$('.or--initial-hidden').removeClass('-initial-hidden');function e(){function e(e){$(e).closest('div.panel').fadeOut('fast',function(){$(this).toggleClass('fullscreen').fadeIn('fast')})};$('div.header').dblclick(function(){e(this)})};e();window.onpopstate=function(e){Openrat.Navigator.navigateTo(e.state)};Openrat.Workbench.initialize();Openrat.Workbench.reloadAll();let registerWorkbenchGlobalEvents=function(){$('.keystroke').each(function(){let keystrokeElement=$(this);let keystroke=keystrokeElement.text();if(keystroke.length==0)return;let keyaction=function(){keystrokeElement.click()};$(document).bind('keydown',keystroke,keyaction)});$('section.toggle-open-close .on-click-open-close').click(function(){var n=$(this).closest('section');if(n.hasClass('disabled'))return;var e=n.find('div.view-loader');if(e.children().length==0)Openrat.Workbench.loadNewActionIntoElement(e)})};$('.or-act-initial-notice').each(function(){Openrat.Workbench.notify('',0,'','info',$(this).text());$(this).remove()});registerWorkbenchGlobalEvents();let closeMenu=function(){$('body').click(function(){$('.or-menu').removeClass('menu--is-open')})};closeMenu();let closeMobileNavigation=function(){$('.or-workbench-workplace').click(function(){$('.or-workbench-navigation').removeClass('workbench-navigation--is-open')})};closeMobileNavigation();Openrat.Workbench.afterNewActionHandler.add(function(){let url=Openrat.View.createUrl('tree','path',Openrat.Workbench.state.id,{'type':Openrat.Workbench.state.action});let loadPromise=$.get(url);loadPromise.done(function(e){$('.or-breadcrumb').empty().append(e).find('.or-act-clickable').orLinkify();$('nav .or-navtree-node').removeClass('or-navtree-node--selected');$('.or-breadcrumb a').each(function(){let action=$(this).data('action');let id=$(this).data('id');let $navControl=$('nav .or-navtree-node[data-type='+action+'][data-id='+id+'].or-navtree-node--is-closed .or-navtree-node-control');$navControl.click()})}).fail(function(e){console.warn(e);console.warn('failed to load path from '+url)}).always(function(){})});Openrat.Workbench.afterNewActionHandler.fire()});let filterMenus=function(){let action=Openrat.Workbench.state.action;let id=Openrat.Workbench.state.id;$('.or-workbench-title .or-dropdown-entry.or-act-clickable').addClass('dropdown-entry--active');$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered').removeClass('dropdown-entry--active').addClass('dropdown-entry--inactive');$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered .or-link').attr('data-id',id);let url=Openrat.View.createUrl('profile','available',id,{'queryaction':action},!0);let promise=$.getJSON(url);promise.done(function(e){jQuery.each(e.output.views,function(e,n){$('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered > .or-link[data-method=\''+n+'\']').parent().addClass('dropdown-entry--active').removeClass('dropdown-entry--inactive')})})};Openrat.Workbench.afterAllViewsLoaded.add(function(){filterMenus()});Openrat.Workbench.afterViewLoadedHandler.add(function(e){if(Openrat.Workbench.popupWindow)$(e).find('a[data-type=\'popup\']').each(function(){Openrat.Workbench.popupWindow.location.href=$(this).attr('data-url')})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){e.find('.or-act-load-nav-tree').each(function(){let type=$(this).data('type')||'root';let loadBranchUrl='./?action=tree&subaction=branch&id=0&type='+type;let $targetElement=$(this);$.get(loadBranchUrl).done(function(e){let $ul=$('<ul class="or-navtree-list" />');$ul.appendTo($targetElement.empty()).append(e);$ul.find('li').orTree({'openAction':function(e,n,o){Openrat.Workbench.openNewAction(e,n,o)}});$ul.find('.or-act-clickable').orLinkify();$ul.find('.or-navtree-node-control').first().click()})})});Openrat.Workbench.afterViewLoadedHandler.add(function(e){var n=$(e).closest('section');n.toggleClass('is-empty',$(e).is(':empty'));if(!$(e).is(':empty'))n.slideDown('fast');else n.slideUp('fast');$(e).find('.or-act-nav-open-close').click(function(){$('.or-workbench').toggleClass('workbench--navigation-is-open');$('.or-workbench-navigation').toggleClass('workbench-navigation--is-open')});$(e).find('.or-act-nav-small').click(function(){$('.or-workbench').addClass('workbench--navigation-is-small');$('.or-workbench-navigation').addClass('workbench-navigation--is-small')});$(e).find('.or-act-nav-wide').click(function(){$('.or-workbench').removeClass('workbench--navigation-is-small');$('.or-workbench-navigation').removeClass('workbench-navigation--is-small')});$(e).find('.or-act-load-selector-tree').each(function(){var n=this;let id=$(this).data('init-folder-id');let type=id?'folder':'projects';let loadBranchUrl='./?action=tree&subaction=branch&id='+id+'&type='+type;let $targetElement=$(this);$.get(loadBranchUrl).done(function(n){let $ul=$('<ul class="or-navtree-list" />');$ul.appendTo($targetElement.empty()).append(n);$ul.find('li').orTree({'openAction':function(n,o,t){e.find('.or-selector-link-value').val(t);e.find('.or-selector-link-name').val(n).attr('placeholder',n)}});$ul.find('.or-act-clickable').orLinkify();$ul.find('.or-navtree-node-control').first().click()})});o(e);$(e).find('.or-input').change(function(){$(this).closest('.view').addClass('dirty')});$(e).find('.or-theme-chooser').change(function(){Openrat.Workbench.setUserStyle(this.value)});function t(e){$(e).find('.or-menu-category').click(function(e){e.stopPropagation();$(this).parents('.or-menu').toggleClass('menu--is-open')});$(e).find('.or-menu-category').mouseover(function(){$(this).parents('.or-menu').find('.or-menu-category').removeClass('menu-category--is-open');$(this).addClass('menu-category--is-open')})};function r(e){$(e).find('.or-search .or-input').orSearch({dropdown:'.or-dropdown.or-act-global-search-results',openDropdown:!1,select:function(e){Openrat.Workbench.openNewAction(e.name,e.action,e.id)}})};function a(e){$(e).find('.or-selector .or-selector-link-name').orSearch({dropdown:'.or-dropdown.or-act-selector-search-results',select:function(n){$(e).find('.or-selector-link-value').val(n.id);$(e).find('.or-selector-link-name').val(n.name).attr('placeholder',n.name)},afterSelect:function(){$('.or-dropdown.or-act-selector-search-results').empty()}})};function i(e){};t(e);r(e);a(e);i(e);function o(e){Openrat.Workbench.registerDraggable(e);Openrat.Workbench.registerDroppable(e)};o(e)}); ;Openrat.Workbench.afterViewLoadedHandler.add(function(e){}); ;Openrat.Workbench.afterViewLoadedHandler.add(function(e){$(e).find('textarea').orAutoheight();$(e).find('textarea.or-editor.or-code-editor').each(function(){let mode=$(this).data('mode');let mimetype=$(this).data('mimetype');if(mimetype.length>0)mode=mimetype;let textareaEl=this;let editor=CodeMirror.fromTextArea(textareaEl,{lineNumbers:!0,viewportMargin:Infinity,mode:mode});editor.on('change',function(){let newValue=editor.getValue();$(textareaEl).val(newValue)});$(editor.getWrapperElement()).droppable({accept:'.or-draggable',hoverClass:'or-droppable--hover',activeClass:'or-droppable--active',drop:function(e,t){let dropped=t.draggable;let pos=editor.getCursor();editor.setSelection(pos,pos);let insertText=dropped.data('id');let toInsert=''+insertText;editor.replaceSelection(toInsert)}})});$(e).find('textarea.or-editor.or-markdown-editor').each(function(){let textarea=this;let toolbar=[{name:'bold',action:SimpleMDE.toggleBold,className:'image-icon image-icon--editor-bold',title:'Bold',},{name:'italic',action:SimpleMDE.toggleItalic,className:'image-icon image-icon--editor-italic',title:'Italic',},{name:'heading',action:SimpleMDE.toggleHeadingBigger,className:'image-icon image-icon--editor-headline',title:'Headline',},'|',{name:'quote',action:SimpleMDE.toggleBlockquote,className:'image-icon image-icon--editor-quote',title:'Quote',},{name:'code',action:SimpleMDE.toggleCodeBlock,className:'image-icon image-icon--editor-code',title:'Code',},'|',{name:'generic list',action:SimpleMDE.toggleUnorderedList,className:'image-icon image-icon--editor-unnumberedlist',title:'Unnumbered list',},{name:'numbered list',action:SimpleMDE.toggleOrderedList,className:'image-icon image-icon--editor-numberedlist',title:'Numbered list',},'|',{name:'table',action:SimpleMDE.drawTable,className:'image-icon image-icon--editor-table',title:'Table',},{name:'horizontalrule',action:SimpleMDE.drawHorizontalRule,className:'image-icon image-icon--editor-horizontalrule',title:'Horizontal rule',},'|',{name:'undo',action:SimpleMDE.undo,className:'image-icon image-icon--editor-undo',title:'Undo',},{name:'redo',action:SimpleMDE.redo,className:'image-icon image-icon--editor-redo',title:'Redo',},'|',{name:'link',action:SimpleMDE.drawLink,className:'image-icon image-icon--editor-link',title:'Link',},{name:'image',action:SimpleMDE.drawImage,className:'image-icon image-icon--editor-image',title:'Image',},'|',{name:'guide',action:'https://simplemde.com/markdown-guide',className:'image-icon image-icon--editor-help',title:'Howto markdown',},];let mde=new SimpleMDE({element:$(this)[0],toolbar:toolbar,autoDownloadFontAwesome:!1});let codemirror=mde.codemirror;$(codemirror.getWrapperElement()).droppable({accept:'.or-draggable',hoverClass:'or-droppable--hover',activeClass:'or-droppable--active',drop:function(e,t){let dropped=t.draggable;let insertText='';let id=dropped.data('id');let url='__OID__'+id+'__';if(dropped.data('type')=='image')insertText='![]('+url+')';else insertText='['+id+']('+url+')';let pos=codemirror.getCursor();codemirror.setSelection(pos,pos);codemirror.replaceSelection(insertText)}});codemirror.on('change',function(){let newValue=codemirror.getValue();$(textarea).val(newValue)})});$(e).find('textarea.or-editor.or-html-editor').each(function(){let textarea=this;$.trumbowyg.svgPath='./modules/editor/trumbowyg/ui/icons.svg';$(textarea).trumbowyg();$(textarea).closest('form').find('.trumbowyg-editor').droppable({accept:'.or-draggable',hoverClass:'or-droppable--hover',activeClass:'or-droppable--active',drop:function(e,t){let dropped=t.draggable;let id=dropped.data('id');let url='./?_='+dropped.data('type')+'-'+id+'&subaction=show&embed=1&__OID__'+id+'__='+id;let insertText='';if(dropped.data('type')=='image')insertText='<img src="'+url+'" alt="" />';else insertText='<a href="'+url+'" />'+id+'</a>';$(textarea).trumbowyg('execCmd',{cmd:'insertHTML',param:insertText,forceCss:!1,})}})})}); ;Openrat.Workbench.afterViewLoadedHandler.add(function(e){Openrat.Workbench.registerOpenClose($(e).find('.or-collapsible.or-group'))}); diff --git a/modules/cms/ui/themes/default/script/openrat/common.js b/modules/cms/ui/themes/default/script/openrat/common.js @@ -160,7 +160,7 @@ let filterMenus = function () // Jeder Menüeintrag bekommt die Id und Parameter. $('.or-workbench-title .or-dropdown-entry.or-act-clickable.or-filtered .or-link').attr('data-id' ,id ); - let url = Openrat.View.createUrl(action,'available',id, {},true ); + let url = Openrat.View.createUrl('profile','available',id, {'queryaction':action},true ); // Die Inhalte des Zweiges laden. let promise = $.getJSON(url); diff --git a/modules/util/ClassName.class.php b/modules/util/ClassName.class.php @@ -0,0 +1,66 @@ +<?php + + +namespace util; + + +class ClassName +{ + protected $name; + + /** + * ClassName constructor. + * @param $className object|string + */ + public function __construct($className ) { + + if ( is_object( $className )) + $this->name = get_class( $className ); + else + $this->name = $className; + } + + public function dropNamespace() + { + if ( $pos = strrpos($this->name, '\\') ) + $this->name = substr($this->name, $pos + 1); + + return $this; + } + + public function addNamespace( $namespace ) + { + if ( ! is_array( $namespace) ) + $namespace = [ $namespace ]; + $this->name = implode('\\',$namespace ) . '\\' . $this->name; + + return $this; + } + + + public function dropSuffix($suffix) + { + if ( substr($this->name,-strlen($suffix),strlen($suffix))) + $this->name = substr( $this->name,0,-(strlen($suffix)) ); + + return $this; + } + + + public function get() + { + return $this->name; + } + + + public function getParent() { + $this->name = get_parent_class( $this->name ); + + return $this; + } + + + public function exists() { + return $this->name !== FALSE && class_exists($this->name ); + } +}+ \ No newline at end of file diff --git a/modules/util/test/ClassNameTest.class.php b/modules/util/test/ClassNameTest.class.php @@ -0,0 +1,37 @@ +<?php + +namespace util\test; + +use util\ClassName; +use util\YAML; + +class ClassNameTest extends TestCase { + + public function testShortName() + { + $classname = new ClassName( 'cms\action\page\PageShowAction'); + + $this->assertEquals( 'PageShowAction',$classname->dropNamespace()->get() ); + $this->assertEquals( 'PageShow',$classname->dropSuffix('Action')->get() ); + } + + + public function testParent() + { + $classname = (new ClassName( 'PageShowAction'))->addNamespace(['cms','action','page']); + + $this->assertEquals( true,$classname->getParent()->exists() ); + $this->assertEquals( 'cms\action\PageAction',$classname->get() ); + $this->assertEquals( true,$classname->getParent()->exists() ); + $this->assertEquals( 'cms\action\ObjectAction',$classname->get() ); + $this->assertEquals( true,$classname->getParent()->exists() ); + $this->assertEquals( 'cms\action\BaseAction',$classname->get() ); + $this->assertEquals( true,$classname->getParent()->exists() ); + $this->assertEquals( 'cms\action\Action',$classname->get() ); + $this->assertEquals( false,$classname->getParent()->exists() ); + $this->assertEquals( false,$classname->get() ); + } +} + + +