diff --git a/admin_ipsandports.php b/admin_ipsandports.php index 0eb6ac90..0c928f71 100644 --- a/admin_ipsandports.php +++ b/admin_ipsandports.php @@ -37,39 +37,23 @@ if ($page == 'ipsandports' || $page == 'overview') { if ($action == '') { $log->logAction(\Froxlor\FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_ipsandports"); - $fields = array( - 'ip' => $lng['admin']['ipsandports']['ip'], - 'port' => $lng['admin']['ipsandports']['port'] - ); + $ipsandports_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.ipsandports.php'; + try { - // get total count - $json_result = IpsAndPorts::getLocal($userinfo)->listingCount(); - $result = json_decode($json_result, true)['data']; + // get collection + $collection = new \Froxlor\UI\Collection(\Froxlor\Api\Commands\IpsAndPorts::class, $userinfo); // initialize pagination and filtering - $paging = new \Froxlor\UI\Pagination($userinfo, $fields, $result); - // get list - $json_result = IpsAndPorts::getLocal($userinfo, $paging->getApiCommandParams())->listing(); + $paging = new \Froxlor\UI\Pagination($userinfo, $ipsandports_list_data['ipsandports_list']['columns'], $collection->count()); + // get filtered collection + $collection = new \Froxlor\UI\Collection(\Froxlor\Api\Commands\IpsAndPorts::class, $userinfo, $paging->getApiCommandParams()); } catch (Exception $e) { \Froxlor\UI\Response::dynamic_error($e->getMessage()); } - $result = json_decode($json_result, true)['data']; - $ipsandports = ''; - $sortcode = $paging->getHtmlSortCode($lng); - $arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s); - $searchcode = $paging->getHtmlSearchCode($lng); - $pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s); - $count = 0; - - foreach ($result['list'] as $row) { - $row = \Froxlor\PhpHelper::htmlentitiesArray($row); - if (filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { - $row['ip'] = '[' . $row['ip'] . ']'; - } - eval("\$ipsandports.=\"" . \Froxlor\UI\Template::getTemplate("ipsandports/ipsandports_ipandport") . "\";"); - $count++; - } - eval("echo \"" . \Froxlor\UI\Template::getTemplate("ipsandports/ipsandports") . "\";"); + UI::twigBuffer('user/table.html.twig', [ + 'listing' => \Froxlor\UI\Listing::format($collection, $ipsandports_list_data['ipsandports_list']), + ]); + UI::twigOutputBuffer(); } elseif ($action == 'delete' && $id != 0) { try { $json_result = IpsAndPorts::getLocal($userinfo, array( diff --git a/lib/Froxlor/UI/Collection.php b/lib/Froxlor/UI/Collection.php index 4a20eda2..cf9417ad 100644 --- a/lib/Froxlor/UI/Collection.php +++ b/lib/Froxlor/UI/Collection.php @@ -1,4 +1,5 @@ class = $class; $this->params = $params; @@ -57,16 +58,20 @@ class Collection return json_encode($this->get()); } - public function has($column, $class, $parentKey = 'id', $childKey = 'id', $params = []) + public function has($column, $class, $parentKey = 'id', $childKey = 'id', $params = []): Collection { - $attributes = $this->getListing($class, $params); + // check if the api result contains any items (not the overall listingCount as we might be in a search-resultset) + if (count($this->items) > 0) { + $attributes = $this->getListing($class, $params); - foreach ($this->items['data']['list'] as $key => $item) { - foreach ($attributes['data']['list'] as $list) { - if ($item[$parentKey] == $list[$childKey]) { - $this->items['data']['list'][$key][$column] = $list; + foreach ($this->items['data']['list'] as $key => $item) { + foreach ($attributes['data']['list'] as $list) { + if ($item[$parentKey] == $list[$childKey]) { + $this->items['data']['list'][$key][$column] = $list; + } } } } + return $this; } -} \ No newline at end of file +} diff --git a/lib/tablelisting/admin/tablelisting.ipsandports.php b/lib/tablelisting/admin/tablelisting.ipsandports.php new file mode 100644 index 00000000..8ebf4abd --- /dev/null +++ b/lib/tablelisting/admin/tablelisting.ipsandports.php @@ -0,0 +1,77 @@ + (2010-) + * @author Maurice Preuß + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Tabellisting + * + */ + +return [ + 'ipsandports_list' => [ + 'title' => $lng['admin']['ipsandports']['ipsandports'], + 'icon' => 'fa-solid fa-user', + 'columns' => [ + 'ip' => [ + 'label' => $lng['admin']['ipsandports']['ip'], + 'column' => 'ip', + ], + 'port' => [ + 'label' => $lng['admin']['ipsandports']['port'], + 'column' => 'port', + ], + 'listen' => [ + 'label' => 'Listen', + 'column' => 'listen_statement', + 'format_callback' => [\Froxlor\UI\Callbacks\Text::class, 'boolean'], + 'visible' => \Froxlor\Settings::Get('system.webserver') != 'nginx' + ], + 'namevirtualhost' => [ + 'label' => 'NameVirtualHost', + 'column' => 'namevirtualhost_statement', + 'format_callback' => [\Froxlor\UI\Callbacks\Text::class, 'boolean'], + 'visible' => \Froxlor\Settings::Get('system.webserver') == 'apache2' && (int) \Froxlor\Settings::Get('system.apache24') == 0 + ], + 'vhostcontainer' => [ + 'label' => 'vHost-Container', + 'column' => 'vhostcontainer', + 'format_callback' => [\Froxlor\UI\Callbacks\Text::class, 'boolean'] + ], + 'specialsettings' => [ + 'label' => 'Specialsettings', + 'column' => 'specialsettings', + 'format_callback' => [\Froxlor\UI\Callbacks\Text::class, 'boolean'] + ], + 'servername' => [ + 'label' => 'ServerName', + 'column' => 'vhostcontainer_servername_statement', + 'format_callback' => [\Froxlor\UI\Callbacks\Text::class, 'boolean'], + 'visible' => \Froxlor\Settings::Get('system.webserver') == 'apache2' + ], + 'ssl' => [ + 'label' => 'SSL', + 'column' => 'ssl', + 'format_callback' => [\Froxlor\UI\Callbacks\Text::class, 'boolean'] + ], + ], + 'visible_columns' => \Froxlor\UI\Listing::getVisibleColumnsForListing('ipsandports_list', [ + 'ip', + 'port', + 'listen', + 'namevirtualhost', + 'vhostcontainer', + 'specialsettings', + 'servername', + 'ssl' + ]), + ] +]; diff --git a/templates/Froxlor/table/callbacks.html.twig b/templates/Froxlor/table/callbacks.html.twig index 3b7fd1fa..7c4f3e8e 100644 --- a/templates/Froxlor/table/callbacks.html.twig +++ b/templates/Froxlor/table/callbacks.html.twig @@ -12,9 +12,9 @@ {% macro boolean(data) %} {% if (data) %} - + {% else %} - + {% endif %} {% endmacro %} @@ -33,4 +33,4 @@ {% endapply %} {% endif %} {% endfor %} -{% endmacro %} \ No newline at end of file +{% endmacro %}