From 9b05d9939127760c851be3ca289bb89bc8bcf520 Mon Sep 17 00:00:00 2001 From: coderkun Date: Fri, 30 May 2014 10:46:53 +0200 Subject: [PATCH] implement CRUD for Charactertypes (resolves issue #319) --- agents/intermediate/CharactertypesAgent.inc | 35 ++++ configs/AppConfig.inc | 6 +- controllers/CharactersController.inc | 16 +- controllers/CharactertypesController.inc | 198 ++++++++++++++++++++ controllers/SeminariesController.inc | 3 +- locale/de_DE/LC_MESSAGES/The Legend of Z.mo | Bin 17144 -> 17342 bytes locale/de_DE/LC_MESSAGES/The Legend of Z.po | 67 ++++--- models/CharactertypesModel.inc | 81 ++++++++ views/html/characters/register.tpl | 2 + views/html/charactertypes/manage.tpl | 92 +++++++++ views/html/seminaries/index.tpl | 8 +- views/html/seminaries/seminary.tpl | 15 +- 12 files changed, 493 insertions(+), 30 deletions(-) create mode 100644 agents/intermediate/CharactertypesAgent.inc create mode 100644 controllers/CharactertypesController.inc create mode 100644 views/html/charactertypes/manage.tpl diff --git a/agents/intermediate/CharactertypesAgent.inc b/agents/intermediate/CharactertypesAgent.inc new file mode 100644 index 00000000..1a3c8b65 --- /dev/null +++ b/agents/intermediate/CharactertypesAgent.inc @@ -0,0 +1,35 @@ + + * @copyright 2014 Heinrich-Heine-Universität Düsseldorf + * @license http://www.gnu.org/licenses/gpl.html + * @link https://bitbucket.org/coderkun/the-legend-of-z + */ + + namespace hhu\z\agents\intermediate; + + + /** + * Agent to handle Charactertyes of a Seminary. + * + * @author Oliver Hanraths + */ + class CharactertypesAgent extends \nre\agents\IntermediateAgent + { + + + + + /** + * Action: index. + */ + public function index(\nre\core\Request $request, \nre\core\Response $response) + { + } + + } + +?> diff --git a/configs/AppConfig.inc b/configs/AppConfig.inc index b68c5458..22ae23e1 100644 --- a/configs/AppConfig.inc +++ b/configs/AppConfig.inc @@ -211,7 +211,11 @@ ), 'course' => array( 'maxlength' => 128 - ) + ), + 'charactertypename' => array( + 'minlength' => 1, + 'maxlength' => 32 + ), ); diff --git a/controllers/CharactersController.inc b/controllers/CharactersController.inc index 5ea6ff9d..df12d9ad 100644 --- a/controllers/CharactersController.inc +++ b/controllers/CharactersController.inc @@ -222,7 +222,7 @@ throw new \nre\exceptions\AccessDeniedException(); } catch(\nre\exceptions\IdNotFoundException $e) { - // The should be the case + // This should be the case } @@ -308,6 +308,20 @@ // Get XP-levels $xplevels = $this->Characters->getXPLevelsForSeminary($seminary['id']); + // Get Avatars + if(count($xplevels) > 0) + { + foreach($types as &$type) + { + try { + $type['avatar'] = $this->Avatars->getAvatarByTypeAndLevel($seminary['id'], $type['url'], $xplevels[0]['level']); + } + catch(\nre\exceptions\IdNotFoundException $e) { + // No Avatar available + } + } + } + // Set titile $this->addTitleLocalized('Create Character'); diff --git a/controllers/CharactertypesController.inc b/controllers/CharactertypesController.inc new file mode 100644 index 00000000..63bff727 --- /dev/null +++ b/controllers/CharactertypesController.inc @@ -0,0 +1,198 @@ + + * @copyright 2014 Heinrich-Heine-Universität Düsseldorf + * @license http://www.gnu.org/licenses/gpl.html + * @link https://bitbucket.org/coderkun/the-legend-of-z + */ + + namespace hhu\z\controllers; + + + /** + * Controller of the CharactertypesAgent to handle Charactertyes of a + * Seminary. + * + * @author Oliver Hanraths + */ + class CharactertypesController extends \hhu\z\controllers\SeminaryController + { + /** + * Required components + * + * @var array + */ + public $components = array('validation'); + /** + * Required models + * + * @var array + */ + public $models = array('charactertypes'); + /** + * User permissions + * + * @var array + */ + public $permissions = array( + 'manage' => array('admin', 'moderator', 'user') + ); + + + + + /** + * Action: manage. + * + * Manage Characters. + * + * @throws IdNotFoundException + * @param string $seminaryUrl URL-Title of a Seminary + */ + public function manage($seminaryUrl) + { + // Get seminary + $seminary = $this->Seminaries->getSeminaryByUrl($seminaryUrl); + + // Check permissions + if( + (is_null(self::$character) && count(array_intersect(array('admin', 'moderator'), \hhu\z\controllers\IntermediateController::$user['roles'])) == 0) || + (!is_null(self::$character) && count(array_intersect(array('admin', 'moderator'), self::$character['characterroles'])) == 0) + ) { + throw new AccessDeniedException(); + } + + // Get Charactertypes + $charactertypes = $this->Charactertypes->getCharacterTypesForSeminary($seminary['id']); + + // Values + $charactertypesNames = array(); + foreach($charactertypes as &$charactertype) { + $charactertypesNames[$charactertype['id']] = $charactertype['name']; + } + $deleteCharactertypes = null; + $charactertypeName = ''; + $validations = array( + 'edit-charactertypes' => true, + 'create-charactertype' => true + ); + + // Edit + $action = null; + if($this->request->getRequestMethod() == 'POST') + { + // Edit and delete Charactertypes + if(!is_null($this->request->getPostParam('edit-charactertypes'))) + { + $action = 'edit-charactertypes'; + + // Get params and validate them + $charactertypesNames = $this->request->getPostParam('charactertypes'); + $deleteCharactertypes = $this->request->getPostParam('delete-charactertypes'); + foreach($charactertypes as &$charactertype) + { + if(!is_null($deleteCharactertypes) && array_key_exists($charactertype['id'], $deleteCharactertypes)) { + continue; + } + + $name = $charactertypesNames[$charactertype['id']]; + $charactertypeValidation = $this->Validation->validate($name, \nre\configs\AppConfig::$validation['charactertypename']); + if($charactertypeValidation !== true) + { + if(!is_array($validations['edit-charactertypes'])) { + $validations['edit-charactertypes'] = array(); + } + if(!array_key_exists($charactertype['id'], $validations['edit-charactertypes']) || !is_array($validations['edit-charactertypes'][$charactertype['id']])) { + $validations['edit-charactertypes'][$charactertype['id']] = array(); + } + $validations['edit-charactertypes'][$charactertype['id']] = $this->Validation->addValidationResults($validations['edit-charactertypes'][$charactertype['id']], 'charactertypename', $charactertypeValidation); + } + if($this->Charactertypes->charactertypeNameExists($seminary['id'], $name, $charactertype['id'])) + { + if(!is_array($validations['edit-charactertypes'])) { + $validations['edit-charactertypes'] = array(); + } + if(!array_key_exists($charactertype['id'], $validations['edit-charactertypes']) || !is_array($validations['edit-charactertypes'][$charactertype['id']])) { + $validations['edit-charactertypes'][$charactertype['id']] = array(); + } + $validations['edit-charactertypes'][$charactertype['id']] = $this->Validation->addValidationResult($validations['edit-charactertypes'][$charactertype['id']], 'charactertypename', 'exist', true); + } + } + + // Edit and delete + if($validations['edit-charactertypes'] === true) + { + foreach($charactertypes as &$charactertype) + { + // Delete + if(!is_null($deleteCharactertypes) && array_key_exists($charactertype['id'], $deleteCharactertypes)) { + $this->Charactertypes->deleteCharactertype($charactertype['id']); + } + // Edit + elseif(!is_null($charactertypesNames) && array_key_exists($charactertype['id'], $charactertypesNames)) + { + $name = $charactertypesNames[$charactertype['id']]; + $this->Charactertypes->editCharactertype($charactertype['id'], $name); + } + } + + // Redirect + //$this->redirect($this->linker->link(array('seminaries', 'index'))); + $this->redirect($this->linker->link(null, 3)); + } + } + + // Create Charactertype + if(!is_null($this->request->getPostParam('create-charactertype'))) + { + $action = 'create-charactertype'; + + // Get params and validate them + $validations[$action] = $this->Validation->validateParams($this->request->getPostParams(), array('charactertypename')); + $charactertypeName = $this->request->getPostParam('charactertypename'); + if($this->Charactertypes->charactertypeNameExists($seminary['id'], $charactertypeName)) { + $validations[$action] = $this->Validation->addValidationResult($validations[$action], 'charactertypename', 'exist', true); + } + + // Create + if($validations[$action] === true) + { + $this->Charactertypes->createCharactertype( + $this->Auth->getUserId(), + $seminary['id'], + $charactertypeName + ); + $charactertypeName = ''; + + // Redirect + $this->redirect($this->linker->link(null, 3)); + } + } + } + + // Get validation settings + $validationSettings = array( + 'charactertypename' => \nre\configs\AppConfig::$validation['charactertypename'] + ); + + + // Set titile + $this->addTitleLocalized('Manage Charactertypes'); + $this->addTitle($seminary['title']); + + // Pass data to view + $this->set('seminary', $seminary); + $this->set('charactertypesNames', $charactertypesNames); + $this->set('deleteCharactertypes', $deleteCharactertypes); + $this->set('charactertypeName', $charactertypeName); + $this->set('action', $action); + $this->set('validations', $validations); + $this->set('validationSettings', $validationSettings); + } + + } + +?> diff --git a/controllers/SeminariesController.inc b/controllers/SeminariesController.inc index a0bd8a84..90887ab9 100644 --- a/controllers/SeminariesController.inc +++ b/controllers/SeminariesController.inc @@ -24,7 +24,7 @@ * * @var array */ - public $models = array('seminaries', 'users', 'characterroles', 'questgroupshierarchy', 'questgroups', 'media'); + public $models = array('seminaries', 'users', 'characterroles', 'charactertypes', 'questgroupshierarchy', 'questgroups', 'media'); /** * Required components * @@ -75,6 +75,7 @@ $description = \hhu\z\Utils::shortenString($seminary['description'], 100, 120); $seminary['description'] = $description.(strlen($description) < strlen($seminary['description']) ? ' …' : null); $seminary['creator'] = $this->Users->getUserById($seminary['created_user_id']); + $seminary['charactertypes'] = $this->Charactertypes->getCharacterTypesForSeminary($seminary['id']); // Character of currently logged-in user try { 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 ee0b8d63bf5d90ebceac18b34e95dfc2a6a29b8e..f89a9e9dcf5f050bc97207d4060deb94109a23a5 100644 GIT binary patch delta 5734 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 delta 5612 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 MLk*VAie__p0Rb~M#Q*>R 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 ad6d3818..cc889b68 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-28 10:27+0100\n" -"PO-Revision-Date: 2014-05-28 10:29+0100\n" +"POT-Creation-Date: 2014-05-30 10:44+0100\n" +"PO-Revision-Date: 2014-05-30 10:46+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:373 +#: controllers/CharactersController.inc:387 #: 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:379 +#: controllers/CharactersController.inc:393 #: 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:385 +#: controllers/CharactersController.inc:399 #: 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 @@ -382,6 +382,8 @@ msgstr "Das Icon ist ungültig" #: views/html/charactergroups/creategroupsgroup.tpl:22 #: views/html/charactergroups/editgroup.tpl:34 #: views/html/charactergroups/editgroupsgroup.tpl:22 +#: views/html/charactertypes/manage.tpl:29 +#: views/html/charactertypes/manage.tpl:69 #, php-format msgid "Name is too short (min. %d chars)" msgstr "Der Name ist zu kurz (min. %d Zeichen)" @@ -390,6 +392,8 @@ msgstr "Der Name ist zu kurz (min. %d Zeichen)" #: views/html/charactergroups/creategroupsgroup.tpl:24 #: views/html/charactergroups/editgroup.tpl:36 #: views/html/charactergroups/editgroupsgroup.tpl:24 +#: views/html/charactertypes/manage.tpl:31 +#: views/html/charactertypes/manage.tpl:71 #, php-format msgid "Name is too long (max. %d chars)" msgstr "Der Name ist zu lang (max. %d Zeichen)" @@ -405,6 +409,8 @@ msgstr "Der Name enthält ungültige Zeichen" #: views/html/charactergroups/creategroupsgroup.tpl:28 #: views/html/charactergroups/editgroup.tpl:40 #: views/html/charactergroups/editgroupsgroup.tpl:28 +#: views/html/charactertypes/manage.tpl:33 +#: views/html/charactertypes/manage.tpl:73 msgid "Name already exists" msgstr "Der Name existiert bereits" @@ -412,6 +418,8 @@ msgstr "Der Name existiert bereits" #: views/html/charactergroups/creategroupsgroup.tpl:30 #: views/html/charactergroups/editgroup.tpl:42 #: views/html/charactergroups/editgroupsgroup.tpl:30 +#: views/html/charactertypes/manage.tpl:35 +#: views/html/charactertypes/manage.tpl:75 msgid "Name invalid" msgstr "Der Name ist ungültig" @@ -441,8 +449,9 @@ msgstr "Icon" #: views/html/charactergroups/editgroup.tpl:75 #: views/html/charactergroups/editgroupsgroup.tpl:46 #: views/html/charactergroups/editgroupsgroup.tpl:47 -#: views/html/quests/create.tpl:15 views/html/quests/create.tpl:16 -#: views/html/users/user.tpl:23 +#: views/html/charactertypes/manage.tpl:88 +#: views/html/charactertypes/manage.tpl:89 views/html/quests/create.tpl:15 +#: views/html/quests/create.tpl:16 views/html/users/user.tpl:23 msgid "Name" msgstr "Name" @@ -456,7 +465,8 @@ msgstr "Motto" #: views/html/charactergroups/creategroup.tpl:77 #: views/html/charactergroups/creategroupsgroup.tpl:50 #: views/html/charactergroupsquests/create.tpl:93 -#: views/html/characters/register.tpl:94 views/html/library/create.tpl:46 +#: views/html/characters/register.tpl:96 +#: views/html/charactertypes/manage.tpl:91 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:75 #: views/html/users/create.tpl:96 @@ -486,9 +496,9 @@ msgstr "Soll die %s-Gruppen „%s“ wirklich gelöscht werden?" #: views/html/charactergroups/deletegroup.tpl:15 #: views/html/charactergroups/deletegroupsgroup.tpl:14 #: views/html/charactergroupsquests/delete.tpl:15 -#: views/html/characters/delete.tpl:17 views/html/library/delete.tpl:14 -#: views/html/library/edit.tpl:83 views/html/seminaries/delete.tpl:13 -#: views/html/users/delete.tpl:11 +#: views/html/characters/delete.tpl:17 views/html/charactertypes/manage.tpl:48 +#: views/html/library/delete.tpl:14 views/html/library/edit.tpl:83 +#: views/html/seminaries/delete.tpl:13 views/html/users/delete.tpl:11 msgid "delete" msgstr "löschen" @@ -744,8 +754,8 @@ msgid "File invalid" 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/users/edit.tpl:103 +#: views/html/charactertypes/manage.tpl:52 views/html/library/edit.tpl:46 +#: views/html/library/edit.tpl:86 views/html/users/edit.tpl:103 msgid "save" msgstr "speichern" @@ -844,12 +854,12 @@ msgstr "Charaktereigenschaften" msgid "Character name" msgstr "Charaktername" -#: views/html/characters/edit.tpl:81 views/html/characters/register.tpl:67 +#: views/html/characters/edit.tpl:81 views/html/characters/register.tpl:69 #, php-format msgid "The Seminary field “%s” is invalid" msgstr "Das Kursfeld „%s“ ist ungültig" -#: views/html/characters/edit.tpl:86 views/html/characters/register.tpl:72 +#: views/html/characters/edit.tpl:86 views/html/characters/register.tpl:74 msgid "Seminary fields" msgstr "Kursfelder" @@ -903,6 +913,19 @@ msgstr "Charakter erstellen" msgid "Please choose an avatar" msgstr "Bitte wähle einen Avatar aus" +#: views/html/charactertypes/manage.tpl:9 views/html/seminaries/index.tpl:38 +#: views/html/seminaries/seminary.tpl:14 +msgid "Manage Charactertypes" +msgstr "Charakterrassen verwalten" + +#: views/html/charactertypes/manage.tpl:14 +msgid "Edit Charactertypes" +msgstr "Characterrassen bearbeiten" + +#: views/html/charactertypes/manage.tpl:58 +msgid "Create new Charactertype" +msgstr "Neue Characterrasse erstellen" + #: views/html/error/index.tpl:5 views/html/error/index.tpl:14 #: views/html/introduction/index.tpl:9 views/html/menu/index.tpl:6 #: views/html/users/login.tpl:6 views/html/users/login.tpl:20 @@ -1111,7 +1134,7 @@ msgstr "Quest" msgid "Go on" msgstr "Fortfahren" -#: views/html/quests/quest.tpl:134 views/html/seminaries/seminary.tpl:36 +#: views/html/quests/quest.tpl:134 views/html/seminaries/seminary.tpl:43 msgid "Let’s go" msgstr "Auf ins Abenteuer!" @@ -1168,7 +1191,7 @@ msgstr "Stimmungsbild" msgid "Course" msgstr "Kurs" -#: views/html/seminaries/delete.tpl:10 views/html/seminaries/seminary.tpl:10 +#: views/html/seminaries/delete.tpl:10 views/html/seminaries/seminary.tpl:11 msgid "Delete seminary" msgstr "Kurs löschen" @@ -1177,7 +1200,7 @@ msgstr "Kurs löschen" msgid "Should the seminary “%s” really be deleted?" msgstr "Soll der Kurs „%s“ wirklich gelöscht werden?" -#: views/html/seminaries/edit.tpl:10 views/html/seminaries/seminary.tpl:9 +#: views/html/seminaries/edit.tpl:10 views/html/seminaries/seminary.tpl:10 msgid "Edit seminary" msgstr "Kurs bearbeiten" @@ -1190,20 +1213,20 @@ msgstr "Neuen Kurs erstellen" msgid "created by %s on %s" msgstr "erstellt von %s am %s" -#: views/html/seminaries/index.tpl:35 +#: views/html/seminaries/index.tpl:36 msgid "Create a Character" msgstr "Erstelle einen Charakter" -#: views/html/seminaries/index.tpl:37 +#: views/html/seminaries/index.tpl:41 #, php-format msgid "Your Character “%s” has not been activated yet" msgstr "Dein Charakter „%s“ wurde noch nicht aktiviert" -#: views/html/seminaries/seminary.tpl:11 +#: views/html/seminaries/seminary.tpl:18 msgid "Show Quests" msgstr "Quests anzeigen" -#: views/html/seminaries/seminary.tpl:12 +#: views/html/seminaries/seminary.tpl:19 msgid "Recalculate XPs" msgstr "XP neuberechnen" diff --git a/models/CharactertypesModel.inc b/models/CharactertypesModel.inc index 07c8d5e9..7e63db04 100644 --- a/models/CharactertypesModel.inc +++ b/models/CharactertypesModel.inc @@ -52,6 +52,87 @@ ); } + + /** + * Check if a Charactertype name already exists. + * + * @param int $seminaryId ID of Seminary + * @param string $name Charactertype name to check + * @param int $charactertypeId Do not check this ID (for editing) + * @return boolean Whether Charactertype name exists or not + */ + public function charactertypeNameExists($seminaryId, $name, $charactertypeId=null) + { + $data = $this->db->query( + 'SELECT id '. + 'FROM charactertypes '. + 'WHERE seminary_id = ? AND (name = ? OR url = ?)', + 'iss', + $seminaryId, + $name, + \nre\core\Linker::createLinkParam($name) + ); + + return (!empty($data) && (is_null($charactertypeId) || $charactertypeId != $data[0]['id'])); + } + + + /** + * Create a new Charactertype for a Seminary. + * + * @param int $userId ID of creating user + * @param int $seminaryId ID of Seminary + * @param string $name Name for new Charactertype + * @return int ID of newly created Charactertype + */ + public function createCharactertype($userId, $seminaryId, $name) + { + $this->db->query( + 'INSERT INTO charactertypes '. + '(created_user_id, seminary_id, name, url) '. + 'VALUES '. + '(?, ?, ?, ?) ', + 'iiss', + $userId, + $seminaryId, + $name, + \nre\core\Linker::createLinkParam($name) + ); + + return $this->db->getInsertId(); + } + + + /** + * Edit a Charactertype. + * + * @param int $charactertypeId ID of Charactertype to edit + * @param string $name New name of Charactertype + */ + public function editCharactertype($charactertypeId, $name) + { + $this->db->query( + 'UPDATE charactertypes '. + 'SET name = ?, url = ? '. + 'WHERE id = ?', + 'ssi', + $name, + \nre\core\Linker::createLinkParam($name), + $charactertypeId + ); + } + + + /** + * Delete a Charactertype. + * + * @param int $charactertypeId ID of Charactertype to delete + */ + public function deleteCharactertype($charactertypeId) + { + $this->db->query('DELETE FROM charactertypes WHERE id = ?', 'i', $charactertypeId); + } + } ?> diff --git a/views/html/characters/register.tpl b/views/html/characters/register.tpl index af8148a9..1e123a50 100644 --- a/views/html/characters/register.tpl +++ b/views/html/characters/register.tpl @@ -53,7 +53,9 @@
  • checked="checked" />
  • diff --git a/views/html/charactertypes/manage.tpl b/views/html/charactertypes/manage.tpl new file mode 100644 index 00000000..5653039c --- /dev/null +++ b/views/html/charactertypes/manage.tpl @@ -0,0 +1,92 @@ + +
    + +
    + + +

    + + + + +

    +
    +
      + &$name) : ?> +
    • + +
        + &$settings) : ?> +
      • +
          + $value) : ?> +
        • + +
        • + +
        +
      • + +
      + + /> + checked="checked" /> +
      +
    • + +
    + +
    + + + + +

    + +
      + &$settings) : ?> +
    • +
        + $value) : ?> +
      • + +
      • + +
      +
    • + +
    + +
    +
    +
    + +
    diff --git a/views/html/seminaries/index.tpl b/views/html/seminaries/index.tpl index 7064834d..d8c6375b 100644 --- a/views/html/seminaries/index.tpl +++ b/views/html/seminaries/index.tpl @@ -32,10 +32,16 @@

    format(new \DateTime($seminary['created'])))?>

    - + 0) : ?> + + 0) : ?> + +

    + + diff --git a/views/html/seminaries/seminary.tpl b/views/html/seminaries/seminary.tpl index 5b757e34..10240c77 100644 --- a/views/html/seminaries/seminary.tpl +++ b/views/html/seminaries/seminary.tpl @@ -5,11 +5,18 @@

    0) : ?> + + + +