Files
atlhousingreport/classes/SearchHistory.php
T
2026-02-14 07:57:18 -05:00

254 lines
8.6 KiB
PHP

<?php
class SearchHistory extends Base {
// Variables
private $current_user_serial = 0;
private $current_user_id = "";
private $current_user_name = "";
private $current_user_email = "";
// =================
// Class Constructor
// =================
public function __construct() {
set_error_handler(array($this, "displayError"));
date_default_timezone_set(self::TIMEZONE);
$this->current_user_serial = $_SESSION[self::USER_SERIAL] ?? 0;
$this->current_user_id = $_SESSION[self::USER_ID] ?? "";
$this->current_user_name = $_SESSION[self::USER_NAME] ?? "";
$this->current_user_email = $_SESSION[self::USER_EMAIL] ?? "";
}
// ============================
// Save Users Search Parameters
// ============================
public function saveUserSearchParameters($searchpayload) {
$user = $this->current_user_serial;
$subscription_serial = $searchpayload['subscription_serial'];
switch ($subscription_serial) {
case 5:
case 9:
case 11:
case 13:
case 15:
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
break;
case 7:
case 10:
case 12:
case 14:
case 16:
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
break;
default :
$this->debug("ERROR....");
return;
}
$SQL = "insert into searchhistories
( searchhistory_user,
searchhistory_subscription,
searchhistory_parameters,
searchhistory_creator,
searchhistory_created )
values ( :searchhistory_user,
:searchhistory_subscription,
:searchhistory_parameters,
:searchhistory_creator,
:searchhistory_created )";
$connection = $this->connect();
$statement = $connection->prepare($SQL);
$statement->bindValue(":searchhistory_user", $user);
$statement->bindValue(":searchhistory_subscription", $subscription_serial);
$statement->bindValue(":searchhistory_parameters", $searchcriteria);
$statement->bindValue(":searchhistory_creator", $this->current_user_name);
$statement->bindValue(":searchhistory_created", $this->getTimestamp());
$statement->execute();
}
// ============================
// Save Users Search Parameters
// ============================
public function updateUserSearchParameters($searchpayload) {
$user = $this->current_user_serial;
$subscription_serial = $searchpayload['subscription_serial'];
switch ($subscription_serial) {
case 5:
case 9:
case 11:
case 13:
case 15:
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
break;
case 7:
case 10:
case 12:
case 14:
case 16:
$searchcriteria = json_encode(array_filter($searchpayload, fn($key) => str_starts_with($key, 'rdi_'), ARRAY_FILTER_USE_KEY));
break;
default :
return;
}
$SQL = "update searchhistories
set searchhistory_parameters = :searchhistory_parameters,
searchhistory_changer = :searchhistory_changer,
searchhistory_changed = :searchhistory_changed
where searchhistory_user = :searchhistory_user
and searchhistory_subscription = :searchhistory_subscription";
$statement = $this->connect()->prepare($SQL);
$statement->bindValue(":searchhistory_parameters", $searchcriteria);
$statement->bindValue(":searchhistory_changer", $this->current_user_name);
$statement->bindValue(":searchhistory_changed", $this->getTimestamp());
$statement->bindValue(":searchhistory_user", $user);
$statement->bindValue(":searchhistory_subscription", $subscription_serial);
$statement->execute();
}
// ============================
// Gets Users Search Parameters
// ============================
public function getUsersPreviousSearchParameters($user, $subscription) {
$SQL = "select view_searchhistories.*
from view_searchhistories
where view_searchhistories.searchhistory_user = {$user}
and view_searchhistories.searchhistory_subscription = {$subscription}";
$recordset = $this->getTable("searchhistory", $SQL);
return $this->materializeSearchHistoryParameters($recordset);
}
// ============================
// Gets Users Search Parameters
// ============================
public function materializeSearchHistoryParameters(SimpleXMLElement $SXE): SimpleXMLElement {
if (!isset($SXE->record)) {
return $SXE;
}
// Keys that should ALWAYS materialize as <key><id>..</id></key>
// even if there is only one value.
$multiSelectKeys = [
'permitfact_project_city', 'permitfact_county', 'permitfact_project_type', 'permitfact_work_type', 'permitfact_building_type',
'businessfact_city', 'businessfact_city', 'businessfact_county', 'businessfact_action', 'businessfact_business_class',
'pzfact_project_city', 'pzfact_project_city', 'pzfact_project_city', 'pzfact_project_city'
];
foreach ($SXE->record as $record) {
if (!isset($record->searchhistory_parameters)) {
continue;
}
$json = trim((string) $record->searchhistory_parameters);
if ($json === '') {
continue;
}
$data = json_decode($json, true);
if (!is_array($data)) {
continue;
}
// Clear existing text content
$record->searchhistory_parameters[0] = null;
foreach ($data as $key => $value) {
$nodeName = preg_replace('/[^A-Za-z0-9_\-:.]/', '_', (string) $key);
$isMulti = in_array($key, $multiSelectKeys, true);
// If this is a multi-select key:
// - Accept arrays (preferred)
// - Accept CSV strings (legacy)
// - Accept single scalar and wrap it in <id>
if ($isMulti) {
$parent = $record->searchhistory_parameters->addChild($nodeName);
if (is_array($value)) {
$parts = $value;
} else {
$valueStr = trim((string) $value);
// empty -> create empty parent node and move on
if ($valueStr === '') {
continue;
}
// CSV or single
$parts = (strpos($valueStr, ',') !== false) ? explode(',', $valueStr) : [$valueStr];
}
$parts = array_values(array_filter(array_map('trim', $parts), fn($v) => $v !== ''));
foreach ($parts as $p) {
$parent->addChild('id', htmlspecialchars($p, ENT_XML1 | ENT_QUOTES, 'UTF-8'));
}
continue;
}
// Non-multi-select keys (same as your current behavior)
if (is_string($value) && strpos($value, ',') !== false) {
$parent = $record->searchhistory_parameters->addChild($nodeName);
$parts = array_values(array_filter(array_map('trim', explode(',', $value)), fn($v) => $v !== ''));
foreach ($parts as $p) {
$parent->addChild('id', htmlspecialchars($p, ENT_XML1 | ENT_QUOTES, 'UTF-8'));
}
} else {
$record->searchhistory_parameters->addChild(
$nodeName,
htmlspecialchars((string) $value, ENT_XML1 | ENT_QUOTES, 'UTF-8')
);
}
}
}
return $SXE;
}
}
?>