From 50d28a0ad8dcf5d9fe697278b6ea05aa00f8fb87 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 5 Nov 2019 18:01:37 +0100 Subject: [baseconfig] Overhaul hook system This enables us to finally properly show the inheritance flow of all the config variables when editing the baseconfig for a certain location or machine. --- .../locations/baseconfig/getconfig.inc.php | 25 +++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'modules-available/locations/baseconfig/getconfig.inc.php') diff --git a/modules-available/locations/baseconfig/getconfig.inc.php b/modules-available/locations/baseconfig/getconfig.inc.php index f21503f1..26e43ed8 100644 --- a/modules-available/locations/baseconfig/getconfig.inc.php +++ b/modules-available/locations/baseconfig/getconfig.inc.php @@ -2,7 +2,9 @@ // Location handling: figure out location $locationId = false; -if (Request::any('force', 0, 'int') === 1 && Request::any('module', false, 'string') === 'locations') { +if (BaseConfig::hasOverride('locationid')) { + $locationId = BaseConfig::getOverride('locationid'); +} elseif (Request::any('force', 0, 'int') === 1 && Request::any('module', false, 'string') === 'locations') { // Force location for testing, but require logged in admin if (User::load()) { $locationId = Request::any('value', 0, 'int'); @@ -10,6 +12,8 @@ if (Request::any('force', 0, 'int') === 1 && Request::any('module', false, 'stri } if ($locationId === false) { + if (!$ip) // Required at this point, bail out if not given + return; $locationId = Location::getFromIpAndUuid($ip, $uuid); } @@ -23,19 +27,30 @@ if ($locationId !== false) { // Query location specific settings (from bottom to top) if (!empty($matchingLocations)) { // First get all settings for all locations we're in - $list = implode(',', $matchingLocations); - $res = Database::simpleQuery("SELECT locationid, setting, value FROM setting_location WHERE locationid IN ($list)"); + $res = Database::simpleQuery("SELECT locationid, setting, value, displayvalue + FROM setting_location WHERE locationid IN (:list)", + ['list' => $matchingLocations]); $tmp = array(); while ($row = $res->fetch(PDO::FETCH_ASSOC)) { - $tmp[(int)$row['locationid']][$row['setting']] = $row['value']; + $tmp[(int)$row['locationid']][$row['setting']] = $row; // Put whole row so we have value and displayvalue } + // Callback for pretty printing + $cb = function($id) { + if (substr($id, 0, 9) !== 'location-') + return ['name' => $id, 'locationid' => 0]; + $lid = (int)substr($id, 9); + return [ + 'name' => Location::getName($lid), + 'locationid' => $lid, + ]; + }; // $matchingLocations contains the location ids sorted from closest to furthest, so we use it to make sure the order // in which they override is correct (closest setting wins, e.g. room setting beats department setting) $prio = count($matchingLocations) + 1; foreach ($matchingLocations as $lid) { if (!isset($tmp[$lid])) continue; - ConfigHolder::setContext('location-' . $lid); + ConfigHolder::setContext('location-' . $lid, $cb); foreach ($tmp[$lid] as $setting => $value) { ConfigHolder::add($setting, $value, $prio); } -- cgit v1.2.3-55-g7522