Project

General

Profile

Download (19.3 KB) Statistics
| Branch: | Tag: | Revision:
1 a7f908db Scott Ullrich
<?php
2
/*
3 c5d81585 Renato Botelho
 * pkg.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6 38809d47 Renato Botelho do Couto
 * Copyright (c) 2004-2013 BSD Perimeter
7
 * Copyright (c) 2013-2016 Electric Sheep Fencing
8 a68f7a3d Luiz Otavio O Souza
 * Copyright (c) 2014-2024 Rubicon Communications, LLC (Netgate)
9 c5d81585 Renato Botelho
 * All rights reserved.
10
 *
11 b12ea3fb Renato Botelho
 * Licensed under the Apache License, Version 2.0 (the "License");
12
 * you may not use this file except in compliance with the License.
13
 * You may obtain a copy of the License at
14 c5d81585 Renato Botelho
 *
15 b12ea3fb Renato Botelho
 * http://www.apache.org/licenses/LICENSE-2.0
16 c5d81585 Renato Botelho
 *
17 b12ea3fb Renato Botelho
 * Unless required by applicable law or agreed to in writing, software
18
 * distributed under the License is distributed on an "AS IS" BASIS,
19
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
 * See the License for the specific language governing permissions and
21
 * limitations under the License.
22 f5dbca0d Stephen Beaver
 */
