Project

General

Profile

Download (19.1 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/* $Id$ */
3
/*
4
	pkg.php
5
/*
6
/* ====================================================================
7
 *	Copyright (c)  2004-2015  Electric Sheep Fencing, LLC. All rights reserved.
8
 *	Copyright (c)  2004, 2005 Scott Ullrich
9
 *
10
 *	Redistribution and use in source and binary forms, with or without modification,
11
 *	are permitted provided that the following conditions are met:
12
 *
13
 *	1. Redistributions of source code must retain the above copyright notice,
14
 *		this list of conditions and the following disclaimer.
15
 *
16
 *	2. Redistributions in binary form must reproduce the above copyright
17
 *		notice, this list of conditions and the following disclaimer in
18
 *		the documentation and/or other materials provided with the
19
 *		distribution.
20
 *
21
 *	3. All advertising materials mentioning features or use of this software
22
 *		must display the following acknowledgment:
23
 *		"This product includes software developed by the pfSense Project
24
 *		 for use in the pfSense software distribution. (http://www.pfsense.org/).
25
 *
26
 *	4. The names "pfSense" and "pfSense Project" must not be used to
27
 *		 endorse or promote products derived from this software without
28
 *		 prior written permission. For written permission, please contact
29
 *		 coreteam@pfsense.org.
30
 *
31
 *	5. Products derived from this software may not be called "pfSense"
32
 *		nor may "pfSense" appear in their names without prior written
33
 *		permission of the Electric Sheep Fencing, LLC.
34
 *
35
 *	6. Redistributions of any form whatsoever must retain the following
36
 *		acknowledgment:
37
 *
38
 *	"This product includes software developed by the pfSense Project
39
 *	for use in the pfSense software distribution (http://www.pfsense.org/).
40
 *
41
 *	THIS SOFTWARE IS PROVIDED BY THE pfSense PROJECT ``AS IS'' AND ANY
42
 *	EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
 *	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
44
 *	PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE pfSense PROJECT OR
45
 *	ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46
 *	SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
47
 *	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
48
 *	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49
 *	HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
50
 *	STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
51
 *	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
52
 *	OF THE POSSIBILITY OF SUCH DAMAGE.
53
 *
54
 *	====================================================================
55
 *
56
 */
57
/*
58
	pfSense_MODULE: pkgs
59
*/
60

    
61
##|+PRIV
62
##|*IDENT=page-package-settings
63
##|*NAME=Package: Settings page
64
##|*DESCR=Allow access to the 'Package: Settings' page.
65
##|*MATCH=pkg.php*
66
##|-PRIV
67

    
68
require_once("guiconfig.inc");
69
require_once("pkg-utils.inc");
70

    
71
function gentitle_pkg($pgname) {
72
	global $config;
73
	return $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pgname;
74
}
75

    
76
$xml = $_REQUEST['xml'];
77

    
78
if ($xml == "") {
79
	include("head.inc");
80
	print_info_box_np(gettext("ERROR: No valid package defined."));
81
	include("foot.inc");
82
	exit;
83
} else {
84
	if (file_exists("/usr/local/pkg/" . $xml)) {
85
		$pkg = parse_xml_config_pkg("/usr/local/pkg/" . $xml, "packagegui");
86
	} else {
87
		include("head.inc");
88
		print_info_box_np(gettext("File not found ") . htmlspecialchars($xml));
89
		include("foot.inc");
90
		exit;
91
	}
92
}
93

    
94
if ($pkg['donotsave'] != "") {
95
	header("Location: pkg_edit.php?xml=" . $xml);
96
	exit;
97
}
98

    
99
if ($pkg['include_file'] != "") {
100
	require_once($pkg['include_file']);
101
}
102

    
103
if ($_REQUEST['startdisplayingat']) {
104
	$startdisplayingat = $_REQUEST['startdisplayingat'];
105
}
106

    
107
if ($_REQUEST['display_maximum_rows']) {
108
	if ($_REQUEST['display_maximum_rows']) {
109
		$display_maximum_rows = $_REQUEST['display_maximum_rows'];
110
	}
111
}
112

    
113
$evaledvar = $config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
114

    
115
if ($_GET['act'] == "update") {
116

    
117
	if (is_array($config['installedpackages'][$pkg['name']]) && $pkg['name'] != "" && $_REQUEST['ids'] !="") {
118
		#get current values
119
		$current_values=$config['installedpackages'][$pkg['name']]['config'];
120
		#get updated ids
121
		parse_str($_REQUEST['ids'], $update_list);
122
		#sort ids to know what to change
123
		#useful to do not lose data when using sorting and paging
124
		$sort_list=$update_list['ids'];
125
		sort($sort_list);
126
		#apply updates
127
		foreach ($update_list['ids'] as $key=> $value) {
128
			$config['installedpackages'][$pkg['name']]['config'][$sort_list[$key]]=$current_values[$update_list['ids'][$key]];
129
		}
130
		#save current config
131
		write_config();
132
		#sync package
133
		eval ("{$pkg['custom_php_resync_config_command']}");
134
	}
135
	#function called via jquery, no need to continue after save changes.
136
	exit;
137
}
138
if ($_GET['act'] == "del") {
139
	// loop through our fieldnames and automatically setup the fieldnames
140
	// in the environment.	ie: a fieldname of username with a value of
141
	// testuser would automatically eval $username = "testuser";
142
	foreach ($evaledvar as $ip) {
143
		if ($pkg['adddeleteeditpagefields']['columnitem']) {
144
			foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
145
				${xml_safe_fieldname($column['fielddescr'])} = $ip[xml_safe_fieldname($column['fieldname'])];
146
			}
147
		}
148
	}
149

    
150
	$a_pkg = &$config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
151

    
152
	if ($a_pkg[$_GET['id']]) {
153
		unset($a_pkg[$_GET['id']]);
154
		write_config();
155
		if ($pkg['custom_delete_php_command'] != "") {
156
			if ($pkg['custom_php_command_before_form'] != "") {
157
				eval($pkg['custom_php_command_before_form']);
158
			}
159
			eval($pkg['custom_delete_php_command']);
160
		}
161
		header("Location:  pkg.php?xml=" . $xml);
162
		exit;
163
	}
164
}
165

    
166
ob_start();
167

    
168
$iflist = get_configured_interface_with_descr(false, true);
169
$evaledvar = $config['installedpackages'][xml_safe_fieldname($pkg['name'])]['config'];
170

    
171
if ($pkg['custom_php_global_functions'] != "") {
172
	eval($pkg['custom_php_global_functions']);
173
}
174

    
175
if ($pkg['custom_php_command_before_form'] != "") {
176
	eval($pkg['custom_php_command_before_form']);
177
}
178

    
179
$pgtitle = array($pkg['title']);
180
include("head.inc");
181

    
182
?>
183

    
184
<script type="text/javascript">
185
//<![CDATA[
186
events.push(function(){
187
	function setFilter(filtertext) {
188
		jQuery('#pkg_filter').val(filtertext);
189
		document.pkgform.submit();
190
	}
191

    
192
	<?php
193
		if ($pkg['adddeleteeditpagefields']['movable']) {
194
	?>
195
			jQuery(document).ready(function() {
196
				jQuery('#mainarea table tbody').sortable({
197
					items: 'tr.sortable',
198
					cursor: 'move',
199
					distance: 10,
200
					opacity: 0.8,
201
					helper: function(e, ui) {
202
						ui.children().each(function() {
203
							jQuery(this).width(jQuery(this).width());
204
						});
205
					return ui;
206
					},
207
				});
208
			});
209
			function save_changes_to_xml(xml) {
210
				var ids=jQuery('#mainarea table tbody').sortable('serialize', {key:"ids[]"});
211
				var strloading="<img src='/themes/<?= $g['theme']; ?>/images/misc/loader.gif' alt='loader' /> " + "<?=gettext('Saving changes...')?>";
212
				if (confirm("<?=gettext("Do you really want to save changes?")?>")) {
213
					jQuery.ajax({
214
						type: 'get',
215
						cache: false,
216
						url: "<?=$_SERVER['SCRIPT_NAME']?>",
217
						data: {xml:'<?=$xml?>', act:'update', ids: ids},
218
						beforeSend: function() {
219
							jQuery('#savemsg').empty().html(strloading);
220
						},
221
						error: function(data) {
222
							jQuery('#savemsg').empty().html('Error:' + data);
223
						},
224
						success: function(data) {
225
							jQuery('#savemsg').empty().html(data);
226
						}
227
					});
228
				}
229
			}
230
	<?php
231
		}
232
	?>
233
});
234
//]]>
235
</script>
236

    
237
<?php
238
if ($_GET['savemsg'] != "")
239
	$savemsg = htmlspecialchars($_GET['savemsg']);
