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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 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) : ?> + + + +