23 a7f908db Scott Ullrich
24 6b07c15a Matthew Grooms
##|+PRIV
25
##|*IDENT=page-package-settings
26 5230f468 jim-p
##|*NAME=Package: Settings
27 6b07c15a Matthew Grooms
##|*DESCR=Allow access to the 'Package: Settings' page.
28
##|*MATCH=pkg.php*
29
##|-PRIV
30
31 e4bf1c19 Colin Smith
require_once("guiconfig.inc");
32
require_once("pkg-utils.inc");
33 a7f908db Scott Ullrich
34 2c2fed92 Stephen Beaver
function domTT_title($title_msg) {
35
	print "onmouseout=\"this.style.color = ''; domTT_mouseout(this, event);\" onmouseover=\"domTT_activate(this, event, 'content', '".gettext($title_msg)."', 'trail', true, 'delay', 0, 'fade', 'both', 'fadeMax', 93, 'styleClass', 'niceTitle');\"";
36
}
37
38 98bcf1f8 Scott Ullrich
$xml = $_REQUEST['xml'];
39 a7f908db Scott Ullrich
40 f8ac4407 Phil Davis
if ($xml == "") {
41 84320769 k-paulius
	$pgtitle = array(gettext("Package"), gettext("Editor"));
42 edcd7535 Phil Davis
	$pglinks = array("", "@self");
43 f5dbca0d Stephen Beaver
	include("head.inc");
44 8545adde k-paulius
	print_info_box(gettext("No valid package defined."), 'danger', false);
45 f5dbca0d Stephen Beaver
	include("foot.inc");
46 b000f96f Scott Ullrich
	exit;
47 a7f908db Scott Ullrich
} else {
48 44bcf766 jim-p
	$pkg_xml_prefix = "/usr/local/pkg/";
49
	$pkg_full_path = "{$pkg_xml_prefix}/{$xml}";
50 74817ee2 Phil Davis
	$pkg_realpath = realpath($pkg_full_path);
51
	if (empty($pkg_realpath)) {
52 8545adde k-paulius
		$path_error = sprintf(gettext("Package path %s not found."), htmlspecialchars($pkg_full_path));
53 ae2915a4 Phil Davis
	} else if (substr_compare($pkg_realpath, $pkg_xml_prefix, 0, strlen($pkg_xml_prefix))) {
54 8545adde k-paulius
		$path_error = sprintf(gettext("Invalid path %s specified."), htmlspecialchars($pkg_full_path));
55 74817ee2 Phil Davis
	}
56
57
	if (!empty($path_error)) {
58
		include("head.inc");
59 8545adde k-paulius
		print_info_box($path_error . "<br />" . gettext("Try reinstalling the package."), 'danger', false);
60 74817ee2 Phil Davis
		include("foot.inc");
61 44bcf766 jim-p
		die;
62
	}
63 74817ee2 Phil Davis
64 44bcf766 jim-p
	if (file_exists($pkg_full_path)) {
65
		$pkg = parse_xml_config_pkg($pkg_full_path, "packagegui");
66 f8ac4407 Phil Davis
	} else {
67 f5dbca0d Stephen Beaver
		include("head.inc");
68 8545adde k-paulius
		print_info_box(sprintf(gettext("File not found %s."), htmlspecialchars($xml)), 'danger', false);
69 f5dbca0d Stephen Beaver
		include("foot.inc");
70 98bcf1f8 Scott Ullrich
		exit;
71
	}
72 a7f908db Scott Ullrich
}
73
74 f5dbca0d Stephen Beaver
if ($pkg['donotsave'] != "") {
75 6f3d2063 Renato Botelho
	header("Location: pkg_edit.php?xml=" . $xml);
76 b000f96f Scott Ullrich
	exit;
77 3eaeb703 Scott Ullrich
}
78
79 7c172009 Scott Ullrich
if ($pkg['include_file'] != "") {
80
	require_once($pkg['include_file']);
81
}
82
83 f8ac4407 Phil Davis
if ($_REQUEST['startdisplayingat']) {
84 32c477c5 Scott Ullrich
	$startdisplayingat = $_REQUEST['startdisplayingat'];
85 f8ac4407 Phil Davis
}
86 32c477c5 Scott Ullrich
87 f8ac4407 Phil Davis
if ($_REQUEST['display_maximum_rows']) {
88
	if ($_REQUEST['display_maximum_rows']) {
89 3ca50a15 Scott Ullrich
		$display_maximum_rows = $_REQUEST['display_maximum_rows'];
90 f8ac4407 Phil Davis
	}
91
}
92 3ca50a15 Scott Ullrich
93 63d6bb4f Marcos Mendoza
$pkg_config_path = sprintf('installedpackages/%s', xml_safe_fieldname($pkg['name']));
94 44b93616 Christian McDonald
95 b8f18410 Marcos Mendoza
$evaledvar = config_get_path("{$pkg_config_path}/config", []);
96 e3c4b6b7 Scott Ullrich
97 0de394c9 jim-p
if ($_POST['act'] == "update") {
98 f8ac4407 Phil Davis
99 63d6bb4f Marcos Mendoza
	if (is_array(config_get_path($pkg_config_path)) && $pkg['name'] != "" && $_POST['ids'] !="") {
100 0baf52bb doktornotor
		// get current values
101 b8f18410 Marcos Mendoza
		$current_values = config_get_path("{$pkg_config_path}/config", []);
102 0baf52bb doktornotor
		// get updated ids
103 0de394c9 jim-p
		parse_str($_POST['ids'], $update_list);
104 0baf52bb doktornotor
		// sort ids to know what to change
105
		// useful to do not lose data when using sorting and paging
106 f8ac4407 Phil Davis
		$sort_list=$update_list['ids'];
107
		sort($sort_list);
108 0baf52bb doktornotor
		// apply updates
109 f8ac4407 Phil Davis
		foreach ($update_list['ids'] as $key=> $value) {
110 63d6bb4f Marcos Mendoza
			config_set_path("{$pkg_config_path}/config/{$sort_list[$key]}", $current_values[$update_list['ids'][$key]]);
111 f8ac4407 Phil Davis
		}
112 0baf52bb doktornotor
		// save current config
113
		write_config(gettext("Package configuration changes saved from package settings page."));
114
		// sync package
115 f8ac4407 Phil Davis
		eval ("{$pkg['custom_php_resync_config_command']}");
116
	}
117 0baf52bb doktornotor
	// function called via jquery, no need to continue after save changes.
118 f8ac4407 Phil Davis
	exit;
119 05a42cce Marcello Coutinho
}
120 8d58ebae Steve Beaver
if ($_REQUEST['act'] == "del") {
121 f8ac4407 Phil Davis
	// loop through our fieldnames and automatically setup the fieldnames
122 f5dbca0d Stephen Beaver
	// in the environment.	ie: a fieldname of username with a value of
123 f8ac4407 Phil Davis
	// testuser would automatically eval $username = "testuser";
124
	foreach ($evaledvar as $ip) {
125
		if ($pkg['adddeleteeditpagefields']['columnitem']) {
126
			foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
127
				${xml_safe_fieldname($column['fielddescr'])} = $ip[xml_safe_fieldname($column['fieldname'])];
128
			}
129 ef2029df Scott Ullrich
		}
130 f8ac4407 Phil Davis
	}
131 e3c4b6b7 Scott Ullrich
132 63d6bb4f Marcos Mendoza
	if (config_get_path("{$pkg_config_path}/config/{$_REQUEST['id']}")) {
133
		config_del_path("{$pkg_config_path}/config/{$_REQUEST['id']}");
134 0baf52bb doktornotor
		write_config(gettext("Package configuration item deleted from package settings page."));
135 f5dbca0d Stephen Beaver
		if ($pkg['custom_delete_php_command'] != "") {
136
			if ($pkg['custom_php_command_before_form'] != "") {
137 f8ac4407 Phil Davis
				eval($pkg['custom_php_command_before_form']);
138 8060d89a Scott Ullrich
			}
139 f8ac4407 Phil Davis
			eval($pkg['custom_delete_php_command']);
140
		}
141
		header("Location:  pkg.php?xml=" . $xml);
142
		exit;
143
	}
