Add CustomVarsRetrieverHook for dynamic custom variable retrieval, updated ObjectSuggestions and Controller classes to utilize the new hook for enhanced search functionality

This commit is contained in:
oskarnrk 2025-08-22 12:14:50 +02:00
parent fa23e86ae7
commit 02e6fb04f4
No known key found for this signature in database
3 changed files with 46 additions and 2 deletions

View file

@ -0,0 +1,37 @@
<?php
namespace Icinga\Module\Icingadb\Hook;
use Icinga\Application\Hook;
use Icinga\Application\Logger;
use ipl\Orm\Model;
use Throwable;
abstract class CustomVarsRetrieverHook
{
abstract public function retrieveCustomVars(Model $model): array;
final public static function getCustomVarColumns(Model $model): array
{
$columns = [];
$hooks = Hook::all('icingadb/CustomVarsRetriever');
foreach ($hooks as $hook) {
try {
$customVars = $hook->retrieveCustomVars($model);
if (!empty($customVars)) {
$columns = [...$columns, ...$customVars];
}
} catch (Throwable $e) {
Logger::error(
'Error retrieving Custom Vars for %s with table name "%s": %s',
get_class($model),
$model->getTableName(),
$e->getMessage()
);
}
}
return $columns;
}
}

View file

@ -7,6 +7,7 @@ namespace Icinga\Module\Icingadb\Web\Control\SearchBar;
use Generator;
use Icinga\Module\Icingadb\Common\Auth;
use Icinga\Module\Icingadb\Common\Database;
use Icinga\Module\Icingadb\Hook\CustomVarsRetrieverHook;
use Icinga\Module\Icingadb\Model\Behavior\ReRoute;
use Icinga\Module\Icingadb\Model\CustomvarFlat;
use Icinga\Module\Icingadb\Model\Host;
@ -132,7 +133,10 @@ class ObjectSuggestions extends Suggestions
$resolver = $model::on($this->getDb())->getResolver();
$quickFilter = Filter::any();
foreach ($model->getSearchColumns() as $column) {
$customVarColumns = CustomVarsRetrieverHook::getCustomVarColumns($model);
$columns = [...$model->getSearchColumns(), ...$customVarColumns];
foreach ($columns as $column) {
if (strpos($column, '.') === false) {
$column = $resolver->qualifyColumn($column, $model->getTableName());
}

View file

@ -22,6 +22,7 @@ use Icinga\Module\Icingadb\Common\Database;
use Icinga\Module\Icingadb\Common\SearchControls;
use Icinga\Module\Icingadb\Data\CsvResultSet;
use Icinga\Module\Icingadb\Data\JsonResultSet;
use Icinga\Module\Icingadb\Hook\CustomVarsRetrieverHook;
use Icinga\Module\Icingadb\Web\Control\GridViewModeSwitcher;
use Icinga\Module\Icingadb\Web\Control\ViewModeSwitcher;
use Icinga\Module\Icingadb\Widget\ItemTable\StateItemTable;
@ -303,7 +304,9 @@ class Controller extends CompatController
*/
protected function prepareSearchFilter(Query $query, string $search, Filter\Any $filter, array $additionalColumns)
{
$columns = array_merge($query->getModel()->getSearchColumns(), $additionalColumns);
$model = $query->getModel();
$customVarColumns = CustomVarsRetrieverHook::getCustomVarColumns($model);
$columns = array_merge($model->getSearchColumns(), $additionalColumns, $customVarColumns);
foreach ($columns as $column) {
if (strpos($column, '.') === false) {
$column = $query->getResolver()->qualifyColumn($column, $query->getModel()->getTableName());