240

    
241
if ($savemsg)
242
	print_info_box($savemsg, 'success');
243
?>
244

    
245
<form action="pkg.php" name="pkgform" method="get">
246
	<input type='hidden' name='xml' value='<?=$_REQUEST['xml']?>' />
247
<?php
248
	if ($pkg['tabs'] != "") {
249
		$tab_array = array();
250
		foreach ($pkg['tabs']['tab'] as $tab) {
251
			if ($tab['tab_level']) {
252
				$tab_level = $tab['tab_level'];
253
			} else {
254
				$tab_level = 1;
255
			}
256
			if (isset($tab['active'])) {
257
				$active = true;
258
			} else {
259
				$active = false;
260
			}
261
			if (isset($tab['no_drop_down'])) {
262
				$no_drop_down = true;
263
			}
264
			$urltmp = "";
265
			if ($tab['url'] != "") {
266
				$urltmp = $tab['url'];
267
			}
268
			if ($tab['xml'] != "") {
269
				$urltmp = "pkg_edit.php?xml=" . $tab['xml'];
270
			}
271

    
272
			$addresswithport = getenv("HTTP_HOST");
273
			$colonpos = strpos($addresswithport, ":");
274
			if ($colonpos !== False) {
275
				//my url is actually just the IP address of the pfsense box
276
				$myurl = substr($addresswithport, 0, $colonpos);
277
			} else {
278
				$myurl = $addresswithport;
279
			}
280
			// eval url so that above $myurl item can be processed if need be.
281
			$url = str_replace('$myurl', $myurl, $urltmp);
282

    
283
			$tab_array[$tab_level][] = array(
284
				$tab['text'],
285
				$active,
286
				$url
287
			);
288
		}
289

    
290
		ksort($tab_array);
291
		foreach ($tab_array as $tab) {
292
			display_top_tabs($tab, $no_drop_down);
293
		}
294
	}