144 e3c4b6b7 Scott Ullrich
}
145
146 4b5976b5 Scott Ullrich
ob_start();
147
148 f593f80b Phil Davis
$iflist = get_configured_interface_with_descr(true);
149 b8f18410 Marcos Mendoza
$evaledvar = config_get_path("{$pkg_config_path}/config", []);
150 a7f908db Scott Ullrich
151 f5dbca0d Stephen Beaver
if ($pkg['custom_php_global_functions'] != "") {
152 ef2029df Scott Ullrich
	eval($pkg['custom_php_global_functions']);
153 f8ac4407 Phil Davis
}
154 194b4e0a Colin Smith
155 f5dbca0d Stephen Beaver
if ($pkg['custom_php_command_before_form'] != "") {
156 194b4e0a Colin Smith
	eval($pkg['custom_php_command_before_form']);
157 f8ac4407 Phil Davis
}
158 f9a91638 Scott Ullrich
159 8cfdeb2e BBcan177
// Breadcrumb
160
if ($pkg['title'] != "") {
161 3ad27058 heper
	/*if (!$only_edit) {						// Is any package still making use of this?? Is this something that is still wanted, considering the breadcrumb policy https://redmine.pfsense.org/issues/5527
162 8d58ebae Steve Beaver
 		$pkg['title'] = $pkg['title'] . '/Edit';		// If this needs to live on, then it has to be moved to run AFTER "foreach ($pkg['tabs']['tab'] as $tab)"-loop. This due to $pgtitle[] = $tab['text'];
163 3ad27058 heper
	}*/
164 8cfdeb2e BBcan177
	if (strpos($pkg['title'], '/')) {
165
		$title = explode('/', $pkg['title']);
166
167
		foreach ($title as $subtitle) {
168
			$pgtitle[] = gettext($subtitle);
169 edcd7535 Phil Davis
			$pglinks[] = "@self";
170 8cfdeb2e BBcan177
		}
171
	} else {
172
		$pgtitle = array(gettext("Package"), gettext($pkg['title']));
173 edcd7535 Phil Davis
		$pglinks = array("", "@self");
174 8cfdeb2e BBcan177
	}
175
} else {
176
	$pgtitle = array(gettext("Package"), gettext("Editor"));
177 edcd7535 Phil Davis
	$pglinks = array("", "@self");
178 8cfdeb2e BBcan177
}
179
180 3ad27058 heper
if ($pkg['tabs'] != "") {
181
	$tab_array = array();
182
	foreach ($pkg['tabs']['tab'] as $tab) {
183
		if ($tab['tab_level']) {
184
			$tab_level = $tab['tab_level'];
185
		} else {
186
			$tab_level = 1;
187
		}
188
		if (isset($tab['active'])) {
189
			$active = true;
190
			$pgtitle[] = $tab['text'];
191 edcd7535 Phil Davis
			$pglinks[] = "@self";
192 3ad27058 heper
		} else {
193
			$active = false;
194
		}
195
		$urltmp = "";
196
		if ($tab['url'] != "") {
197
			$urltmp = $tab['url'];
198
		}
199
		if ($tab['xml'] != "") {
200
			$urltmp = "pkg_edit.php?xml=" . $tab['xml'];
201
		}
202
203
		$addresswithport = getenv("HTTP_HOST");
204
		$colonpos = strpos($addresswithport, ":");
205
		if ($colonpos !== False) {
206
			//my url is actually just the IP address of the pfsense box
207
			$myurl = substr($addresswithport, 0, $colonpos);
208
		} else {
209
			$myurl = $addresswithport;
210
		}
211
		// eval url so that above $myurl item can be processed if need be.
212
		$url = str_replace('$myurl', $myurl, $urltmp);
213
214
		$tab_array[$tab_level][] = array(
215
			$tab['text'],
216
			$active,
217
			$url
218
		);
219
	}
220
221
	ksort($tab_array);
222
}
223
224 3abcd547 jim-p
if (!empty($pkg['tabs'])) {
225
	$shortcut_section = $pkg['shortcut_section'];
226
}
227
228 83ddedcd Scott Ullrich
include("head.inc");
229 3ad27058 heper
if (isset($tab_array)) {
230 d35a18fc Christian McDonald
	foreach ($tab_array as $tab) {
231 cbbb8fdb doktornotor
		display_top_tabs($tab);
232 3ad27058 heper
	}
233
}
234 83ddedcd Scott Ullrich
235 a7f908db Scott Ullrich
?>
236
237 44507df4 Colin Fleming
<script type="text/javascript">
238
//<![CDATA[
239 0f649c97 Phil Davis
events.push(function() {
240 2ef13b6c Stephen Beaver
241 44507df4 Colin Fleming
	function setFilter(filtertext) {
242 3f98044a Francisco Cavalcante
		$('#pkg_filter').val(filtertext);
243 44507df4 Colin Fleming
		document.pkgform.submit();
244 f8ac4407 Phil Davis
	}
245 44507df4 Colin Fleming
246 2ef13b6c Stephen Beaver
<?php
247
	if ($pkg['adddeleteeditpagefields']['movable']) {
248
?>
249
		$('#mainarea table tbody').sortable({
250
		items: 'tr.sortable',
251
			cursor: 'move',
252
			distance: 10,
253
			opacity: 0.8,
254
			helper: function(e, ui) {
255
				ui.children().each(function() {
256 3f98044a Francisco Cavalcante
					$(this).width($(this).width());
257 44507df4 Colin Fleming
				});
258 2ef13b6c Stephen Beaver
			return ui;
259
			},
260
		});
261
<?php
262
	}
263
?>
264
});
265 b51d272c Stephen Beaver
266 15281e44 Stephen Beaver
function save_changes_to_xml(xml) {
267
	var ids = $('#mainarea table tbody').sortable('serialize', {key:"ids[]"});
268
	var strloading="<?=gettext('Saving changes...')?>";
269 34ee6639 NOYB
	if (confirm("<?=gettext("Confirmation Required to save changes.")?>")) {
270 15281e44 Stephen Beaver
		$.ajax({
271 0de394c9 jim-p
			type: 'post',
272 15281e44 Stephen Beaver
			cache: false,
273
			url: "<?=$_SERVER['SCRIPT_NAME']?>",
274
			data: {xml:'<?=$xml?>', act:'update', ids: ids},
275
			beforeSend: function() {
276
				$('#savemsg').empty().html(strloading);
277
			},
278
			error: function(data) {
279
				$('#savemsg').empty().html('Error:' + data);
280
			},
281
			success: function(data) {
282
				$('#savemsg').empty().html(data);
283
			}
284
		});
285 2ef13b6c Stephen Beaver
	}
286
}
287
288 44507df4 Colin Fleming
//]]>
289
</script>
290 f5dbca0d Stephen Beaver
291
<?php
292 8d58ebae Steve Beaver
if ($_REQUEST['savemsg'] != "") {
293
	$savemsg = htmlspecialchars($_REQUEST['savemsg']);
294 0f649c97 Phil Davis
}
295 f5dbca0d Stephen Beaver
296 0f649c97 Phil Davis
if ($savemsg) {
297 f5dbca0d Stephen Beaver
	print_info_box($savemsg, 'success');
298 0f649c97 Phil Davis
}
299 f5dbca0d Stephen Beaver
?>
300
301 5aa9a4f2 Scott Ullrich
<form action="pkg.php" name="pkgform" method="get">
302 f5dbca0d Stephen Beaver
	<input type='hidden' name='xml' value='<?=$_REQUEST['xml']?>' />
