[ './classes/Modules/Label/www/js/jquery.labels.js', './classes/Modules/Label/www/js/datatablelabel-manager.js', ], 'body' => [ './classes/Modules/Label/www/js/datatablelabel-module.js', ], ]; /** @var array $stylesheet */ public $stylesheet = [ './classes/Modules/Label/www/css/labels.css', './classes/Modules/Label/www/css/datatablelabel.css', ]; /** * @param erpooSystem $app * @param bool $intern */ public function __construct($app, $intern = false) { $this->app = $app; if($intern){ return; } $this->app->ActionHandlerInit($this); $this->app->ActionHandler('list', 'DataTableLabelsList'); $this->app->ActionHandler('edit', 'DataTableLabelsEdit'); $this->app->ActionHandler('automaticlabels', 'DataTableLabelsAutomaticLabelsList'); $this->app->ActionHandler('automaticlabelsedit', 'DataTableLabelsAutomaticLabelsEdit'); $this->app->ActionHandlerListen($app); } /** * @param erpooSystem $app * @param string $name * @param array $allowed * * @return array|false */ public static function TableSearch(&$app, $name, $allowed) { switch ($name) { case 'datatablelabels_list': $heading = array('Bezeichnung', 'Kennung', 'Gruppe', 'Farbe', 'Menü'); $width = array('50%', '15%', '15%', '15%', '5%'); $findcols = array('t.title', 't.type', 'g.group_table', 't.id'); $searchsql = array('t.title', 't.type', 'g.group_table'); $aligncenter = [4]; $defaultorder = 3; $defaultorderdesc = 0; $menu = ''; $menu .= ''; $menu .= ''; $menu .= ''; $menu .= '
'; $menu .= ''; $menu .= "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">"; $menu .= ' '; $menu .= ''; $menu .= "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">"; $menu .= ''; $menu .= '
'; $where = ' t.id > 0'; $sql = "SELECT SQL_CALC_FOUND_ROWS t.id, t.title, t.type, g.group_table, ". "CONCAT('') AS color, ". "t.id ". "FROM label_type AS t ". "LEFT JOIN label_group AS g ON t.label_group_id = g.id"; $count = "SELECT COUNT(t.id) FROM label_type AS t ". "LEFT JOIN label_group AS g ON t.label_group_id = g.id ". "WHERE {$where}"; break; case 'datatablelabels_automaticlabelslist': $heading = array('Label', 'Aktion', 'Auswahl', 'Projekt', 'Menü'); $width = array('15%', '20%', '20%', '15%', '1%'); $findcols = array('t.type', 'al.action', 'al.selection', 'p.abkuerzung', 'al.id'); $searchsql = array('t.type', 'al.action', 'al.selection', 'p.abkuerzung'); $defaultorder = 1; $defaultorderdesc = 0; $menu = ''; $menu .= ''; $menu .= ''; $menu .= ''; $menu .= '
'; $menu .= ''; $menu .= "Conf->WFconf['defaulttheme']}/images/edit.svg\" border=\"0\">"; $menu .= ' '; $menu .= ''; $menu .= "Conf->WFconf['defaulttheme']}/images/delete.svg\" border=\"0\">"; $menu .= ''; $menu .= '
'; $where = ' al.id > 0'; $sql = "SELECT SQL_CALC_FOUND_ROWS al.id, t.type, CONCAT(UCASE(LEFT(al.action, 1)), SUBSTRING(al.action, 2)), CONCAT(UCASE(LEFT(al.selection, 1)), SUBSTRING(al.selection, 2)), p.abkuerzung, al.id FROM label_automatic AS al LEFT JOIN label_type AS t ON al.label_type_id = t.id LEFT JOIN projekt AS p ON al.project_id = p.id"; break; default: return false; break; } $result = [ 'heading' => $heading, 'width' => $width, 'findcols' => $findcols, 'searchsql' => $searchsql, 'aligncenter' => $aligncenter, 'defaultorder' => $defaultorder, 'defaultorderdesc' => $defaultorderdesc, 'menu' => $menu, 'where' => $where, 'sql' => $sql, 'count' => $count, 'maxrows' => 50, ]; $allowedKeys = array_flip((array)$allowed); $result = array_intersect_key($result, $allowedKeys); return $result; } /** * @return void */ public function Install() { $this->app->erp->CheckTable('label_type'); $this->app->erp->CheckColumn('id', 'INT(11) UNSIGNED', 'label_type', 'NOT NULL AUTO_INCREMENT'); $this->app->erp->CheckColumn('label_group_id', 'INT(11) UNSIGNED', 'label_type', 'NOT NULL DEFAULT 0'); $this->app->erp->CheckColumn('type', 'VARCHAR(24)', 'label_type', 'NOT NULL'); $this->app->erp->CheckColumn('title', 'VARCHAR(64)', 'label_type', 'NOT NULL'); $this->app->erp->CheckColumn('hexcolor', 'VARCHAR(7)', 'label_type', 'NOT NULL DEFAULT \'#FFFFFF\''); $this->app->erp->CheckColumn('created_at', 'TIMESTAMP', 'label_type', 'NOT NULL DEFAULT CURRENT_TIMESTAMP'); $this->app->erp->CheckColumn('updated_at', 'TIMESTAMP', 'label_type', 'NOT NULL DEFAULT \'0000-00-00 00:00:00\''); $this->app->erp->CheckIndex('label_type', 'type', true); $this->app->erp->CheckTable('label_reference'); $this->app->erp->CheckColumn('id', 'INT(11) UNSIGNED', 'label_reference', 'NOT NULL AUTO_INCREMENT'); $this->app->erp->CheckColumn('label_type_id', 'INT(11) UNSIGNED', 'label_reference', 'NOT NULL'); $this->app->erp->CheckColumn('reference_table', 'VARCHAR(64)', 'label_reference', 'NOT NULL'); $this->app->erp->CheckColumn('reference_id', 'INT(11) UNSIGNED', 'label_reference', 'NOT NULL'); $this->app->erp->CheckColumn('created_at', 'TIMESTAMP', 'label_reference', 'NOT NULL DEFAULT CURRENT_TIMESTAMP'); $this->app->erp->CheckAlterTable('ALTER TABLE `label_reference` ADD UNIQUE (`label_type_id`, `reference_table`, `reference_id`)'); $this->app->erp->CheckTable('label_group'); $this->app->erp->CheckColumn('id', 'INT(11) UNSIGNED', 'label_group', 'NOT NULL AUTO_INCREMENT'); $this->app->erp->CheckColumn('group_table', 'VARCHAR(64)', 'label_group', 'NOT NULL'); $this->app->erp->CheckColumn('title', 'VARCHAR(64)', 'label_group', 'NOT NULL'); $this->app->erp->CheckColumn('created_at', 'TIMESTAMP', 'label_group', 'NOT NULL DEFAULT CURRENT_TIMESTAMP'); $this->app->erp->CheckIndex('label_group', 'group_table', true); if ($this->app->DB->CheckTableExistence("automatic_label")){ $this->app->DB->Query("RENAME TABLE `automatic_label` TO `label_automatic`"); } $this->app->erp->CheckTable('label_automatic'); $this->app->erp->CheckColumn('id', 'INT(11)', 'label_automatic', 'NOT NULL AUTO_INCREMENT'); $this->app->erp->CheckColumn('label_type_id', 'INT(11)', 'label_automatic', 'NOT NULL DEFAULT 0'); $this->app->erp->CheckColumn('project_id', 'INT(11)', 'label_automatic', 'NOT NULL DEFAULT 0'); $this->app->erp->CheckColumn('action', 'VARCHAR(64)', 'label_automatic', 'NOT NULL'); $this->app->erp->CheckColumn('selection', 'VARCHAR(64)', 'label_automatic', 'NOT NULL'); $this->app->erp->RegisterHook('eproosystem_ende', 'Datatablelabels', 'DataTableLabelsInclude'); $this->app->erp->RegisterHook('dokumentsend_ende', 'Datatablelabels', 'DataTableLabelsDokumentSendHook'); $this->app->erp->RegisterHook('parseuservars', 'Datatablelabels', 'DatatablelabelsParseUserVars'); $this->app->erp->RegisterHook('auftrag_versand_ende', 'Datatablelabels', 'DatatablelabelsOrderSent'); $this->app->erp->RegisterHook('transfer_document_incoming', 'Datatablelabels', 'DatatablelabelsTransferDocumentIncomming'); $this->app->DB->Query("UPDATE label_reference AS lr SET lr.reference_table = 'lieferschein' WHERE lr.reference_table = 'lieferscheine'"); $this->app->DB->Query("UPDATE label_group AS lg SET lg.group_table = 'lieferschein', lg.title = 'Lieferschein' WHERE lg.group_table = 'lieferscheine'"); $this->app->DB->Query("UPDATE label_reference AS lr SET lr.reference_table = 'gutschrift' WHERE lr.reference_table = 'gutschriften'"); $this->app->DB->Query("UPDATE label_group AS lg SET lg.group_table = 'gutschrift', lg.title = 'Gutschrift' WHERE lg.group_table = 'gutschriften'"); } /** * @return void */ public function DataTableLabelsInclude() { $this->app->ModuleScriptCache->IncludeModule('Datatablelabels'); } /** * @param int $tranferId * @param string $doctype * @param int $doctypeId */ public function DatatablelabelsTransferDocumentIncomming($tranferId, $doctype, $doctypeId) { if(empty($doctypeId) || !in_array( $doctype, [ 'angebot' , 'auftrag' , 'bestellung', 'gutschrift', 'lieferschein', 'produktion', 'rechnung' ] ) ) { return; } $projectId = (int)$this->app->DB->Select(sprintf('SELECT `projekt` FROM `%s` WHERE `id` = %d',$doctype, $doctypeId)); // Passende Automatische Label suchen; IDs der LabelTypen werden zurückgegeben $labelTypeIds = $this->FindLabelTypesForAutomaticLabel('uebertragungen_eingang', $doctype, $projectId); // Labels erstellen foreach ($labelTypeIds as $labelTypeId) { $this->CreateDataTableLabel($labelTypeId, $doctype, $doctypeId); } } /** * @param string $documentType [angebot|auftrag|...] * @param string $documentId ID des Angebots, Auftrags oder ... * @param string $projektId * @param string $adresseId * * @return void */ public function DataTableLabelsDokumentSendHook($documentType, $documentId, $projectId, $addressId, $type) { if($type !== 'drucken' && $type !== 'brief' && $type !== 'fax'){ return; } $projectId = (int)$projectId; $documentId = (int)$documentId; // Passende Automatische Label suchen; IDs der LabelTypen werden zurückgegeben $labelTypeIds = $this->FindLabelTypesForAutomaticLabel('drucken', $documentType, $projectId); // Labels erstellen foreach ($labelTypeIds as $labelTypeId) { $this->CreateDataTableLabel($labelTypeId, $documentType, $documentId); } } /** * @param int|string $orderId */ public function DatatablelabelsOrderSent($orderId) { $orderId = (int)$orderId; if($orderId <= 0) { return; } $projectId = (int)$this->app->DB->Select(sprintf('SELECT `projekt` FROM `auftrag` WHERE `id` = %d', $orderId)); // Passende Automatische Label suchen; IDs der LabelTypen werden zurückgegeben $labelTypeIds = $this->FindLabelTypesForAutomaticLabel('autoversand', 'auftrag', $projectId); // Labels erstellen foreach ($labelTypeIds as $labelTypeId) { $this->CreateDataTableLabel($labelTypeId, 'auftrag', $orderId); } } /** * @param string $type Dokumenttyp * @param int $id Dokument-ID * @param string $text Textbaustein * * @return void */ public function DatatablelabelsParseUserVars($type, $id, &$text) { if (strpos($text, '{LABELS}') !== false) { /** @var \Xentral\Modules\Label\LabelGateway $gateway */ $gateway = $this->app->Container->get('LabelGateway'); $labels = (array)$gateway->findLabelsByReference($type, $id); if (!empty($labels)){ $labelTitles = array_column($labels, 'title'); $labelText = implode(', ', $labelTitles); } else { $labelText = ''; } $text = str_replace('{LABELS}', $labelText, $text); } } /** * @return void */ public function DataTableLabelsMenu() { $this->app->erp->MenuEintrag('index.php?module=datatablelabels&action=list', 'Zurück zur Übersicht'); $this->app->erp->MenuEintrag('index.php?module=datatablelabels&action=list', 'Label-Typen'); $this->app->erp->MenuEintrag('index.php?module=datatablelabels&action=automaticlabels', 'Automatische Labels'); $this->app->erp->MenuEintrag('DataTableLabelsUi.createItem()', 'Neuer Eintrag'); } /** * @return void */ public function DataTableLabelsList() { $this->DataTableLabelsMenu(); $this->app->YUI->ColorPicker('datatablelabel_hexcolor'); $this->app->YUI->TableSearch('TAB1', 'datatablelabels_list', 'show', '', '', basename(__FILE__), __CLASS__); // Label-Gruppen laden und HTML-Dropdown-Optionen generieren $labelGroups = $this->GetLabelGroups(); $labelGroupsOptions = ''; foreach ($labelGroups as $labelGroup) { $labelGroupsOptions .= sprintf( '', $labelGroup['id'], $labelGroup['title'], $labelGroup['group_table'] ); } $this->app->Tpl->Set('DATATABLE_GROUP_OPTIONS', $labelGroupsOptions); $this->app->erp->Headlines('Labels'); $this->app->Tpl->Parse('PAGE', 'datatablelabels_list.tpl'); } /** * @return void */ public function DataTableLabelsEdit() { $cmd = $this->app->Secure->GetGET('cmd'); switch ($cmd) { case 'get': $id = (int)$this->app->Secure->GetPOST('id'); $result = $this->AjaxGetLabelType($id); break; case 'save': $id = (int)$this->app->Secure->GetPOST('id'); $type = (string)$this->app->Secure->GetPOST('type'); $title = (string)$this->app->Secure->GetPOST('title', 'nohtml'); $groupId = (int)$this->app->Secure->GetPOST('group'); $hexColor = (string)$this->app->Secure->GetPOST('hexcolor'); $result = $this->AjaxSaveLabelType($id, $type, $title, $hexColor, $groupId); break; case 'delete': $id = (int)$this->app->Secure->GetPOST('id'); $result = $this->AjaxDeleteLabelType($id); break; default: $result = ['success' => false, 'error' => 'Invalid command']; break; } if(isset($result['success']) && $result['success'] === false){ header('HTTP/1.0 404 Not Found'); } header('Content-Type: application/json'); echo json_encode($result); $this->app->ExitXentral(); } /** * @return void */ public function DataTableLabelsAutomaticLabelsList() { $this->DataTableLabelsMenu(); $action = array( //'versand' => 'Versand von Beleg', 'drucken' => 'Drucken von Beleg', 'autoversand' => 'Autoversand', //'versandzentrum' => 'Versandzentrum' ); if($this->app->erp->ModulVorhanden('uebertragungen')) { $action['uebertragungen_eingang'] = 'API / Übertragungen Eingang'; } $selection = array( 'angebot' => 'Angebot', 'auftrag' => 'Auftrag', 'bestellung' => 'Bestellung', 'gutschrift' => 'Gutschrift', 'lieferschein' => 'Lieferschein', 'produktion' => 'Produktion', 'rechnung' => 'Rechnung' ); $actionString = ''; $selectionString = ''; foreach($action as $key=>$value){ $actionString .= ''; } foreach($selection as $key=>$value){ $selectionString .= ''; } $this->app->Tpl->Set('AUTOMATICLABELACTION', $actionString); $this->app->Tpl->Set('AUTOMATICLABELSELECTION', $selectionString); $this->app->YUI->AutoComplete('datatablelabel_automaticlabelname', 'label_type'); $this->app->YUI->AutoComplete('datatablelabel_automaticlabelproject', 'projektname', 1); $this->app->YUI->TableSearch('TAB1', 'datatablelabels_automaticlabelslist', 'show', '', '', basename(__FILE__), __CLASS__); $this->app->erp->Headlines('Labels'); $this->app->Tpl->Parse('PAGE', 'datatablelabels_automaticlabelslist.tpl'); } /** * @return void */ public function DataTableLabelsAutomaticLabelsEdit() { $cmd = $this->app->Secure->GetGET('cmd'); switch ($cmd) { case 'get': $id = (int)$this->app->Secure->GetPOST('id'); $result = $this->AjaxGetAutomaticLabel($id); break; case 'save': $id = (int)$this->app->Secure->GetPOST('id'); $labelName = (string)$this->app->Secure->GetPOST('labelname'); $action = (string)$this->app->Secure->GetPOST('action'); $selection = (string)$this->app->Secure->GetPOST('selection'); $project = (string)$this->app->Secure->GetPOST('project'); $result = $this->AjaxSaveAutomaticLabel($id, $labelName, $action, $selection, $project); break; case 'delete': $id = (int)$this->app->Secure->GetPOST('id'); $result = $this->AjaxDeleteAutomaticLabel($id); break; default: $result = ['success' => false, 'error' => 'Invalid command']; break; } if(isset($result['success']) && $result['success'] === false){ header('HTTP/1.0 404 Not Found'); } header('Content-Type: application/json'); echo json_encode($result); $this->app->ExitXentral(); } /** * @param string $action [versand|drucken|versandzentrum] * @param string $documentType [angebot|auftrag|...] * @param int|null $projectId * * @return array Empty array if no automatic label matches */ protected function FindLabelTypesForAutomaticLabel($action, $documentType, $projectId = null) { $labelArray = $this->app->DB->SelectArr(sprintf( "SELECT la.label_type_id FROM label_automatic AS la WHERE la.action = '%s' AND la.selection = '%s' AND (la.project_id = '%s' OR la.project_id = 0)", $this->app->DB->real_escape_string($action), $this->app->DB->real_escape_string($documentType), $this->app->DB->real_escape_string((int)$projectId) )); if ($labelArray === null) { return []; } $labelTypeIds = []; foreach ($labelArray as $labelRow) { $labelTypeIds[] = (int)$labelRow['label_type_id']; } return $labelTypeIds; } /** * @return array */ protected function GetLabelGroups() { $groupArray = $this->app->DB->SelectArr( "SELECT lg.id, lg.group_table, lg.title FROM label_group AS lg WHERE 1 ORDER BY lg.group_table" ); if ($groupArray === null) { return []; } return $groupArray; } /** * @param int $labelTypeId * @param string $referenceTable * @param int $referenceId * * @return int|null ID des angelegten Datenbank-Eintrags */ protected function CreateDataTableLabel($labelTypeId, $referenceTable, $referenceId) { $sql = sprintf( 'INSERT INTO label_reference (`id`, `label_type_id`, `reference_table`, `reference_id`, `created_at`) VALUES (NULL, \'%s\',\'%s\',\'%s\', CURRENT_TIMESTAMP)', $this->app->DB->real_escape_string((int)$labelTypeId), $this->app->DB->real_escape_string($referenceTable), $this->app->DB->real_escape_string((int)$referenceId) ); $this->app->DB->Insert($sql); $insertId = (int)$this->app->DB->GetInsertID(); if ($insertId === 0) { return null; } return $insertId; } /** * @param int $id * * @return array */ protected function AjaxGetLabelType($id) { $id = (int)$id; $data = $this->app->DB->SelectArr( "SELECT lt.id, lt.type, lt.title, lt.hexcolor, lt.label_group_id AS group_id FROM label_type AS lt LEFT JOIN label_group AS lg ON lt.label_group_id = lg.id WHERE lt.id = '{$id}' LIMIT 1" ); if(empty($data)){ return ['success' => false, 'error' => sprintf('Label ID%s wurde nicht gefunden.', $id)]; } $data = reset($data); return ['success' => true, 'data' => $data]; } /** * @param int $id * * @return array */ protected function AjaxDeleteLabelType($id) { $id = (int)$id; // Prüfen ob ID existiert $checkId = (int)$this->app->DB->Select("SELECT lt.id FROM label_type AS lt WHERE lt.id = '{$id}'"); if($checkId === 0 || $checkId !== $id){ return ['success' => false, 'error' => sprintf('Label-Typ kann nicht gelöscht werden. ID%s wurde nicht gefunden.', $id)]; } // Prüfen ob Label-Typ in Verwendung ist $checkRefCount = (int)$this->app->DB->Select( "SELECT COUNT(lr.id) AS num FROM label_reference AS lr WHERE lr.label_type_id = '{$id}'" ); if($checkRefCount <= 0){ $checkRefCount = (int)$this->app->DB->Select( "SELECT COUNT(al.id) AS num FROM label_automatic AS al WHERE al.label_type_id = '{$id}'" ); } if($checkRefCount > 0){ return ['success' => false, 'error' => 'Label-Typ kann nicht gelöscht werden. Es existieren noch Verknüpfungen.']; } $this->app->DB->Delete("DELETE FROM label_type WHERE id = '{$id}' LIMIT 1"); return ['success' => true]; } /** * @param int $id * @param string $type * @param string $title * @param string $hexColor * @param int $groupId * * @return array */ protected function AjaxSaveLabelType($id, $type, $title, $hexColor, $groupId = 0) { $id = (int)$id; $groupId = (int)$groupId; try { $result = ['success' => false, 'error' => 'Unbekannter Fehler']; if($id === 0){ // Neuen Eintrag anlegen $this->ValidateFormData($type, $title, $hexColor, $groupId, null); $this->app->DB->Insert( "INSERT INTO label_type (id, label_group_id, type, title, hexcolor, created_at) VALUES (NULL, '{$groupId}', '{$type}', '{$title}', '{$hexColor}', CURRENT_TIMESTAMP)" ); $result = ['success' => true]; } if($id > 0){ // Vorhandenen Eintrag bearbeiten $this->ValidateFormData($type, $title, $hexColor, $groupId, $id); $this->app->DB->Update( "UPDATE label_type SET label_group_id = '{$groupId}', type = '{$type}', title = '{$title}', hexcolor = '{$hexColor}', updated_at = CURRENT_TIMESTAMP WHERE id = '{$id}' LIMIT 1" ); $result = ['success' => true]; } } catch (RuntimeException $exception) { $result = ['success' => false, 'error' => $exception->getMessage()]; } return $result; } /** * @param int $id * * @return array */ protected function AjaxGetAutomaticLabel($id) { $id = (int)$id; $data = $this->app->DB->SelectArr( "SELECT al.id, t.type AS labelname, al.action, al.selection, p.abkuerzung AS project FROM label_automatic AS al LEFT JOIN label_type t ON al.label_type_id = t.id LEFT JOIN projekt AS p ON al.project_id = p.id WHERE al.id = '{$id}' LIMIT 1" ); if(empty($data)){ return ['success' => false, 'error' => sprintf('Label ID%s wurde nicht gefunden.', $id)]; } $data = reset($data); return ['success' => true, 'data' => $data]; } /** * @param int $id * * @return array */ protected function AjaxDeleteAutomaticLabel($id) { $id = (int)$id; // Prüfen ob ID existiert $checkId = (int)$this->app->DB->Select("SELECT al.id FROM label_automatic AS al WHERE al.id = '{$id}'"); if($checkId === 0 || $checkId !== $id){ return ['success' => false, 'error' => sprintf('Automatisches Label kann nicht gelöscht werden. ID%s wurde nicht gefunden.', $id)]; } $this->app->DB->Delete("DELETE FROM label_automatic WHERE id = '{$id}' LIMIT 1"); return ['success' => true]; } /** * @param int $id * @param string $labelName * @param string $action * @param string $selection * @param string $project * * @return array */ protected function AjaxSaveAutomaticLabel($id, $labelName, $action, $selection, $project) { $id = (int)$id; try { $result = ['success' => false, 'error' => 'Unbekannter Fehler']; if($id === 0){ // Neuen Eintrag anlegen if($project == ''){ $projectId = 0; }else{ $project = explode(' ', $project); $project = $project[0]; $projectId = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '{$project}' LIMIT 1"); } $typeId = $this->app->DB->Select("SELECT id FROM label_type WHERE type = '$labelName' LIMIT 1"); $this->ValidateFormDataAutomaticLabel($typeId, $action, $selection, $projectId, null); $this->app->DB->Insert( "INSERT INTO label_automatic (id, label_type_id, action, selection, project_id) VALUES (NULL, '{$typeId}', '{$action}', '{$selection}', '{$projectId}')" ); $result = ['success' => true]; } if($id > 0){ // Vorhandenen Eintrag bearbeiten if($project == ''){ $projectId = 0; }else{ $project = explode(' ', $project); $project = $project[0]; $projectId = $this->app->DB->Select("SELECT id FROM projekt WHERE abkuerzung = '{$project}' LIMIT 1"); } $typeId = $this->app->DB->Select("SELECT id FROM label_type WHERE type = '$labelName' LIMIT 1"); $this->ValidateFormDataAutomaticLabel($typeId, $action, $selection, $projectId, $id); $this->app->DB->Update( "UPDATE label_automatic SET label_type_id = '{$typeId}', action = '{$action}', selection = '{$selection}', project_id = '{$projectId}' WHERE id = '{$id}' LIMIT 1" ); $result = ['success' => true]; } } catch (RuntimeException $exception) { $result = ['success' => false, 'error' => $exception->getMessage()]; } return $result; } /** * @param string $type * @param string $title * @param string $hexColor * @param int $groupId * @param int|null $id * * @return void * @throws RuntimeException * */ protected function ValidateFormData($type, $title, $hexColor, $groupId, $id = null) { if($id !== null){ $id = (int)$id; $check = (int)$this->app->DB->Select("SELECT lt.id FROM label_type AS lt WHERE lt.id = '{$id}'"); if($check === 0 || $check !== $id){ throw new RuntimeException(sprintf('Label-Typ ID%s wurde nicht gefunden.', $id)); } } $groupId = (int)$groupId; if($groupId !== 0){ $checkGroup = (int)$this->app->DB->Select("SELECT lg.id FROM label_group AS lg WHERE lg.id = '{$groupId}'"); if($checkGroup === 0 || $checkGroup !== $groupId){ throw new RuntimeException(sprintf('Label-Gruppe ID%s wurde nicht gefunden.', $groupId)); } } if(empty(trim($title))){ throw new RuntimeException('Die Bezeichung darf nicht leer sein.'); } $typeFiltered = preg_replace('/[^a-z0-9]+/', '', $type); if(empty(trim($type))){ throw new RuntimeException('Die Kennung darf nicht leer sein.'); } if($type !== $typeFiltered){ throw new RuntimeException('Die Kennung enthält ungültige Zeichen. Es sind nur Kleinbuchstaben und Zahlen erlaubt.'); } $hexcolorFiltered = preg_replace('/[^\#]{1}[^a-fA-F0-9]+/', '', $hexColor); if(empty(trim($hexColor))){ throw new RuntimeException('Die Farbe darf nicht leer sein.'); } if($hexColor !== $hexcolorFiltered){ throw new RuntimeException('Die Farbe enthält ungültige Zeichen: ' . htmlspecialchars($hexColor)); } } /** * @param int $typeId * @param string $action * @param string $selection * @param int $projectId * @param int|null $id * * @return void * @throws RuntimeException * */ protected function ValidateFormDataAutomaticLabel($typeId, $action, $selection, $projectId, $id = null) { if($id !== null){ $id = (int)$id; $check = (int)$this->app->DB->Select("SELECT al.id FROM label_automatic AS al WHERE al.id = '{$id}'"); if($check === 0 || $check !== $id){ throw new RuntimeException(sprintf('Label ID%s wurde nicht gefunden.', $id)); } } if(empty(trim($typeId)) || $typeId == 0){ throw new RuntimeException('Bitte Label auswählen.'); } if(empty(trim($action))){ throw new RuntimeException('Die Aktion darf nicht leer sein.'); } if(empty(trim($action))){ throw new RuntimeException('Die Auswahl darf nicht leer sein.'); } } }