295
?>
296

    
297
			<table class="table table-striped table-hover table-condensed">
298
<?php
299
	/* Handle filtering bar A-Z */
300
	$include_filtering_inputbox = false;
301
	$colspan = 0;
302
	if ($pkg['adddeleteeditpagefields']['columnitem'] != "") {
303
		foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
304
			$colspan++;
305
		}
306
	}
307
	if ($pkg['fields']['field']) {
308
		// First find the sorting type field if it exists
309
		foreach ($pkg['fields']['field'] as $field) {
310
			if ($field['type'] == "sorting") {
311
				if (isset($field['include_filtering_inputbox'])) {
312
					$include_filtering_inputbox = true;
313
				}
314
				if ($display_maximum_rows < 1) {
315
					if ($field['display_maximum_rows']) {
316
						$display_maximum_rows = $field['display_maximum_rows'];
317
					}
318
				}
319
				echo "<tr><td colspan='$colspan' align='center'>";
320
				echo "Filter by: ";
321
				$isfirst = true;
322
				for ($char = 65; $char < 91; $char++) {
323
					if (!$isfirst) {
324
						echo " | ";
325
					}
326
					echo "<a href=\"#\" onclick=\"setFilter('" . chr($char) . "');\">" . chr($char) . "</a>";
327
					$isfirst = false;
328
				}
329
				echo "</td></tr>";
330
				echo "<tr><td colspan='$colspan' align='center'>";
331
				if ($field['sortablefields']) {
332
					echo "Filter field: <select name='pkg_filter_type'>";
333
					foreach ($field['sortablefields']['item'] as $si) {
334
						if ($si['name'] == $_REQUEST['pkg_filter_type']) {
335
							$SELECTED = "selected=\"selected\"";
336
						} else {
337
							$SELECTED = "";
338
						}
339
						echo "<option value='{$si['name']}' {$SELECTED}>{$si['name']}</option>";
340
					}
341
					echo "</select>";
342
				}
343
				if ($include_filtering_inputbox) {
344
					echo "&nbsp;&nbsp;Filter text: <input id='pkg_filter' name='pkg_filter' value='" . $_REQUEST['pkg_filter'] . "' /><input type='submit' value='Filter' />";
345
				}
346
				echo "</td></tr><tr><td><font size='-3'>&nbsp;</font></td></tr>";
347
			}
348
		}
349
	}