303 c24bb3fc Stephen Beaver
		<div id="mainarea" class="panel panel-default">
304 b51d272c Stephen Beaver
			<table id="mainarea" class="table table-striped table-hover table-condensed">
305 c24bb3fc Stephen Beaver
				<thead>
306 32c477c5 Scott Ullrich
<?php
307 f8ac4407 Phil Davis
	/* Handle filtering bar A-Z */
308
	$include_filtering_inputbox = false;
309
	$colspan = 0;
310 f5dbca0d Stephen Beaver
	if ($pkg['adddeleteeditpagefields']['columnitem'] != "") {
311 f8ac4407 Phil Davis
		foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
312
			$colspan++;
313
		}
314
	}
315
	if ($pkg['fields']['field']) {
316
		// First find the sorting type field if it exists
317
		foreach ($pkg['fields']['field'] as $field) {
318
			if ($field['type'] == "sorting") {
319
				if (isset($field['include_filtering_inputbox'])) {
320
					$include_filtering_inputbox = true;
321
				}
322
				if ($display_maximum_rows < 1) {
323
					if ($field['display_maximum_rows']) {
324
						$display_maximum_rows = $field['display_maximum_rows'];
325
					}
326
				}
327 79563cb6 Colin Fleming
				echo "<tr><td colspan='$colspan' class='text-center'>";
328 cadeb9fd Phil Davis
				echo gettext("Filter by: ");
329 f8ac4407 Phil Davis
				$isfirst = true;
330
				for ($char = 65; $char < 91; $char++) {
331
					if (!$isfirst) {
332
						echo " | ";
333
					}
334
					echo "<a href=\"#\" onclick=\"setFilter('" . chr($char) . "');\">" . chr($char) . "</a>";
335
					$isfirst = false;
336
				}
337
				echo "</td></tr>";
338 79563cb6 Colin Fleming
				echo "<tr><td colspan='$colspan' class='text-center'>";
339 f8ac4407 Phil Davis
				if ($field['sortablefields']) {
340 cadeb9fd Phil Davis
					echo gettext("Filter field: ") . "<select name='pkg_filter_type'>";
341 f8ac4407 Phil Davis
					foreach ($field['sortablefields']['item'] as $si) {
342
						if ($si['name'] == $_REQUEST['pkg_filter_type']) {
343 c4b60a9a Colin Fleming
							$SELECTED = "selected";
344 f8ac4407 Phil Davis
						} else {
345
							$SELECTED = "";
346 32c477c5 Scott Ullrich
						}
347 f8ac4407 Phil Davis
						echo "<option value='{$si['name']}' {$SELECTED}>{$si['name']}</option>";
348 32c477c5 Scott Ullrich
					}
349 f8ac4407 Phil Davis
					echo "</select>";
350 32c477c5 Scott Ullrich
				}
351 f8ac4407 Phil Davis
				if ($include_filtering_inputbox) {
352 6ac61204 jim-p
					echo '&nbsp;&nbsp;' . gettext("Filter text: ") . '<input id="pkg_filter" name="pkg_filter" value="' . htmlspecialchars($_REQUEST['pkg_filter']) . '" />';
353 27d6a45b jim-p
					echo '&nbsp;<button type="submit" value="Filter" class="btn btn-primary btn-xs">';
354 e0cb987c Marcos Mendoza
					echo '<i class="fa-solid fa-filter icon-embed-btn"></i>';
355 27d6a45b jim-p
					echo gettext("Filter");
356
					echo "</button>";
357 f8ac4407 Phil Davis
				}
358
				echo "</td></tr><tr><td><font size='-3'>&nbsp;</font></td></tr>";
359
			}
360
		}
361
	}
