From a4ccb74e8c124112c3acec9ca775c09683411a69 Mon Sep 17 00:00:00 2001 From: coderkun Date: Wed, 28 May 2014 10:33:05 +0200 Subject: [PATCH] implement CRUD for Seminaries (resolves issue #33) --- configs/AppConfig.inc | 13 ++ controllers/CharactersController.inc | 5 + controllers/SeminariesController.inc | 206 ++++++++++++++++++-- locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 16530 -> 17144 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 66 ++++++- models/MediaModel.inc | 39 ++++ models/SeminariesModel.inc | 81 ++++++-- views/html/seminaries/create.tpl | 65 +++++- views/html/seminaries/edit.tpl | 67 ++++++- 9 files changed, 490 insertions(+), 52 deletions(-) diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index 0e7678b0..b68c5458 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -117,6 +117,16 @@ 'size' => 204800 ) ), + 'moodpics' => array( + array( + 'mimetype' => 'image/jpeg', + 'size' => 524288 + ), + array( + 'mimetype' => 'image/png', + 'size' => 1048576 + ) + ), 'charactergroupsquests' => array( array( 'mimetype' => 'image/jpeg', @@ -198,6 +208,9 @@ 'xps' => array( 'minlength' => 1, 'regex' => '/^(\d*)$/' + ), + 'course' => array( + 'maxlength' => 128 ) ); diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index f0dca5c5..5ea6ff9d 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -292,6 +292,11 @@ } } + // Set roles for owners and admins + if(in_array('admin', \hhu\z\controllers\IntermediateController::$user['roles']) || $seminary['created_user_id'] == \hhu\z\controllers\IntermediateController::$user['id']) { + $this->Characterroles->addCharacterroleToCharacter($characterId, 'admin'); + } + // Send mail $this->sendRegistrationMail($character); diff --git a/controllers/SeminariesController.inc b/controllers/SeminariesController.inc index 0c392a87..a0bd8a84 100644 --- a/controllers/SeminariesController.inc +++ b/controllers/SeminariesController.inc @@ -25,6 +25,12 @@ * @var array */ public $models = array('seminaries', 'users', 'characterroles', 'questgroupshierarchy', 'questgroups', 'media'); + /** + * Required components + * + * @var array + */ + public $components = array('validation'); /** * User permissions * @@ -162,26 +168,109 @@ /** * Action: create. * - * Create a new seminary. + * Create a new Seminary. */ public function create() { + // Get allowed mimetypes + $mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics']; + + // Values + $title = ''; + $course = ''; + $description = ''; + $fields = array('title', 'course'); + $validation = array(); + + // Create a new Seminary if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('create'))) { - // Create new seminary - $seminaryId = $this->Seminaries->createSeminary( - $this->request->getPostParam('title'), - $this->Auth->getUserId() - ); + // Get params and validate them + $validation = $this->Validation->validateParams($this->request->getPostParams(), $fields); + $title = $this->request->getPostParam('title'); + if($this->Seminaries->seminaryTitleExists($title)) { + $validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true); + } + $course = $this->request->getPostParam('course'); + $description = $this->request->getPostParam('description'); - // Redirect to seminary - $user = $this->Seminaries->getSeminaryById($seminaryId); - $this->redirect($this->linker->link(array($seminary['url']), 1)); + // Validate moodpic + $moodpic = null; + if(!empty($_FILES) && array_key_exists('moodpic', $_FILES) && $_FILES['moodpic']['error'] != UPLOAD_ERR_NO_FILE) + { + $moodpic = $_FILES['moodpic']; + + // Check error + if($moodpic['error'] !== UPLOAD_ERR_OK) { + $validation = $this->Validation->addValidationResult($validation, 'moodpic', 'error', $moodpic['error']); + } + + // Check mimetype + $mediaMimetype = null; + $moodpic['mimetype'] = \hhu\z\Utils::getMimetype($moodpic['tmp_name'], $moodpic['type']); + foreach($mimetypes as &$mimetype) { + if($mimetype['mimetype'] == $moodpic['mimetype']) { + $mediaMimetype = $mimetype; + break; + } + } + if(is_null($mediaMimetype)) { + $validation = $this->Validation->addValidationResult($validation, 'moodpic', 'mimetype', $moodpic['mimetype']); + } + elseif($moodpic['size'] > $mediaMimetype['size']) { + $validation = $this->Validation->addValidationResult($validation, 'moodpic', 'size', $mediaMimetype['size']); + } + } + + // Create new Seminary + if($validation === true) + { + $seminaryId = $this->Seminaries->createSeminary( + $this->Auth->getUserId(), + $title, + $course, + $description + ); + $seminary = $this->Seminaries->getSeminaryById($seminaryId); + + // Upload moodpic + if(!is_null($moodpic)) + { + $mediaId = $this->Media->createMoodpic( + $this->Auth->getUserId(), + $seminary['id'], + sprintf('seminarymoodpic-%s', $seminary['url']), + '', + $moodpic['mimetype'], + $moodpic['tmp_name'] + ); + if($mediaId !== false) { + $this->Seminaries->setMoodpicForSeminary($seminary['id'], $mediaId); + } + } + + // Redirect to Seminary overview + $this->redirect($this->linker->link('index', 1)); + } + } + + // Get validation settings + $validationSettings = array(); + foreach($fields as &$field) { + $validationSettings[$field] = \nre\configs\AppConfig::$validation[$field]; } // Set titile $this->addTitleLocalized('New seminary'); + + // Pass data to view + $this->set('title', $title); + $this->set('course', $course); + $this->set('description', $description); + $this->set('mimetypes', $mimetypes); + $this->set('validation', $validation); + $this->set('validationSettings', $validationSettings); } @@ -198,23 +287,92 @@ // Get seminary $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + // Get allowed mimetypes + $mimetypes = \nre\configs\AppConfig::$mimetypes['moodpics']; + + // Values + $title = $seminary['title']; + $course = $seminary['course']; + $description = $seminary['description']; + $fields = array('title', 'course'); + $validation = array(); + // Check request method - if($this->request->getRequestMethod() == 'POST') + if($this->request->getRequestMethod() == 'POST' && !is_null($this->request->getPostParam('edit'))) { - // Save changes - if(!is_null($this->request->getPostParam('save'))) + // Get params and validate them + $validation = $this->Validation->validateParams($this->request->getPostParams(), $fields); + $title = $this->request->getPostParam('title'); + if($this->Seminaries->seminaryTitleExists($title, $seminary['id'])) { + $validation = $this->Validation->addValidationResult($validation, 'title', 'exist', true); + } + $course = $this->request->getPostParam('course'); + $description = $this->request->getPostParam('description'); + + // Validate moodpic + $moodpic = null; + if(!empty($_FILES) && array_key_exists('moodpic', $_FILES) && $_FILES['moodpic']['error'] != UPLOAD_ERR_NO_FILE) { - // Edit seminary - $this->Seminaries->editSeminary( - $seminary['id'], - $this->request->getPostParam('title') - ); - $seminary = $this->Seminaries->getSeminaryById($seminary['id']); + $moodpic = $_FILES['moodpic']; + + // Check error + if($moodpic['error'] !== UPLOAD_ERR_OK) { + $validation = $this->Validation->addValidationResult($validation, 'moodpic', 'error', $moodpic['error']); + } + + // Check mimetype + $mediaMimetype = null; + $moodpic['mimetype'] = \hhu\z\Utils::getMimetype($moodpic['tmp_name'], $moodpic['type']); + foreach($mimetypes as &$mimetype) { + if($mimetype['mimetype'] == $moodpic['mimetype']) { + $mediaMimetype = $mimetype; + break; + } + } + if(is_null($mediaMimetype)) { + $validation = $this->Validation->addValidationResult($validation, 'moodpic', 'mimetype', $moodpic['mimetype']); + } + elseif($moodpic['size'] > $mediaMimetype['size']) { + $validation = $this->Validation->addValidationResult($validation, 'moodpic', 'size', $mediaMimetype['size']); + } } - - // Redirect to entry - $this->redirect($this->linker->link(array($seminary['url']), 1)); + // Edit Seminary + if($validation === true) + { + $this->Seminaries->editSeminary( + $seminary['id'], + $title, + $course, + $description + ); + $seminary = $this->Seminaries->getSeminaryById($seminary['id']); + + // Update moodpic + if(!is_null($moodpic)) + { + $mediaId = $this->Media->createMoodpic( + $this->Auth->getUserId(), + $seminary['id'], + sprintf('seminarymoodpic-%s', $seminary['url']), + '', + $moodpic['mimetype'], + $moodpic['tmp_name'] + ); + if($mediaId !== false) { + $this->Seminaries->setMoodpicForSeminary($seminary['id'], $mediaId); + } + } + + // Redirect to entry + $this->redirect($this->linker->link(array('seminary', $seminary['url']), 1)); + } + } + + // Get validation settings + $validationSettings = array(); + foreach($fields as &$field) { + $validationSettings[$field] = \nre\configs\AppConfig::$validation[$field]; } @@ -223,6 +381,12 @@ // Pass data to view $this->set('seminary', $seminary); + $this->set('title', $title); + $this->set('course', $course); + $this->set('description', $description); + $this->set('mimetypes', $mimetypes); + $this->set('validation', $validation); + $this->set('validationSettings', $validationSettings); } diff --git a/locale/de_DE/LC_MESSAGES/The Legend of Z.mo b/locale/de_DE/LC_MESSAGES/The Legend of Z.mo index a81cb049e7d511cf653aec86eb09c837f6301285..ee0b8d63bf5d90ebceac18b34e95dfc2a6a29b8e 100644 GIT binary patch delta 5864 zcmZYD33yFs9>?)F5kV1Yh>#%H7E5R%v8EcamohU(m5EYILShMS5_?@{#xk{)FhfOc zrIvO`?^vdk+O-v`RHId~j=kvEO6h!m_q=%?o;go``Ml@cbKmp6|MQ*`kNH#l9!~Z1 zoCyh7XxN^TDx^$FV|x1;^J_UBH6|_87!H|qEQM~nKM||3KNU;k2N;H%Fd7eG8N7=@ z=vUGCelV)Pa4c?&$JC?|!hw2N7F%LCcE$>riorM@YvW9e!aP*R1y~g?V|^^nC}^5k z)P6_QfZVA5-bbD9#r|C19Ha392jVLk6Nrge0^6fz&=un_*?vA7b>RhA16QF2cmQ?& zclaV+L{02I>Vl;z8&e+ZV0C;MD{+0(hXz$LqwNW^P}N_K8u2FN$LzPq3sD!mh3Z)4 z(gmxbz88zSB}vvU$Q(^CRE0;PCNK#-5j1Ag(8$)II`|BAVm|7g|A4B{B~*oOBlpfc zK&_c4)^IwDWWO0|fIaPg8d3x^12vHqsPAo$p#CaZ0S7dLOZLPEs0##hmKIAz48TZK z2eptNlgKZ9zqd6Fb>VE(fTvmKq58{3^|umri#JrE{#?s=?FmOw9e#_N>3LK~S5cL? zYmYxg4Wu~rSH&Vx6Ns_4M)lJjb>V)f{sy5gJRH?;wugo~o@_sO2kG0)N0o9T>HU+15Md>ktE~g~buqGcwp=R9K z?kA%gr(rBELiO_nY9Oaj1HEMTe?pH+^N5BF zpw60c5b6t&r~yPHrwOIgqp+zHeHc7Rq zzgF=8dtf9o88aWX=r&vTq26G}F#xZlW_}wrqh?%9pC=*LGQCg}dE4&KK~6PZERLs8 z6E2LR{_5Z=2UPl>u^2u<9suLV@Kp(ywE@;+zd7oH15odQ@ukMmJ8S%_M6%k1ZQsDAdKW_%D; z(R|bZPNTl(xj;iRxQQjP1k;njc)^d)P#rv}?;I}{?F_68s?=eq3bn+;_$ul>657Cd z8e&l|npaQ*eBC+-x%D11mWEyk(@={m7bEc_)MI!UOW-BctNJGD4Oyz8^9GDUEzZWs zkLkrPeSaG2X;@=Di5f`YOU?kRqFc{@a~dl32GoVNph~k7^@T&&3=2^u4Wm~buYxQS z6OX!u$yg3EP!pPjn!o}K!jDmFW(StT6By3*%|#me!f&X@BQ)0eVtrJ{ZBhS_=!q)f z5W7Foem)mf$2%RiMJ>W))PM(}&Kr**_%3P@uR={^9jgDW@zlR0t9*|=;j6~Z z;yH$z=^a!h9->NFvWc@cLa{vik*EvAV+HJhzRKC-Ls9)qLQP~U>cVqS{Vn#;&|+JI z8rde)i)Sac#2-IBqG-au9EO;jnfP!-BWJ$@@tkLM1oi04p?^`SMA6|FVn z=|Dpl?tvQlK-4|W#4wzTD(#1;k$X{J+=;qSKB@v&Py>C8nrTFH=kr=vpZ!+WA*k~g zBL9Z*n6)(Y*d0L4Q&1HciYoai)BvZUN;)4kk!7g!H=+i# z1vSxKsEOobke>en8d|NFQMckDsssN7=L;dI3%F1hZh#ta9O}FT)P*~vF3=OTHd0ZQ z8i)Gc4Ag+;SQlaiu5WT_sN{L56Z26cJdPUq8KkP_GO`>@*7-k$2$D$L-(|ebvUXb zi!cV4qh85hqYLk%CKj6LOf&*(v)?SyKL33<&oRAp~kA9!ela=@>RGqNz$y?0ro?eV6l z4qBmZK|8zu7OKM()UC|G7tv#n&qFP`C8$cRL{)Gjs@XSd(6bJ!mE7Dti)kWA+o^|xCGoI_MrZI8)1GMNk@ zeaU>HZ6g^%ijh3>CHX6vK{N?3(Wa+E+jR#s1>dpl6F#~ALmFC44T&C)Q=~u9eOpMz zlUw8*(YBrF`F@XVCT_Bm6m2RiZ&~xJJN@y-zs>J?q+c+$73viWACc|O zOf_wNxY9F5_aBy?;_T-9R->9XKg{i4-t8XYcBN#y(=!IUhL0GLGBSOjH!i%je_3DC zbaf8pl#8esW81E@{+X^Z?h$+;Yuw0G*ZIl0wKLC8URrc+(UrU-t4t^z(A?E1Hs@BI zS|!v-h-={uuRFJRt=AZtX-7Y5xY9GTT-h0e_wE>$l|I$Yi z*s!4PS?R-vb5iDj^kFHf-s-X5Vv)}s^L6*!k(}wVb=wTuyTk2z?l9eFqz_EXa;3V5 U_0JxV_5WXden8&i@w>|W5ANQXWdHyG delta 5390 zcmYk;33yId9>?*MJrNN^NUWjRkw}mbTSZAxrL`|b2c?t}ZD~tx6O5%aZ8RNQjcP5? zb}XqaBa|sALNV#I#AMo1(_+R_we%^|@9(`Q^YlJ`@8{h6-uK*d{`cG)cNcgSqi5PvoDO zZub|W2DAg!Ulr>7pYUm}Z|X4Y8XTC3{+NRl!7M<{U>T<3D%3zu*yB}Lhy5$43EW3@ zTsy*;FigVcn2G!|NtQeb-@_a_vxt8 zXITd#V=!Y-m7ImD&;o3PZ=)`}4fXra(9ww%G<0viLsjA`suFjQdt@G<)`lT{3^T?@Y5$e44s0toH4ZIw6UKOg}I}NG77Q=lG_@Y09 zE<6e~(5cqhs1E0$`df^;g$2kzvx*OWzYEphKGXz{HlqIO=oAN3flB+u_o#tfMU~2* z(P#$st?{UiGEg07p*rk`y6_-WzoSt7PDJKtW}wbrimH5pLqm&X9jXF{Q1_?|qp%Wn zpy%Dtr4xr9EiKq6V_v?w46BQ8T}Wnm}NbdwwLU!mUvQPQ_3?{~0ti<36Yo z4MYuKENVd6s2}E_Mn2EF81>xeqXx7dHIZGYfgVI%=rnf3vzUxw+`lf^1AB3OlS?B7 zKS!PL3%0?;7H&r)Q3IKR8t5#${~D??ORevqX1vaRza2GzQq-+Ej2hUFcK;qax;IVu zRx`}RD9plGoP=?hkDB>z)QhSV8KXIaTE(~QzBirGr-?=_x-9Du)LNNU|bp3npJgF)zr!%-z2gZ?-T^}82Q6Hq^@#7gUWyx_$IP`}S- z+WNi_HL$g)$~r|fRHBnuj^|J>l1+*3({Kp&qWJ&G0y)_57!K}0L}Y3N{`gc`^S)Bv|)HXg$o*o7bK zLXTn)4nUnh0@HB@>Q)t@23m^Ydj3z)&`2+!O8hHoaRev1Cq9I_U|ZA+=W*0iFdp^0 zmr)%Tpxy@?QI*t-$V??9MnLUpw3&HLjBe8Cmhf!Ekn)V1nL5n7|1HV zWWT>guUZ>Fqh=W1)~!HeR0Uh1?tMoL!yc&qhoUMw8AH*r$Mf4#e|5B;1A07)P#4~T z>aY~m;W1PRD^LTyj;hRURHbUQb1RUBS}UDUkJk`X1zyEiEU@lHt%YwK8k+Gn)X46m zE)>$xcT`Fw})6qGp(fs!SnjB0KH(`!SLIvsT|U_xxn!FTQayY3Q*T zi<-$K)C=WJ5ZaK~vnY)UpQ*S-B6_*iB#20Lk(y%>UW=_ zZoxV1gCX7As_c^v4b5;g>fXPCI$<&L;`3~}ciN5-y;QWR z{M*S9QlDt{+9s3co)!xkXORAOU(B)XE%;6e`s7LPmr&Pwy#Jt@-TUm{6wm^ zmuV~}dd7bs>0~L%BwF>q-`-(I_y5nN-|xQo7wr+m^ZZxXFL;%k^<*d+X^*YI+2k;Z zB|C|>JuYSkF0k#tqV8$+Hjl<@qzTb2)pm~j-P3Z{Q?bL&OmdK2GiJ7y@Q|G_7$tMgvO(G#~-VRR=BoxWQ-biYl%0> zXcA$MJ&hNL9@`@F0*N8o!d=Wj%q3??9@#)nkiTe-eP{%b@5mzZE$K_Dw^r2+^dU{j zD`XsbjOej@iD-M=#e9g3$@}Cw`H~DGL1Z<_CLfXi*SLh{Mb82L0O2m%7VU{%I@&sr zsh$>p)2%7^jBUSeZH;=ITaaWDPqdvSbx0}MOFZ|u2M#A!$uROa@&{6voFdw$kPyX6qiNJ@Gc(KsGWE5w@qdT`=&>wq%40bAv!>fjMNUr YixTqvibo{pco+Mme(Y16k+#3)Z-j9cYXATM diff --git a/locale/de_DE/LC_MESSAGES/The Legend of Z.po b/locale/de_DE/LC_MESSAGES/The Legend of Z.po index bfd8b046..ad6d3818 100644 --- a/locale/de_DE/LC_MESSAGES/The Legend of Z.po +++ b/locale/de_DE/LC_MESSAGES/The Legend of Z.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: The Legend of Z\n" -"POT-Creation-Date: 2014-05-27 11:27+0100\n" -"PO-Revision-Date: 2014-05-27 11:28+0100\n" +"POT-Creation-Date: 2014-05-28 10:27+0100\n" +"PO-Revision-Date: 2014-05-28 10:29+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" @@ -17,7 +17,7 @@ msgstr "" "X-Poedit-SearchPath-1: questtypes\n" "X-Poedit-SearchPath-2: controllers\n" -#: controllers/CharactersController.inc:368 +#: controllers/CharactersController.inc:373 #: controllers/UsersController.inc:312 views/ajax/characters/index.tpl:10 #: views/ajax/users/index.tpl:10 views/html/characters/index.tpl:39 #: views/html/characters/manage.tpl:35 views/html/characters/manage.tpl:50 @@ -27,7 +27,7 @@ msgstr "" msgid "Admin" msgstr "Administrator" -#: controllers/CharactersController.inc:374 +#: controllers/CharactersController.inc:379 #: controllers/UsersController.inc:318 views/ajax/characters/index.tpl:12 #: views/ajax/users/index.tpl:12 views/html/characters/index.tpl:40 #: views/html/characters/manage.tpl:36 views/html/characters/manage.tpl:51 @@ -37,7 +37,7 @@ msgstr "Administrator" msgid "Moderator" msgstr "Moderator" -#: controllers/CharactersController.inc:380 +#: controllers/CharactersController.inc:385 #: controllers/UsersController.inc:324 views/ajax/characters/index.tpl:14 #: views/ajax/users/index.tpl:14 views/html/characters/index.tpl:41 #: views/html/characters/manage.tpl:37 views/html/characters/manage.tpl:53 @@ -131,6 +131,7 @@ msgstr "Fehler beim Dateiupload: %s" #: views/html/charactergroupsquests/create.tpl:66 #: views/html/charactergroupsquests/edit.tpl:67 #: views/html/charactergroupsquests/manage.tpl:63 +#: views/html/seminaries/create.tpl:60 views/html/seminaries/edit.tpl:62 msgid "Allowed file types" msgstr "Erlaubte Dateiformate" @@ -140,6 +141,7 @@ msgstr "Erlaubte Dateiformate" #: views/html/charactergroupsquests/create.tpl:69 #: views/html/charactergroupsquests/edit.tpl:70 #: views/html/charactergroupsquests/manage.tpl:63 +#: views/html/seminaries/create.tpl:63 views/html/seminaries/edit.tpl:65 #, php-format msgid "%s-files" msgstr "%s-Dateien" @@ -150,6 +152,7 @@ msgstr "%s-Dateien" #: views/html/charactergroupsquests/create.tpl:69 #: views/html/charactergroupsquests/edit.tpl:70 #: views/html/charactergroupsquests/manage.tpl:63 +#: views/html/seminaries/create.tpl:63 views/html/seminaries/edit.tpl:65 msgid "max." msgstr "max." @@ -455,7 +458,7 @@ msgstr "Motto" #: views/html/charactergroupsquests/create.tpl:93 #: views/html/characters/register.tpl:94 views/html/library/create.tpl:46 #: views/html/library/edit.tpl:124 views/html/questgroups/create.tpl:17 -#: views/html/quests/create.tpl:43 views/html/seminaries/create.tpl:14 +#: views/html/quests/create.tpl:43 views/html/seminaries/create.tpl:75 #: views/html/users/create.tpl:96 msgid "create" msgstr "erstellen" @@ -516,7 +519,7 @@ msgstr "%s-Gruppe bearbeiten" #: views/html/charactergroups/editgroup.tpl:83 #: views/html/charactergroups/editgroupsgroup.tpl:50 #: views/html/charactergroupsquests/edit.tpl:94 -#: views/html/characters/edit.tpl:108 +#: views/html/characters/edit.tpl:108 views/html/seminaries/edit.tpl:77 msgid "edit" msgstr "bearbeiten" @@ -609,6 +612,7 @@ msgstr "Neue %s-Quest" #: views/html/charactergroupsquests/edit.tpl:34 #: views/html/library/create.tpl:22 views/html/library/edit.tpl:22 #: views/html/library/edit.tpl:62 views/html/library/edit.tpl:100 +#: views/html/seminaries/create.tpl:30 views/html/seminaries/edit.tpl:32 #, php-format msgid "Title is too short (min. %d chars)" msgstr "Der Titel ist zu kurz (min. %d Zeichen)" @@ -617,6 +621,7 @@ msgstr "Der Titel ist zu kurz (min. %d Zeichen)" #: views/html/charactergroupsquests/edit.tpl:36 #: views/html/library/create.tpl:24 views/html/library/edit.tpl:24 #: views/html/library/edit.tpl:64 views/html/library/edit.tpl:102 +#: views/html/seminaries/create.tpl:32 views/html/seminaries/edit.tpl:34 #, php-format msgid "Title is too long (max. %d chars)" msgstr "Der Titel ist zu lang (max. %d Zeichen)" @@ -625,6 +630,7 @@ msgstr "Der Titel ist zu lang (max. %d Zeichen)" #: views/html/charactergroupsquests/edit.tpl:38 #: views/html/library/create.tpl:26 views/html/library/edit.tpl:26 #: views/html/library/edit.tpl:66 views/html/library/edit.tpl:104 +#: views/html/seminaries/create.tpl:34 views/html/seminaries/edit.tpl:36 msgid "Title contains illegal characters" msgstr "Der Titel enthält ungültige Zeichen" @@ -632,6 +638,7 @@ msgstr "Der Titel enthält ungültige Zeichen" #: views/html/charactergroupsquests/edit.tpl:40 #: views/html/library/create.tpl:28 views/html/library/edit.tpl:28 #: views/html/library/edit.tpl:68 views/html/library/edit.tpl:106 +#: views/html/seminaries/create.tpl:36 views/html/seminaries/edit.tpl:38 msgid "Title already exists" msgstr "Der Titel existiert bereits" @@ -639,6 +646,7 @@ msgstr "Der Titel existiert bereits" #: views/html/charactergroupsquests/edit.tpl:42 #: views/html/library/create.tpl:30 views/html/library/edit.tpl:30 #: views/html/library/edit.tpl:70 views/html/library/edit.tpl:108 +#: views/html/seminaries/create.tpl:38 views/html/seminaries/edit.tpl:40 msgid "Title invalid" msgstr "Der Titel ist ungültig" @@ -666,8 +674,8 @@ msgstr "Die XP-Angabe ist ungültig" #: views/html/library/edit.tpl:43 views/html/library/edit.tpl:44 #: views/html/library/edit.tpl:121 views/html/library/edit.tpl:122 #: views/html/questgroups/create.tpl:14 views/html/questgroups/create.tpl:15 -#: views/html/seminaries/create.tpl:11 views/html/seminaries/create.tpl:12 -#: views/html/seminaries/edit.tpl:13 views/html/seminaries/edit.tpl:14 +#: views/html/seminaries/create.tpl:68 views/html/seminaries/create.tpl:69 +#: views/html/seminaries/edit.tpl:70 views/html/seminaries/edit.tpl:71 msgid "Title" msgstr "Titel" @@ -682,6 +690,8 @@ msgstr "Questgruppe" #: views/html/charactergroupsquests/edit.tpl:85 #: views/html/charactergroupsquests/edit.tpl:86 #: views/html/charactergroupsquests/quest.tpl:45 +#: views/html/seminaries/create.tpl:72 views/html/seminaries/create.tpl:73 +#: views/html/seminaries/edit.tpl:74 views/html/seminaries/edit.tpl:75 msgid "Description" msgstr "Beschreibung" @@ -735,7 +745,7 @@ msgstr "Die Datei ist ungültig" #: views/html/charactergroupsquests/manage.tpl:66 #: views/html/library/edit.tpl:46 views/html/library/edit.tpl:86 -#: views/html/seminaries/edit.tpl:16 views/html/users/edit.tpl:103 +#: views/html/users/edit.tpl:103 msgid "save" msgstr "speichern" @@ -1122,6 +1132,42 @@ msgstr "eingereicht" msgid "New seminary" msgstr "Neuer Kurs" +#: views/html/seminaries/create.tpl:19 views/html/seminaries/edit.tpl:21 +#, php-format +msgid "Error during moodpic upload: %s" +msgstr "Fehler beim Upload des Stimmungsbildes: %s" + +#: views/html/seminaries/create.tpl:21 views/html/seminaries/edit.tpl:23 +#, php-format +msgid "Moodpic has wrong type “%s”" +msgstr "Der Dateityp „%s“ ist für Stimmungsbilder nicht erlaubt" + +#: views/html/seminaries/create.tpl:23 views/html/seminaries/edit.tpl:25 +msgid "Moodpic exceeds size maximum" +msgstr "Das Stimmungsbild ist zu groß" + +#: views/html/seminaries/create.tpl:25 views/html/seminaries/edit.tpl:27 +msgid "Moodpic invalid" +msgstr "Das Stimmungsbild ist ungültig" + +#: views/html/seminaries/create.tpl:43 views/html/seminaries/edit.tpl:45 +#, php-format +msgid "Course is too long (max. %d chars)" +msgstr "Der Kurs ist zu lang (max. %d Zeichen)" + +#: views/html/seminaries/create.tpl:45 views/html/seminaries/edit.tpl:47 +msgid "Course invalid" +msgstr "Das Kurs ist ungültig" + +#: views/html/seminaries/create.tpl:58 views/html/seminaries/edit.tpl:60 +msgid "Moodpic" +msgstr "Stimmungsbild" + +#: views/html/seminaries/create.tpl:70 views/html/seminaries/create.tpl:71 +#: views/html/seminaries/edit.tpl:72 views/html/seminaries/edit.tpl:73 +msgid "Course" +msgstr "Kurs" + #: views/html/seminaries/delete.tpl:10 views/html/seminaries/seminary.tpl:10 msgid "Delete seminary" msgstr "Kurs löschen" diff --git a/models/MediaModel.inc b/models/MediaModel.inc index 08823bab..c1cdf6c7 100644 --- a/models/MediaModel.inc +++ b/models/MediaModel.inc @@ -135,6 +135,45 @@ } + /** + * Create a new moodpic. + * + * @param int $userId ID of user that does the upload + * @param int $seminaryId ID of Seminary + * @param string $filename Filename of uploading media + * @param string $description Description for media + * @param string $mimetype Mimetype of media + * @param string $tmpFilename Name of temporary uploaded file + * @return mixed ID of media record or false if upload failed + */ + public function createMoodpic($userId, $seminaryId, $filename, $description, $mimetype, $tmpFilename) + { + $mediaId = false; + $this->db->setAutocommit(false); + + try { + // Create Seminary media record + $mediaId = $this->createSeminaryMedia($userId, $seminaryId, $filename, $description, $mimetype); + + // Upload file + $filename = ROOT.DS.\nre\configs\AppConfig::$dirs['seminarymedia'].DS.$mediaId; + if(!move_uploaded_file($tmpFilename, $filename)) + { + $this->db->rollback(); + $mediaId = false; + } + } + catch(\nre\exceptions\DatamodelException $e) { + $this->db->rollback(); + $this->db->setAutocommit(true); + } + + + $this->db->setAutocommit(true); + return $mediaId; + } + + /** * Create a new Quests media by creating a new Seminarymedia and * adding it to the list of Quests media. diff --git a/models/SeminariesModel.inc b/models/SeminariesModel.inc index e31cdce7..fe734fba 100644 --- a/models/SeminariesModel.inc +++ b/models/SeminariesModel.inc @@ -133,23 +133,49 @@ /** - * Create a new seminary. + * Check if a Seminary title already exists. * - * @param string $title Title of seminary to create - * @param int $userId ID of creating user - * @return int ID of the newly created seminary + * @param string $title Seminary title to check + * @param int $seminaryId Do not check this ID (for editing) + * @return boolean Whether Seminary title exists or not */ - public function createSeminary($title, $userId) + public function seminaryTitleExists($title, $seminaryId=null) + { + $data = $this->db->query( + 'SELECT id '. + 'FROM seminaries '. + 'WHERE title = ? OR url = ?', + 'ss', + $title, + \nre\core\Linker::createLinkParam($title) + ); + + return (!empty($data) && (is_null($seminaryId) || $seminaryId != $data[0]['id'])); + } + + + /** + * Create a new Seminary. + * + * @param int $userId ID of creating user + * @param string $title Title of Seminary to create + * @param string $course Course of Seminary + * @param string $description Description of new Seminary + * @return int ID of the newly created Seminary + */ + public function createSeminary($userId, $title, $course, $description) { $this->db->query( 'INSERT INTO seminaries '. - '(created_user_id, title, url) '. + '(created_user_id, title, url, course, description) '. 'VALUES '. - '(?, ?, ?)', - 'iss', + '(?, ?, ?, ?, ?)', + 'issss', $userId, $title, - \nre\core\Linker::createLinkParam($title) + \nre\core\Linker::createLinkParam($title), + $course, + $description ); @@ -158,21 +184,44 @@ /** - * Edit a seminary. + * Set the moodpic for a Seminary. * - * @throws DatamodelException - * @param int $seminaryId ID of the seminary to delete - * @param string $title New title of seminary + * @param int $seminaryId ID of Seminary to set moodpic for + * @param int $mediaId ID of moodpic media */ - public function editSeminary($seminaryId, $title) + public function setMoodpicForSeminary($seminaryId, $mediaId) { $this->db->query( 'UPDATE seminaries '. - 'SET title = ?, url = ? '. + 'SET seminarymedia_id = ? '. 'WHERE id = ?', - 'ssi', + 'ii', + $mediaId, + $seminaryId + ); + } + + + /** + * Edit a seminary. + * + * @throws DatamodelException + * @param int $seminaryId ID of Seminary to delete + * @param string $title New title of Seminary + * @param string $course New course of Seminary + * @param string $description New description of Seminary + */ + public function editSeminary($seminaryId, $title, $course, $description) + { + $this->db->query( + 'UPDATE seminaries '. + 'SET title = ?, url = ?, course = ?, description = ? '. + 'WHERE id = ?', + 'ssssi', $title, \nre\core\Linker::createLinkParam($title), + $course, + $description, $seminaryId ); } diff --git a/views/html/seminaries/create.tpl b/views/html/seminaries/create.tpl index 425f2367..a6cb63eb 100644 --- a/views/html/seminaries/create.tpl +++ b/views/html/seminaries/create.tpl @@ -6,10 +6,71 @@

-
+ +
    + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + +
+ + +
+ + +

:

+
    + +
  • 0) : ?>(  MiB)
  • + +
+
-
+ />
+ + />
+
diff --git a/views/html/seminaries/edit.tpl b/views/html/seminaries/edit.tpl index f94b1916..5e1ca2ec 100644 --- a/views/html/seminaries/edit.tpl +++ b/views/html/seminaries/edit.tpl @@ -8,10 +8,71 @@

-
+ +
    + &$settings) : ?> +
  • +
      + $value) : ?> +
    • + +
    • + +
    +
  • + +
+ + +
+ + +

:

+
    + +
  • 0) : ?>(  MiB)
  • + +
+
-
+ />
+ + />
+
- +