350
?>
351
				<tr>
352
<?php
353
	if ($display_maximum_rows) {
354
		$totalpages = ceil(round((count($evaledvar) / $display_maximum_rows), 9));
355
		$page = 1;
356
		$tmpcount = 0;
357
		$tmppp = 0;
358
		if (is_array($evaledvar)) {
359
			foreach ($evaledvar as $ipa) {
360
				if ($tmpcount == $display_maximum_rows) {
361
					$page++;
362
					$tmpcount = 0;
363
				}
364
				if ($tmppp == $startdisplayingat) {
365
					break;
366
				}
367
				$tmpcount++;
368
				$tmppp++;
369
			}
370
		}
371
		echo "<tr><td colspan='" . count($pkg['adddeleteeditpagefields']['columnitem']) . "'>";
372
		echo "<table width='100%' summary=''>";
373
		echo "<tr>";
374
		echo "<td align='left'>Displaying page $page of $totalpages</b></td>";
375
		echo "<td align='right'>Rows per page: <select onchange='document.pkgform.submit();' name='display_maximum_rows'>";
376
		for ($x = 0; $x < 250; $x++) {
377
			if ($x == $display_maximum_rows) {
378
				$SELECTED = "selected=\"selected\"";
379
			} else {
380
				$SELECTED = "";
381
			}
382
			echo "<option value='$x' $SELECTED>$x</option>\n";
383
			$x = $x + 4;
384
		}
385
		echo "</select></td></tr>";
386
		echo "</table>";
387
		echo "</td></tr>";
388
	}
389
	$cols = 0;
390
	if ($pkg['adddeleteeditpagefields']['columnitem'] != "") {
391
		foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
392
			echo "<td class=\"listhdrr\">" . $column['fielddescr'] . "</td>";
393
			$cols++;
394
		}
395
	}
396
?>
397
				</tr>
398
<?php
399
	$i = 0;
400
	$pagination_counter = 0;