362 32c477c5 Scott Ullrich
?>
363
				<tr>
364 c24bb3fc Stephen Beaver
365 32c477c5 Scott Ullrich
<?php
366 f8ac4407 Phil Davis
	if ($display_maximum_rows) {
367 6c07db48 Phil Davis
		$totalpages = ceil(round((count($evaledvar) / $display_maximum_rows), 9));
368 f8ac4407 Phil Davis
		$page = 1;
369
		$tmpcount = 0;
370
		$tmppp = 0;
371
		if (is_array($evaledvar)) {
372
			foreach ($evaledvar as $ipa) {
373
				if ($tmpcount == $display_maximum_rows) {
374
					$page++;
375 37da0c50 Scott Ullrich
					$tmpcount = 0;
376
				}
377 f8ac4407 Phil Davis
				if ($tmppp == $startdisplayingat) {
378
					break;
379 32c477c5 Scott Ullrich
				}
380 f8ac4407 Phil Davis
				$tmpcount++;
381
				$tmppp++;
382
			}
383
		}
384 c24bb3fc Stephen Beaver
		echo "<tr><th colspan='" . count($pkg['adddeleteeditpagefields']['columnitem']) . "'>";
385 f8ac4407 Phil Davis
		echo "<table width='100%' summary=''>";
386
		echo "<tr>";
387 cadeb9fd Phil Davis
		echo "<td class='text-left'>" . sprintf(gettext('Displaying page %1$s of %2$s'), $page, $totalpages) . "</b></td>";
388
		echo "<td class='text-right'>" . gettext("Rows per page: ") . "<select onchange='document.pkgform.submit();' name='display_maximum_rows'>";
389 6c07db48 Phil Davis
		for ($x = 0; $x < 250; $x++) {
390 f8ac4407 Phil Davis
			if ($x == $display_maximum_rows) {
391 c4b60a9a Colin Fleming
				$SELECTED = "selected";
392 f8ac4407 Phil Davis
			} else {
393
				$SELECTED = "";
394
			}
395
			echo "<option value='$x' $SELECTED>$x</option>\n";
396
			$x = $x + 4;
397
		}
398
		echo "</select></td></tr>";
399
		echo "</table>";
400 c24bb3fc Stephen Beaver
		echo "</th></tr>";
401 f8ac4407 Phil Davis
	}
