feat(einricht): Einrichtungen miteinander verknüpfen
Neue Tabelle organigramm_einricht_link für n:m-Beziehungen zwischen Einrichtungen. In der Bearbeitungskarte gibt es jetzt ein Mehrfachauswahlfeld (Semantic UI Dropdown) um verwandte Einrichtungen zu verknüpfen (z.B. alle HzE-Einrichtungen unter der Gruppe HzE). - Neue Funktion saveLinkedEinrichts() speichert die Verknüpfungen - Cardform lädt bestehende Links als Vorauswahl (Strings, kein int-Cast damit Semantic UI den data-value-Vergleich korrekt auflöst) - onChange-Handler + explizite hidden-input-Befüllung sichern zuverlässige Übergabe beim Formular-Submit Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -99,7 +99,8 @@ function save_facility() {
|
|||||||
$messages[] = '<div class="successbox">' . $translation->get("role_msg_success2") . '</div>';
|
$messages[] = '<div class="successbox">' . $translation->get("role_msg_success2") . '</div>';
|
||||||
}
|
}
|
||||||
saveMandantLink($input_id);
|
saveMandantLink($input_id);
|
||||||
edit_role($input_id, $messages);
|
saveLinkedEinrichts($input_id);
|
||||||
|
edit_facility($input_id, $messages);
|
||||||
} else {
|
} else {
|
||||||
header('EDIT_ERROR: 1');
|
header('EDIT_ERROR: 1');
|
||||||
// $input_role["id"] = $_POST["input_id"];
|
// $input_role["id"] = $_POST["input_id"];
|
||||||
@@ -110,6 +111,28 @@ function save_facility() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function saveLinkedEinrichts($einricht_id) {
|
||||||
|
$einricht_id = (int)$einricht_id;
|
||||||
|
if ($einricht_id <= 0) return;
|
||||||
|
|
||||||
|
// Alle alten Verknüpfungen löschen
|
||||||
|
mysqli_query($GLOBALS['mysql_con'],
|
||||||
|
"DELETE FROM organigramm_einricht_link WHERE einricht_id = $einricht_id");
|
||||||
|
|
||||||
|
// Neue Verknüpfungen speichern
|
||||||
|
$raw = trim($_POST['linked_einrichts'] ?? '');
|
||||||
|
if ($raw === '') return;
|
||||||
|
|
||||||
|
foreach (explode(',', $raw) as $linkedId) {
|
||||||
|
$linkedId = (int)trim($linkedId);
|
||||||
|
if ($linkedId > 0 && $linkedId !== $einricht_id) {
|
||||||
|
mysqli_query($GLOBALS['mysql_con'],
|
||||||
|
"INSERT IGNORE INTO organigramm_einricht_link (einricht_id, linked_einricht_id)
|
||||||
|
VALUES ($einricht_id, $linkedId)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function saveMandantLink($role_id){
|
function saveMandantLink($role_id){
|
||||||
$mandant_id = $_POST['select_mandant'];
|
$mandant_id = $_POST['select_mandant'];
|
||||||
$mandante = explode(',', $mandant_id);
|
$mandante = explode(',', $mandant_id);
|
||||||
|
|||||||
@@ -2,6 +2,28 @@
|
|||||||
$formname = "form_facility_card";
|
$formname = "form_facility_card";
|
||||||
$translation = \DynCom\mysyde\common\classes\Registry::get("translation");
|
$translation = \DynCom\mysyde\common\classes\Registry::get("translation");
|
||||||
$inputname = "input_id";
|
$inputname = "input_id";
|
||||||
|
|
||||||
|
$currentId = (int)($input_role["id"] ?? 0);
|
||||||
|
|
||||||
|
// Alle Einrichtungen außer der aktuellen laden
|
||||||
|
$allEinrichts = [];
|
||||||
|
$qAll = mysqli_query($GLOBALS['mysql_con'],
|
||||||
|
"SELECT id, description FROM organigramm_einricht ORDER BY description ASC");
|
||||||
|
while ($row = mysqli_fetch_assoc($qAll)) {
|
||||||
|
if ((int)$row['id'] !== $currentId) {
|
||||||
|
$allEinrichts[] = $row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bereits verknüpfte Einrichtungen laden
|
||||||
|
$preselect = [];
|
||||||
|
if ($currentId > 0) {
|
||||||
|
$qLinked = mysqli_query($GLOBALS['mysql_con'],
|
||||||
|
"SELECT linked_einricht_id FROM organigramm_einricht_link WHERE einricht_id = $currentId");
|
||||||
|
while ($row = mysqli_fetch_assoc($qLinked)) {
|
||||||
|
$preselect[] = $row['linked_einricht_id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div id="overlaycrumb">
|
<div id="overlaycrumb">
|
||||||
@@ -9,33 +31,26 @@ $inputname = "input_id";
|
|||||||
echo $translation->get("new_facility");
|
echo $translation->get("new_facility");
|
||||||
} else {
|
} else {
|
||||||
echo $translation->get("edit_facility");
|
echo $translation->get("edit_facility");
|
||||||
}
|
} ?>
|
||||||
?>
|
|
||||||
<div id="closeoverlay" onclick="disableOverlay();"></div>
|
<div id="closeoverlay" onclick="disableOverlay();"></div>
|
||||||
</div>
|
</div>
|
||||||
<ul class="toolbar_menu">
|
|
||||||
|
<ul class="toolbar_menu">
|
||||||
|
<?= button("save", $translation->get("save"), $formname, "loadCard('save', true)"); ?>
|
||||||
<?= button("save", $translation->get("save_and_close"), $formname, "loadCard('save', true, '', true)"); ?>
|
<?= button("save", $translation->get("save_and_close"), $formname, "loadCard('save', true, '', true)"); ?>
|
||||||
<li>
|
<li>
|
||||||
<ul>
|
<ul>
|
||||||
<?php
|
<?php if ($input_role["id"] != ""): ?>
|
||||||
if ($input_role["id"] != "") {
|
<?= button("delete", $translation->get("delete"), $formname, "loadCard('delete', true, '{$translation->get('delete_role_confirm')}', true)", "", FALSE); ?>
|
||||||
echo button("delete", $translation->get("delete"), $formname, "loadCard('delete', true, '{$translation->get('delete_role_confirm')}', true)", "", FALSE);
|
<?php endif; ?>
|
||||||
}
|
|
||||||
?>
|
|
||||||
<?= button("reset", $translation->get("restore"), $formname, "?action=edit", "", FALSE); ?>
|
<?= button("reset", $translation->get("restore"), $formname, "?action=edit", "", FALSE); ?>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<?php
|
<?php if ($messages !== null && count($messages)): ?>
|
||||||
if ($messages !== null) {
|
<div id="overlayMessages"><?= join("\r\n", $messages) ?></div>
|
||||||
if (count($messages)) {
|
<?php endif; ?>
|
||||||
echo '<div id="overlayMessages">' . join("\r\n", $messages) . '</div>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
<form id="<?= $formname ?>" name="<?= $formname ?>" method="post">
|
<form id="<?= $formname ?>" name="<?= $formname ?>" method="post">
|
||||||
<input name="input_id" type="hidden" value="<?= $input_role["id"] ?>">
|
<input name="input_id" type="hidden" value="<?= $input_role["id"] ?>">
|
||||||
@@ -44,5 +59,43 @@ if ($messages !== null) {
|
|||||||
<div>
|
<div>
|
||||||
<? input($translation->get("description"), "input_description", "text", $input_role["description"], 100) ?>
|
<? input($translation->get("description"), "input_description", "text", $input_role["description"], 100) ?>
|
||||||
</div>
|
</div>
|
||||||
|
<tr>
|
||||||
|
<div class="label">Verknüpfte Einrichtungen</div>
|
||||||
|
<div class="einricht-link bc-select-ui ui fluid multiple search selection dropdown" style="clear:both; display:inline-block;">
|
||||||
|
<input type="hidden" name="linked_einrichts">
|
||||||
|
<i class="dropdown icon"></i>
|
||||||
|
<div class="default text">Einrichtungen auswählen…</div>
|
||||||
|
<div class="menu">
|
||||||
|
<?php foreach ($allEinrichts as $e): ?>
|
||||||
|
<div class="item" data-value="<?= (int)$e['id'] ?>">
|
||||||
|
<?= htmlspecialchars($e['description']) ?>
|
||||||
|
</div>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="/plugins/jquery/jquery-3.5.1.min.js"></script>
|
||||||
|
<script type="text/javascript" src="/plugins/Semantic-UI-master/semantic.min.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/plugins/Semantic-UI-master/bc-semantic.css?time=<?= filemtime($_SERVER['DOCUMENT_ROOT'] . '/plugins/Semantic-UI-master/bc-semantic.css') ?>">
|
||||||
|
<script>
|
||||||
|
var $y = jQuery.noConflict();
|
||||||
|
$y(document).ready(function () {
|
||||||
|
var $drop = $y('.einricht-link.ui.fluid.multiple.dropdown');
|
||||||
|
var $hidden = $y('input[name="linked_einrichts"]');
|
||||||
|
|
||||||
|
$drop.dropdown({
|
||||||
|
onChange: function (value) {
|
||||||
|
$hidden.val(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var preselect = <?= json_encode($preselect) ?>.map(String);
|
||||||
|
if (preselect.length) {
|
||||||
|
$drop.dropdown('set selected', preselect);
|
||||||
|
$hidden.val(preselect.join(','));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user