401
	if ($evaledvar) {
402
		foreach ($evaledvar as $ip) {
403
			if ($startdisplayingat) {
404
				if ($i < $startdisplayingat) {
405
					$i++;
406
					continue;
407
				}
408
			}
409
			if ($_REQUEST['pkg_filter']) {
410
				// Handle filtered items
411
				if ($pkg['fields']['field'] && !$filter_regex) {
412
					// First find the sorting type field if it exists
413
					foreach ($pkg['fields']['field'] as $field) {
414
						if ($field['type'] == "sorting") {
415
							if ($field['sortablefields']['item']) {
416
								foreach ($field['sortablefields']['item'] as $sf) {
417
									if ($sf['name'] == $_REQUEST['pkg_filter_type']) {
418
										$filter_fieldname = $sf['fieldname'];
419
										#Use a default regex on sortable fields when none is declared
420
										if ($sf['regex']) {
421
											$filter_regex = str_replace("%FILTERTEXT%", $_REQUEST['pkg_filter'], trim($sf['regex']));
422
										} else {
423
											$filter_regex = "/{$_REQUEST['pkg_filter']}/i";
424
										}
425
									}
426
								}
427
							}
428
						}
429
					}
430
				}
431
				// Do we have something to filter on?
432
				unset($filter_matches);
433
				if ($pkg['adddeleteeditpagefields']['columnitem'] != "") {
434
					foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
435
						$fieldname = $ip[xml_safe_fieldname($column['fieldname'])];
436
						if ($column['fieldname'] == $filter_fieldname) {
437
							if ($filter_regex) {
438
								//echo "$filter_regex - $fieldname<p/>";
439
								preg_match($filter_regex, $fieldname, $filter_matches);
440
								break;
441
							}
442
						}
443
					}
444
				}
445
				if (!$filter_matches) {
446
					$i++;
447
					continue;
448
				}
449
			}
450
			if ($pkg['adddeleteeditpagefields']['movable']) {
451
				echo "<tr valign=\"top\" class=\"sortable\" id=\"id_{$i}\">\n";
452
			} else {
453
				echo "<tr valign=\"top\">\n";
454
			}
455
			if ($pkg['adddeleteeditpagefields']['columnitem'] != "") {
456
				foreach ($pkg['adddeleteeditpagefields']['columnitem'] as $column) {
457
					if ($column['fieldname'] == "description") {
458
						$class = "listbg";
459
					} else {
460
						$class = "listlr";
461
					}
462
?>
463
					<td class="<?=$class?>" ondblclick="document.location='pkg_edit.php?xml=<?=$xml?>&amp;act=edit&amp;id=<?=$i?>';">
464
<?php
465
					$fieldname = $ip[xml_safe_fieldname($column['fieldname'])];
466
					#Check if columnitem has a type field declared
467
					if ($column['type'] == "checkbox") {
468
						if ($fieldname == "") {
469
							echo gettext("No");
470
						} else {
471
							echo gettext("Yes");
472
						}
473
					} else if ($column['type'] == "interface") {
474
						echo $column['prefix'] . $iflist[$fieldname] . $column['suffix'];
475
					} else {
476
						#Check if columnitem has an encoding field declared
477
						if ($column['encoding'] == "base64") {
478
							echo $column['prefix'] . base64_decode($fieldname) . $column['suffix'];
479
						#Check if there is a custom info to show when $fieldname is not empty
480
						} else if ($column['listmodeon'] && $fieldname != "") {
481
							echo $column['prefix'] . gettext($column['listmodeon']). $column['suffix'];
482
						#Check if there is a custom info to show when $fieldname is empty
483
						} else if ($column['listmodeoff'] && $fieldname == "") {
484
							echo $column['prefix'] .gettext($column['listmodeoff']). $column['suffix'];
485
						} else {
486
							echo $column['prefix'] . $fieldname ." ". $column['suffix'];
487
						}
488
					}
489
?>
490
					</td>
491
<?php
492
				} // foreach columnitem
493
			} // if columnitem
494
?>
495
					<td valign="middle" class="list nowrap">
496
						<table border="0" cellspacing="0" cellpadding="1" summary="icons">
497
							<tr>
498
<?php
499
			#Show custom description to edit button if defined
500
			$edit_msg=($pkg['adddeleteeditpagefields']['edittext']?$pkg['adddeleteeditpagefields']['edittext']:"Edit this item");
501
?>
502
								<td valign="middle"><a href="pkg_edit.php?xml=<?=$xml?>&amp;act=edit&amp;id=<?=$i?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" <?=domTT_title($edit_msg)?> alt="edit" /></a></td>
503
<?php
504
			#Show custom description to delete button if defined
505
			$delete_msg=($pkg['adddeleteeditpagefields']['deletetext']?$pkg['adddeleteeditpagefields']['deletetext']:"Delete this item");
506
?>
507
								<td valign="middle"><a href="pkg.php?xml=<?=$xml?>&amp;act=del&amp;id=<?=$i?>" onclick="return confirm('<?=gettext("Do you really want to delete this item?")?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" <?=domTT_title($delete_msg)?> alt="delete" /></a></td>
508
							</tr>
509
						</table>
510
					</td>
511
<?php
512
			echo "</tr>\n"; // Pairs with an echo tr some way above
513
			// Handle pagination and display_maximum_rows
514
			if ($display_maximum_rows) {
515
				if ($pagination_counter == ($display_maximum_rows-1) or
516
					$i == (count($evaledvar)-1)) {
517
					$colcount = count($pkg['adddeleteeditpagefields']['columnitem']);
518
					$final_footer = "";
519
					$final_footer .= "<tr><td colspan='$colcount'>";
520
					$final_footer .= "<table width='100%' summary=''><tr>";
521
					$final_footer .= "<td align='left'>";
522
					$startingat = $startdisplayingat - $display_maximum_rows;
523
					if ($startingat > -1) {
524
						$final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat={$startingat}&amp;display_maximum_rows={$display_maximum_rows}'>";
525
					} else if ($startdisplayingat > 1) {
526
						$final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat=0&amp;display_maximum_rows={$display_maximum_rows}'>";
527
					}
528
					$final_footer .= "<font size='2'><< Previous page</font></a>";
529
					if ($tmppp + $display_maximum_rows > count($evaledvar)) {
530
						$endingrecord = count($evaledvar);
531
					} else {
532
						$endingrecord = $tmppp + $display_maximum_rows;
533
					}
534
					$final_footer .= "</td><td align='center'>";
535
					$tmppp++;
536
					$final_footer .= "<font size='2'>Displaying {$tmppp} - {$endingrecord} / " . count($evaledvar) . " records";
537
					$final_footer .= "</font></td><td align='right'>&nbsp;";
538
					if (($i+1) < count($evaledvar)) {
539
						$final_footer .= "<a href='pkg.php?xml=" . $_REQUEST['xml'] . "&amp;startdisplayingat=" . ($startdisplayingat + $display_maximum_rows) . "&amp;display_maximum_rows={$display_maximum_rows}'>";
540
					}
541
					$final_footer .= "<font size='2'>Next page >></font></a>";
542
					$final_footer .= "</td></tr></table></td></tr>";
543
					$i = count($evaledvar);
544
					break;
545
				}
546
			}
547
			$i++;
548
			$pagination_counter++;
549
		} // foreach evaledvar