402 2ef13b6c Stephen Beaver
403 f8ac4407 Phil Davis
	$cols = 0;
404 f5dbca0d Stephen Beaver
	if ($pkg['adddeleteeditpagefields']['columnitem'] != "") {
405 f8ac4407 Phil Davis
		foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
406 c24bb3fc Stephen Beaver
			echo "<th class=\"listhdrr\">" . $column['fielddescr'] . "</th>";
407 f8ac4407 Phil Davis
			$cols++;
408
		}
409
	}
410
?>
411
				</tr>
412 c24bb3fc Stephen Beaver
				</thead>
413
				<tbody>
414 f8ac4407 Phil Davis
<?php
415
	$i = 0;
416 6c07db48 Phil Davis
	$pagination_counter = 0;
417 d43354d2 Steve Beaver
	if ($evaledvar && is_array($evaledvar)) {
418 f8ac4407 Phil Davis
		foreach ($evaledvar as $ip) {
419
			if ($startdisplayingat) {
420
				if ($i < $startdisplayingat) {
421
					$i++;
422
					continue;
423 32c477c5 Scott Ullrich
				}
424 f8ac4407 Phil Davis
			}
425
			if ($_REQUEST['pkg_filter']) {
426
				// Handle filtered items
427
				if ($pkg['fields']['field'] && !$filter_regex) {
428
					// First find the sorting type field if it exists
429
					foreach ($pkg['fields']['field'] as $field) {
430
						if ($field['type'] == "sorting") {
431
							if ($field['sortablefields']['item']) {
432
								foreach ($field['sortablefields']['item'] as $sf) {
433
									if ($sf['name'] == $_REQUEST['pkg_filter_type']) {
434
										$filter_fieldname = $sf['fieldname'];
435
										#Use a default regex on sortable fields when none is declared
436 5d82cce0 jim-p
										$pkg_filter = cleanup_regex_pattern(htmlspecialchars(strip_tags($_REQUEST['pkg_filter'])));
437 f8ac4407 Phil Davis
										if ($sf['regex']) {
438 5d82cce0 jim-p
											$filter_regex = str_replace("%FILTERTEXT%", $pkg_filter, trim($sf['regex']));
439 f8ac4407 Phil Davis
										} else {
440 5d82cce0 jim-p
											$filter_regex = "/{$pkg_filter}/i";
441 32c477c5 Scott Ullrich
										}
442
									}
443
								}
444
							}
445
						}
446
					}
447 f8ac4407 Phil Davis
				}
448
				// Do we have something to filter on?
449
				unset($filter_matches);
450 f5dbca0d Stephen Beaver
				if ($pkg['adddeleteeditpagefields']['columnitem'] != "") {
451 f8ac4407 Phil Davis
					foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
452
						$fieldname = $ip[xml_safe_fieldname($column['fieldname'])];
453
						if ($column['fieldname'] == $filter_fieldname) {
454
							if ($filter_regex) {
455
								preg_match($filter_regex, $fieldname, $filter_matches);
456
								break;
457 32c477c5 Scott Ullrich
							}
458
						}
459
					}
460
				}
461 f8ac4407 Phil Davis
				if (!$filter_matches) {
462
					$i++;
463
					continue;
464
				}
465
			}
466
			if ($pkg['adddeleteeditpagefields']['movable']) {
467 8d659bf1 NOYB
				echo "<tr style=\"vertical-align: top\" class=\"sortable\" id=\"id_{$i}\">\n";
468 f8ac4407 Phil Davis
			} else {
469 8d659bf1 NOYB
				echo "<tr style=\"vertical-align: top\">\n";
470 f8ac4407 Phil Davis
			}
471 f5dbca0d Stephen Beaver
			if ($pkg['adddeleteeditpagefields']['columnitem'] != "") {
472 f8ac4407 Phil Davis
				foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
473
					if ($column['fieldname'] == "description") {
474
						$class = "listbg";
475
					} else {
476
						$class = "listlr";
477
					}
478 32c477c5 Scott Ullrich
?>
479 f5dbca0d Stephen Beaver
					<td class="<?=$class?>" ondblclick="document.location='pkg_edit.php?xml=<?=$xml?>&amp;act=edit&amp;id=<?=$i?>';">
480 32c477c5 Scott Ullrich
<?php
481 f8ac4407 Phil Davis
					$fieldname = $ip[xml_safe_fieldname($column['fieldname'])];
482
					#Check if columnitem has a type field declared
483
					if ($column['type'] == "checkbox") {
484
						if ($fieldname == "") {
485
							echo gettext("No");
486
						} else {
487
							echo gettext("Yes");
488
						}
489
					} else if ($column['type'] == "interface") {
490 6c07db48 Phil Davis
						echo $column['prefix'] . $iflist[$fieldname] . $column['suffix'];
491 f8ac4407 Phil Davis
					} else {
492 d6ab7496 jim-p
						$display_text = "";
493 f8ac4407 Phil Davis
						#Check if columnitem has an encoding field declared
494
						if ($column['encoding'] == "base64") {
495 d6ab7496 jim-p
							$display_text = $column['prefix'] . base64_decode($fieldname) . $column['suffix'];
496 f8ac4407 Phil Davis
						#Check if there is a custom info to show when $fieldname is not empty
497
						} else if ($column['listmodeon'] && $fieldname != "") {
498 d6ab7496 jim-p
							$display_text = $column['prefix'] . gettext($column['listmodeon']). $column['suffix'];
499 f8ac4407 Phil Davis
						#Check if there is a custom info to show when $fieldname is empty
500
						} else if ($column['listmodeoff'] && $fieldname == "") {
501 d6ab7496 jim-p
							$display_text = $column['prefix'] .gettext($column['listmodeoff']). $column['suffix'];
502 f8ac4407 Phil Davis
						} else {
503 d6ab7496 jim-p
							$display_text = $column['prefix'] . $fieldname ." ". $column['suffix'];
504 f8ac4407 Phil Davis
						}
505 d6ab7496 jim-p
						if (!isset($column['allow_html'])) {
506
							$display_text = htmlspecialchars($display_text);
507
						}
508
						echo $display_text;
509 32c477c5 Scott Ullrich
					}
510
?>
511 f8ac4407 Phil Davis
					</td>
512 32c477c5 Scott Ullrich
<?php
513 f8ac4407 Phil Davis
				} // foreach columnitem
514
			} // if columnitem
