diff --git a/library/Icingadb/Web/Control/ColumnChooser.php b/library/Icingadb/Web/Control/ColumnChooser.php index 27ec709e..9b8d16be 100644 --- a/library/Icingadb/Web/Control/ColumnChooser.php +++ b/library/Icingadb/Web/Control/ColumnChooser.php @@ -23,11 +23,27 @@ class ColumnChooser extends CompatForm /** @var Resolver The resolver used to validate column names and get their labels */ protected Resolver $resolver; - public function __construct(Url $suggestionUrl, Resolver $resolver, array $columns = []) + /** + * Create a new ColumnChooser + * + * @param Url $suggestionUrl URL to fetch column suggestions from + * @param Resolver $resolver Resolver to validate column names and get their labels + * @param string|array $columns A string of comma separated columns or an array of columns + */ + public function __construct(Url $suggestionUrl, Resolver $resolver, string|array $columns = []) { + if (is_string($columns)) { + foreach (explode(',', $columns) as $column) { + if ($column = trim($column)) { + $this->columns[] = $column; + } + } + } else { + $this->columns = $columns; + } + $this->suggestionUrl = $suggestionUrl; $this->resolver = $resolver; - $this->columns = $columns; } public function getColumns(): array diff --git a/library/Icingadb/Web/Controller.php b/library/Icingadb/Web/Controller.php index d4a673f8..0d227b25 100644 --- a/library/Icingadb/Web/Controller.php +++ b/library/Icingadb/Web/Controller.php @@ -92,26 +92,8 @@ class Controller extends CompatController array $defaultColumns, Url $redirectUrl ): ColumnChooser { - $columnsDef = $this->params->shift('columns'); - if (! $columnsDef) { - $columns = $defaultColumns; - } else { - $columns = []; - foreach (explode(',', $columnsDef) as $column) { - if ($column = trim($column)) { - $columns[] = $column; - } - } - } - - // When exporting as CSV or JSON, and the user requested specific columns, only those should be included - if ($this->format === 'csv' || $this->format === 'json') { - $query->columns($columns); - } else { - $query->withColumns($columns); - } - - return (new ColumnChooser($suggestionUrl, $query->getResolver(), $columns)) + $columnsDef = $this->params->shift('columns', $defaultColumns); + $chooser = (new ColumnChooser($suggestionUrl, $query->getResolver(), $columnsDef)) ->setAction((string) Url::fromRequest()) ->on(ColumnChooser::ON_SENT, function (ColumnChooser $form) use ($redirectUrl) { if ($form->hasBeenSubmitted()) { @@ -122,11 +104,19 @@ class Controller extends CompatController if (! is_array($update)) { $update = [$update]; } - $this->addPart(...$update); } } }); + + // When exporting as CSV or JSON, and the user requested specific columns, only those should be included + if ($this->format === 'csv' || $this->format === 'json') { + $query->columns($chooser->getColumns()); + } else { + $query->withColumns($chooser->getColumns()); + } + + return $chooser; } /**