mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-25 16:44:28 +00:00
Add dedicated room req class, add tabulator backend sortings and other stuff
This commit is contained in:
@@ -34,8 +34,6 @@ class RoomManager extends Auth_Controller
|
||||
);
|
||||
|
||||
$this->_setAuthUID();
|
||||
|
||||
$this->setControllerId();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -44,6 +44,7 @@ class Ort extends FHCAPI_Controller
|
||||
]);
|
||||
|
||||
$this->load->library('form_validation');
|
||||
$this->load->library('requests/RoomRequest');
|
||||
|
||||
$this->load->model('ressource/Ort_model', 'OrtModel');
|
||||
$this->load->model('ressource/Reservierung_model', 'ReservierungModel');
|
||||
@@ -53,8 +54,12 @@ class Ort extends FHCAPI_Controller
|
||||
$this->loadPhrases([
|
||||
'global',
|
||||
'ui',
|
||||
'lehre'
|
||||
'lehre',
|
||||
'gruppenmanagement',
|
||||
'person',
|
||||
]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
@@ -73,8 +78,8 @@ class Ort extends FHCAPI_Controller
|
||||
$query = "SELECT
|
||||
COUNT(*) OVER() AS full_count,
|
||||
public.tbl_ort.*,
|
||||
pr.ort_kurzbz as pr_ort_kurzbz,
|
||||
org.bezeichnung as org_bezeichnung
|
||||
org.bezeichnung as org_bezeichnung,
|
||||
org.organisationseinheittyp_kurzbz as org_organisationseinheittyp_kurzbz
|
||||
FROM public.tbl_ort
|
||||
LEFT JOIN public.tbl_ort as pr ON pr.ort_kurzbz = public.tbl_ort.parent_ort_kurzbz
|
||||
LEFT JOIN public.tbl_organisationseinheit as org ON org.oe_kurzbz = public.tbl_ort.oe_kurzbz";
|
||||
@@ -87,6 +92,16 @@ class Ort extends FHCAPI_Controller
|
||||
$searchableBooleanAttributes = ['lehre', 'reservieren', 'aktiv'];
|
||||
$searchableNumericAttributes = ['max_person', 'arbeitsplaetze', 'kosten', 'stockwerk'];
|
||||
$searchableNumericSpanAttributes = ['m2'];
|
||||
$searchableCustomAttributes = [
|
||||
[
|
||||
'raw_sql_fragment' => "CONCAT(public.tbl_ort.ort_kurzbz, ' - ', public.tbl_ort.bezeichnung)",
|
||||
'filter_parameter' => 'ort_kurzbz_bezeichnung_concat',
|
||||
],
|
||||
[
|
||||
'raw_sql_fragment' => "CONCAT('[', org.organisationseinheittyp_kurzbz, '] ', org.bezeichnung)",
|
||||
'filter_parameter' => 'org_organisationseinheittyp_kurzbz_org_bezeichnung_concat',
|
||||
]
|
||||
];
|
||||
|
||||
foreach ($searchableIdAttributes as $attribute) {
|
||||
if (isset($filter[$attribute]) && $filter[$attribute] !== '') {
|
||||
@@ -128,11 +143,45 @@ class Ort extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($searchableCustomAttributes as $customAttribute) {
|
||||
if (isset($filter[$customAttribute['filter_parameter']]) && $filter[$customAttribute['filter_parameter']] !== '') {
|
||||
$queryWhereFragments[] = $customAttribute['raw_sql_fragment'] . " ILIKE ?";
|
||||
$filterData[] = '%' . trim($filter[$customAttribute['filter_parameter']]) . '%';
|
||||
}
|
||||
}
|
||||
|
||||
if (count($queryWhereFragments) > 0) {
|
||||
$query .= ' WHERE ' . implode(' AND ', $queryWhereFragments);
|
||||
}
|
||||
|
||||
$query .= ' ORDER BY public.tbl_ort.ort_kurzbz ASC';
|
||||
$sortableAttributes = ['ort_kurzbz', 'bezeichnung', 'planbezeichnung', 'max_person', 'arbeitsplaetze', 'm2', 'lehre', 'reservieren', 'aktiv', 'stockwerk', 'kosten', 'parent_ort_kurzbz', 'org_bezeichnung'];
|
||||
$sortableConcatAttributes = [
|
||||
[
|
||||
'raw_sql_fragment' => "CONCAT('[', org.organisationseinheittyp_kurzbz, '] ', org.bezeichnung)",
|
||||
'sort_parameter' => 'org_organisationseinheittyp_kurzbz_org_bezeichnung_concat',
|
||||
]
|
||||
];
|
||||
$sorter = $this->input->get('sort', TRUE);
|
||||
|
||||
foreach ($sortableAttributes as $attribute) {
|
||||
if (isset($sorter[$attribute]) && in_array(strtolower($sorter[$attribute]), ['asc', 'desc'])) {
|
||||
if ($attribute === 'org_bezeichnung') {
|
||||
$query .= " ORDER BY org.bezeichnung " . strtoupper($sorter[$attribute]);
|
||||
} else {
|
||||
$query .= " ORDER BY public.tbl_ort.$attribute " . strtoupper($sorter[$attribute]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($sortableConcatAttributes as $customAttribute) {
|
||||
if (isset($sorter[$customAttribute['sort_parameter']]) && in_array(strtolower($sorter[$customAttribute['sort_parameter']]), ['asc', 'desc'])) {
|
||||
$query .= " ORDER BY " . $customAttribute['raw_sql_fragment'] . " " . strtoupper($sorter[$customAttribute['sort_parameter']]);
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($sorter)) {
|
||||
$query .= ' ORDER BY public.tbl_ort.ort_kurzbz ASC';
|
||||
}
|
||||
|
||||
if ($paginationSize && $paginationPage) {
|
||||
$query .= " LIMIT ? OFFSET ?";
|
||||
@@ -298,49 +347,10 @@ class Ort extends FHCAPI_Controller
|
||||
|
||||
public function createRoom()
|
||||
{
|
||||
$this->form_validation->set_rules('ort_kurzbz', 'kurzbezeichnung', 'required|is_unique[tbl_ort.ort_kurzbz]', [
|
||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'kurzbz')]),
|
||||
'is_unique' => $this->p->t('ui', 'error_fieldUnique', ['field' => $this->p->t('lehre', 'kurzbz')])
|
||||
]);
|
||||
$this->form_validation->set_rules('content_id', 'content_id', 'number', [
|
||||
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => $this->p->t('lehre', 'content_id')])
|
||||
]);
|
||||
if($this->form_validation->run() == FALSE) $this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
|
||||
$parent_ort_kurzbz = $this->input->post('parent_ort_kurzbz');
|
||||
if ($parent_ort_kurzbz) {
|
||||
$this->load->model('ressource/Ort_model', 'ParentRoomModel');
|
||||
$parentRoom = $this->ParentRoomModel->load($parent_ort_kurzbz);
|
||||
if (isError($parentRoom) || !hasData($parentRoom)) {
|
||||
$this->terminateWithError("Parent room with shortcode $parent_ort_kurzbz does not exist", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
$oe_kurzbz = $this->input->post('oe_kurzbz');
|
||||
if ($oe_kurzbz) {
|
||||
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
|
||||
$orgUnit = $this->OrganisationseinheitModel->load($oe_kurzbz);
|
||||
if (isError($orgUnit) || !hasData($orgUnit)) {
|
||||
$this->terminateWithError("Organizational unit with shortcode $oe_kurzbz does not exist", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
$standort_id = $this->input->post('standort_id');
|
||||
if ($standort_id) {
|
||||
$this->load->model('organisation/Standort_model', 'StandortModel');
|
||||
$location = $this->StandortModel->load($standort_id);
|
||||
if (isError($location) || !hasData($location)) {
|
||||
$this->terminateWithError("Location with id $standort_id does not exist", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
$content_id = $this->input->post('content_id');
|
||||
if ($content_id) {
|
||||
$this->load->model('content/Content_model', 'ContentModel');
|
||||
$content = $this->ContentModel->load($content_id);
|
||||
if (isError($content) || !hasData($content)) {
|
||||
$this->terminateWithError("Content with id $content_id does not exist", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
if (!$this->roomrequest->validate()) {
|
||||
$this->terminateWithValidationErrors($this->roomrequest->errors());
|
||||
return;
|
||||
}
|
||||
|
||||
$this->db->trans_start();
|
||||
@@ -365,7 +375,7 @@ class Ort extends FHCAPI_Controller
|
||||
"telefonklappe" => $this->input->post('telefonklappe'),
|
||||
"m2" => $this->input->post('m2'),
|
||||
"gebteil" => $this->input->post('gebteil'),
|
||||
"arbeitsplaetze" => $this->input->post('arbeitsplatze'),
|
||||
"arbeitsplaetze" => $this->input->post('arbeitsplaetze'),
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => getAuthUid(),
|
||||
'updateamum' => date('c'),
|
||||
@@ -383,44 +393,9 @@ class Ort extends FHCAPI_Controller
|
||||
|
||||
public function updateRoom($ort_kurzbz)
|
||||
{
|
||||
if (!$ort_kurzbz) {
|
||||
$this->terminateWithError("missing ort_kurzbz parameter", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
|
||||
$parent_ort_kurzbz = $this->input->post('parent_ort_kurzbz');
|
||||
if ($parent_ort_kurzbz) {
|
||||
$this->load->model('ressource/Ort_model', 'ParentRoomModel');
|
||||
$parentRoom = $this->ParentRoomModel->load($parent_ort_kurzbz);
|
||||
if (isError($parentRoom) || !hasData($parentRoom)) {
|
||||
$this->terminateWithError("Parent room with shortcode $parent_ort_kurzbz does not exist", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
$oe_kurzbz = $this->input->post('oe_kurzbz');
|
||||
if ($oe_kurzbz) {
|
||||
$this->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
|
||||
$orgUnit = $this->OrganisationseinheitModel->load($oe_kurzbz);
|
||||
if (isError($orgUnit) || !hasData($orgUnit)) {
|
||||
$this->terminateWithError("Organizational unit with shortcode $oe_kurzbz does not exist", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
$standort_id = $this->input->post('standort_id');
|
||||
if ($standort_id) {
|
||||
$this->load->model('organisation/Standort_model', 'StandortModel');
|
||||
$location = $this->StandortModel->load($standort_id);
|
||||
if (isError($location) || !hasData($location)) {
|
||||
$this->terminateWithError("Location with id $standort_id does not exist", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
}
|
||||
|
||||
$content_id = $this->input->post('content_id');
|
||||
if ($content_id) {
|
||||
$this->load->model('content/Content_model', 'ContentModel');
|
||||
$content = $this->ContentModel->load($content_id);
|
||||
if (isError($content) || !hasData($content)) {
|
||||
$this->terminateWithError("Content with id $content_id does not exist", self::ERROR_TYPE_GENERAL);
|
||||
}
|
||||
if (!$this->roomrequest->validate("update")) {
|
||||
$this->terminateWithValidationErrors($this->roomrequest->errors());
|
||||
return;
|
||||
}
|
||||
|
||||
$this->db->trans_start();
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* FH-Complete
|
||||
*
|
||||
* @package FHC-Helper
|
||||
* @author FHC-Team
|
||||
* @copyright Copyright (c) 2022 fhcomplete.net
|
||||
* @license GPLv3
|
||||
*/
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class CustomFormValidationLib extends CI_Form_validation
|
||||
{
|
||||
public function __construct($rules = array())
|
||||
{
|
||||
parent::__construct($rules);
|
||||
|
||||
$this->_ci =& get_instance();
|
||||
}
|
||||
|
||||
function explicit_integer($value)
|
||||
{
|
||||
if ($value === null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($value === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (filter_var($value, FILTER_VALIDATE_INT) !== false) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function explicit_numeric($value)
|
||||
{
|
||||
if ($value === null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($value === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (is_numeric($value)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function explicit_boolean($value)
|
||||
{
|
||||
if ($value === null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($value === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($value === 'true' || $value === 'false' || $value === true || $value === false || $value === 1 || $value === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function does_exist($value, $params)
|
||||
{
|
||||
if ($value === null ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($value === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$parts = explode('.', $params);
|
||||
if (count($parts) !== 3) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$subDatabase = $parts[0];
|
||||
$table = $parts[1];
|
||||
$field = $parts[2];
|
||||
|
||||
$result = $this->_ci->db->select('COUNT(*) as count')
|
||||
->from("$subDatabase.$table")
|
||||
->where($field, $value)
|
||||
->get();
|
||||
|
||||
if ($result === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $result->row()->count > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class RoomRequest
|
||||
{
|
||||
protected $_ci;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->_ci =& get_instance();
|
||||
$this->_ci->load->library('CustomFormValidationLib');
|
||||
}
|
||||
|
||||
public function validate($method = 'create')
|
||||
{
|
||||
if ($method === 'create') {
|
||||
$this->_ci->customformvalidationlib->set_rules('ort_kurzbz', 'kurzbezeichnung', 'required|is_unique[tbl_ort.ort_kurzbz]|max_length[16]|regex_match[/^[a-zA-Z0-9_.]+$/]', [
|
||||
'required' => $this->_ci->p->t('ui', 'error_fieldRequired', ['field' => $this->_ci->p->t('gruppenmanagement', 'kurzbezeichnung')]),
|
||||
'is_unique' => $this->_ci->p->t('ui', 'error_fieldUnique', ['field' => $this->_ci->p->t('gruppenmanagement', 'kurzbezeichnung')]),
|
||||
'max_length' => $this->_ci->p->t('ui', 'error_fieldMaxLength', ['field' => $this->_ci->p->t('gruppenmanagement', 'kurzbezeichnung'), 'max' => 16]),
|
||||
'regex_match' => $this->_ci->p->t('ui', 'error_fieldInvalidFormat', ['field' => $this->_ci->p->t('gruppenmanagement', 'kurzbezeichnung')])
|
||||
]);
|
||||
}
|
||||
|
||||
$this->_ci->customformvalidationlib->set_rules('parent_ort_kurzbz', 'parent_ort_kurzbz', 'does_exist[public.tbl_ort.ort_kurzbz]|max_length[16]', [
|
||||
'does_exist' => $this->_ci->p->t('ui', 'error_entryDoesExists', ['entry' => $this->_ci->p->t('ui', 'parentRoom')]),
|
||||
'max_length' => $this->_ci->p->t('ui', 'error_fieldMaxLength', ['field' => $this->_ci->p->t('ui', 'parentRoom'), 'max' => 16])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('oe_kurzbz', 'oe_kurzbz', 'does_exist[public.tbl_organisationseinheit.oe_kurzbz]|max_length[32]', [
|
||||
'does_exist' => $this->_ci->p->t('ui', 'error_entryDoesExists', ['entry' => $this->_ci->p->t('lehre', 'organisationseinheit')]),
|
||||
'max_length' => $this->_ci->p->t('ui', 'error_fieldMaxLength', ['field' => $this->_ci->p->t('lehre', 'organisationseinheit'), 'max' => 32])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('standort_id', 'standort_id', 'explicit_integer|does_exist[public.tbl_standort.standort_id]', [
|
||||
'does_exist' => $this->_ci->p->t('ui', 'error_entryDoesExists', ['entry' => $this->_ci->p->t('person', 'standort')]),
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('content_id', 'content_id', 'explicit_integer|does_exist[campus.tbl_content.content_id]', [
|
||||
'explicit_integer' => $this->_ci->p->t('ui', 'error_fieldInteger', ['field' => $this->_ci->p->t('ui', 'contentId')]),
|
||||
'does_exist' => $this->_ci->p->t('ui', 'error_entryDoesExists', ['entry' => $this->_ci->p->t('ui', 'contentId')])
|
||||
]);
|
||||
|
||||
$this->_ci->customformvalidationlib->set_rules('lehre', 'lehre', 'explicit_boolean', [
|
||||
'explicit_boolean' => $this->_ci->p->t('ui', 'error_fieldBoolean', ['field' => $this->_ci->p->t('ui', 'lehre')])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('reservieren', 'reservieren', 'explicit_boolean', [
|
||||
'explicit_boolean' => $this->_ci->p->t('ui', 'error_fieldBoolean', ['field' => $this->_ci->p->t('ui', 'reservieren')])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('aktiv', 'aktiv', 'explicit_boolean', [
|
||||
'explicit_boolean' => $this->_ci->p->t('ui', 'error_fieldBoolean', ['field' => $this->_ci->p->t('person', 'aktiv')])
|
||||
]);
|
||||
|
||||
$this->_ci->customformvalidationlib->set_rules('bezeichnung', 'bezeichnung', 'max_length[64]', [
|
||||
'max_length' => $this->_ci->p->t('ui', 'error_fieldMaxLength', ['field' => $this->_ci->p->t('ui', 'bezeichnung'), 'max' => 64])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('planbezeichnung', 'planbezeichnung', 'max_length[8]', [
|
||||
'max_length' => $this->_ci->p->t('ui', 'error_fieldMaxLength', ['field' => $this->_ci->p->t('ui', 'planbezeichnung'), 'max' => 8])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('max_person', 'maxPerson', 'explicit_integer', [
|
||||
'explicit_integer' => $this->_ci->p->t('ui', 'error_fieldInteger', ['field' => $this->_ci->p->t('ui', 'maxPersons')])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('stockwerk', 'stockwerk', 'explicit_integer', [
|
||||
'explicit_integer' => $this->_ci->p->t('ui', 'error_fieldInteger', ['field' => $this->_ci->p->t('ui', 'stockwerk')])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('m2', 'm2', 'explicit_numeric', [
|
||||
'explicit_numeric' => $this->_ci->p->t('ui', 'error_fieldNumeric', ['field' => $this->_ci->p->t('ui', 'quadratmeter')])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('dislozierung', 'dislozierung', 'explicit_numeric', [
|
||||
'explicit_numeric' => $this->_ci->p->t('ui', 'error_fieldNumeric', ['field' => $this->_ci->p->t('ui', 'dislozierung')])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('kosten', 'kosten', 'explicit_numeric', [
|
||||
'explicit_numeric' => $this->_ci->p->t('ui', 'error_fieldNumeric', ['field' => $this->_ci->p->t('ui', 'kosten')])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('telefonklappe', 'telefonklappe', 'max_length[8]', [
|
||||
'max_length' => $this->_ci->p->t('ui', 'error_fieldMaxLength', ['field' => $this->_ci->p->t('person', 'telefonklappe'), 'max' => 8])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('gebteil', 'gebteil', 'max_length[32]', [
|
||||
'max_length' => $this->_ci->p->t('ui', 'error_fieldMaxLength', ['field' => $this->_ci->p->t('ui', 'gebaudeteil'), 'max' => 32])
|
||||
]);
|
||||
$this->_ci->customformvalidationlib->set_rules('arbeitsplaetze', 'arbeitsplaetze', 'explicit_integer', [
|
||||
'explicit_integer' => $this->_ci->p->t('ui', 'error_fieldInteger', ['field' => $this->_ci->p->t('ui', 'arbeitsplaetze')])
|
||||
]);
|
||||
|
||||
return $this->_ci->customformvalidationlib->run();
|
||||
}
|
||||
|
||||
public function errors()
|
||||
{
|
||||
return $this->_ci->customformvalidationlib->error_array();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user