515
?>
516 8d659bf1 NOYB
					<td style="vertical-align: middle" class="list text-nowrap">
517 f8ac4407 Phil Davis
						<table border="0" cellspacing="0" cellpadding="1" summary="icons">
518
							<tr>
519
<?php
520
			#Show custom description to edit button if defined
521 cadeb9fd Phil Davis
			$edit_msg=($pkg['adddeleteeditpagefields']['edittext']?$pkg['adddeleteeditpagefields']['edittext']:gettext("Edit this item"));
522 f8ac4407 Phil Davis
?>
523 e0cb987c Marcos Mendoza
								<td><a class="fa-solid fa-pencil" href="pkg_edit.php?xml=<?=$xml?>&amp;act=edit&amp;id=<?=$i?>" title="<?=$edit_msg?>"></a></td>
524 f8ac4407 Phil Davis
<?php
525
			#Show custom description to delete button if defined
526 cadeb9fd Phil Davis
			$delete_msg=($pkg['adddeleteeditpagefields']['deletetext']?$pkg['adddeleteeditpagefields']['deletetext']:gettext("Delete this item"));
527 f8ac4407 Phil Davis
?>
528 c1d304b3 Marcos Mendoza
								<td>&nbsp;<a class="fa-solid fa-trash-can" href="pkg.php?xml=<?=$xml?>&amp;act=del&amp;id=<?=$i?>" title="<?=$delete_msg?>"></a></td>
529 f8ac4407 Phil Davis
							</tr>
530 c24bb3fc Stephen Beaver
						</tbody>
531
					</table>
532 b51d272c Stephen Beaver
				</td>
533 f8ac4407 Phil Davis
<?php
534 f5dbca0d Stephen Beaver
			echo "</tr>\n"; // Pairs with an echo tr some way above
535 f8ac4407 Phil Davis
			// Handle pagination and display_maximum_rows