550
	} // if evaledvar
551
?>
552
				<tr>
553
					<td colspan="<?=$cols?>"></td>
554
					<td>
555
						<table border="0" cellspacing="0" cellpadding="1" summary="icons">
556
							<tr>
557
<?php
558
	#Show custom description to add button if defined
559
	$add_msg=($pkg['adddeleteeditpagefields']['addtext']?$pkg['adddeleteeditpagefields']['addtext']:"Add a new item");
560
?>
561
								<td valign="middle"><a href="pkg_edit.php?xml=<?=$xml?>&amp;id=<?=$i?>" class="btn btn-xs btn-success"><?=gettext('Add')?></a></td>
562
<?php
563
	#Show description button and info if defined
564
	if ($pkg['adddeleteeditpagefields']['description']) {
565
?>
566
								<td valign="middle"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_info_pkg.gif" <?=domTT_title($pkg['adddeleteeditpagefields']['description'])?> alt="info" /></td>
567
<?php
568
	}
569
?>
570
							</tr>
571
						</table>
572
					</td>
573
				</tr>
574
				<?=$final_footer?>
575
<?php
576
	#Show save button only when movable is defined
577
	if ($pkg['adddeleteeditpagefields']['movable']) {
578
?>
579
				<tr>
580
					<td><input class="btn btn-primary" type="button" value="Save" name="Submit" onclick="save_changes_to_xml('<?=$xml?>')" /></td>
581
				</tr>
582
<?php
583
	}
584
?>
585
			</table>
586

    
587
</form>
588
<?php
589
echo "<!-- filter_fieldname: {$filter_fieldname} -->";
590
echo "<!-- filter_regex: {$filter_regex} -->";
591

    
592
include("foot.inc"); ?>
(113-113/235)