536
			if ($display_maximum_rows) {
537
				if ($pagination_counter == ($display_maximum_rows-1) or
538 f5dbca0d Stephen Beaver
					$i == (count($evaledvar)-1)) {
539 f8ac4407 Phil Davis
					$colcount = count($pkg['adddeleteeditpagefields']['columnitem']);
540
					$final_footer = "";
541
					$final_footer .= "<tr><td colspan='$colcount'>";
542 6c07db48 Phil Davis
					$final_footer .= "<table width='100%' summary=''><tr>";
543 79563cb6 Colin Fleming
					$final_footer .= "<td class='text-left'>";
544 f8ac4407 Phil Davis
					$startingat = $startdisplayingat - $display_maximum_rows;
545
					if ($startingat > -1) {
546 6c07db48 Phil Davis
						$final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat={$startingat}&amp;display_maximum_rows={$display_maximum_rows}'>";
547 f8ac4407 Phil Davis
					} else if ($startdisplayingat > 1) {
548 6c07db48 Phil Davis
						$final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat=0&amp;display_maximum_rows={$display_maximum_rows}'>";
549 32c477c5 Scott Ullrich
					}
550 cadeb9fd Phil Davis
					$final_footer .= "<font size='2'><< " . gettext("Previous page") . "</font></a>";
551 f8ac4407 Phil Davis
					if ($tmppp + $display_maximum_rows > count($evaledvar)) {
552
						$endingrecord = count($evaledvar);
553
					} else {
554
						$endingrecord = $tmppp + $display_maximum_rows;
555
					}
556 79563cb6 Colin Fleming
					$final_footer .= "</td><td class='text-center'>";
557 f8ac4407 Phil Davis
					$tmppp++;
558 6c07db48 Phil Davis
					$final_footer .= "<font size='2'>Displaying {$tmppp} - {$endingrecord} / " . count($evaledvar) . " records";
559 79563cb6 Colin Fleming
					$final_footer .= "</font></td><td class='text-right'>&nbsp;";
560 f8ac4407 Phil Davis
					if (($i+1) < count($evaledvar)) {
561 6c07db48 Phil Davis
						$final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat=" . ($startdisplayingat + $display_maximum_rows) . "&amp;display_maximum_rows={$display_maximum_rows}'>";
562 f8ac4407 Phil Davis
					}
563 cadeb9fd Phil Davis
					$final_footer .= "<font size='2'>" . gettext("Next page") . " >></font></a>";
564 6c07db48 Phil Davis
					$final_footer .= "</td></tr></table></td></tr>";
565 f8ac4407 Phil Davis
					$i = count($evaledvar);
566
					break;
567 549912e3 Scott Ullrich
				}
568 f8ac4407 Phil Davis
			}
569
			$i++;
570
			$pagination_counter++;
571
		} // foreach evaledvar
572
	} // if evaledvar
573 32c477c5 Scott Ullrich
?>
574
				<tr>
575
					<td colspan="<?=$cols?>"></td>
576
					<td>
577 44507df4 Colin Fleming
						<table border="0" cellspacing="0" cellpadding="1" summary="icons">
578 32c477c5 Scott Ullrich
							<tr>
579 f8ac4407 Phil Davis
<?php
580
	#Show custom description to add button if defined
581 cadeb9fd Phil Davis
	$add_msg=($pkg['adddeleteeditpagefields']['addtext']?$pkg['adddeleteeditpagefields']['addtext']:gettext("Add a new item"));
582 f8ac4407 Phil Davis
?>
583 e0cb987c Marcos Mendoza
								<td><a href="pkg_edit.php?xml=<?=$xml?>&amp;id=<?=$i?>" class="btn btn-sm btn-success" title="<?=$add_msg?>"><i class="fa-solid fa-plus icon-embed-btn"></i><?=gettext('Add')?></a></td>
584 f8ac4407 Phil Davis
<?php
585
	#Show description button and info if defined
586
	if ($pkg['adddeleteeditpagefields']['description']) {
587
?>
588 995df6c3 Stephen Beaver
								<td>
589 e0cb987c Marcos Mendoza
									<i class="fa-solid fa-info-circle"><?=$pkg['adddeleteeditpagefields']['description']?></i>
590 995df6c3 Stephen Beaver
								</td>
591 f8ac4407 Phil Davis
<?php
592
	}
593
?>
594 32c477c5 Scott Ullrich
							</tr>
595
						</table>
596
					</td>
597
				</tr>
598 37da0c50 Scott Ullrich
				<?=$final_footer?>
599 f8ac4407 Phil Davis
			</table>
600 c24bb3fc Stephen Beaver
			</div>
601 e0cb987c Marcos Mendoza
		<button class="btn btn-primary" type="button" value="Save" name="Submit" onclick="save_changes_to_xml('<?=$xml?>')"><i class="fa-solid fa-save icon-embed-btn"></i><?=gettext("Save")?></button>
602 3d335c4d Scott Ullrich
603 a7f908db Scott Ullrich
</form>
604 b000f96f Scott Ullrich
<?php
605 f5dbca0d Stephen Beaver
include("foot.inc"); ?>