public function init_admin()
 {
     parent::init_admin();
     add_action('gform_entry_detail_sidebar_before', array($this, 'entry_detail_approval_box'), 10, 2);
     add_filter('gform_notification_events', array($this, 'add_notification_event'));
     add_filter('gform_entries_field_value', array($this, 'filter_gform_entries_field_value'), 10, 4);
     if (GFAPI::current_user_can_any('gravityforms_edit_entries')) {
         add_action('wp_dashboard_setup', array($this, 'dashboard_setup'));
     }
 }
    public static function display($args)
    {
        $defaults = array('check_permissions' => true, 'detail_base_url' => admin_url('admin.php?page=gravityflow-inbox&view=entry'));
        $args = array_merge($defaults, $args);
        if ($args['check_permissions'] && !GFAPI::current_user_can_any('gravityflow_activity')) {
            esc_html_e("You don't have permission to view this page", 'gravityflow');
            return;
        }
        $events = Gravity_Flow_Activity::get_events();
        if (sizeof($events) > 0) {
            ?>

			<table id="gravityflow-activity" class="widefat" cellspacing="0" style="border:0px;">
				<thead>
				<tr>
					<th data-label="<?php 
            esc_html_e('Event ID', 'gravityflow');
            ?>
"><?php 
            esc_html_e('Event ID', 'gravityflow');
            ?>
</th>
					<th><?php 
            esc_html_e('Date', 'gravityflow');
            ?>
</th>
					<th><?php 
            esc_html_e('Form', 'gravityflow');
            ?>
</th>
					<th><?php 
            esc_html_e('Entry ID', 'gravityflow');
            ?>
</th>
					<th><?php 
            esc_html_e('Type', 'gravityflow');
            ?>
</th>
					<th><?php 
            esc_html_e('Event', 'gravityflow');
            ?>
</th>
					<th><?php 
            esc_html_e('Step', 'gravityflow');
            ?>
</th>
					<th><?php 
            esc_html_e('Duration', 'gravityflow');
            ?>
</th>
				</tr>
				</thead>

				<tbody class="list:user user-list">
				<?php 
            foreach ($events as $event) {
                $form = GFAPI::get_form($event->form_id);
                $base_url = $args['detail_base_url'];
                $url_entry = $base_url . sprintf('&id=%d&lid=%d', $event->form_id, $event->lead_id);
                $url_entry = esc_url_raw($url_entry);
                $link = "<a href='%s'>%s</a>";
                ?>
					<tr>
						<td data-label="<?php 
                esc_html_e('ID', 'gravityflow');
                ?>
">
							<?php 
                echo esc_html($event->id);
                ?>
						</td>
						<td data-label="<?php 
                esc_html_e('Date', 'gravityflow');
                ?>
">
							<?php 
                echo esc_html(GFCommon::format_date($event->date_created));
                ?>
						</td>
						<td data-label="<?php 
                esc_html_e('Form', 'gravityflow');
                ?>
">
							<?php 
                printf($link, $url_entry, $form['title']);
                ?>
						</td>
						<td data-label="<?php 
                esc_html_e('Entry ID', 'gravityflow');
                ?>
">
							<?php 
                printf($link, $url_entry, $event->lead_id);
                ?>
						</td>
						<td data-label="<?php 
                esc_html_e('Type', 'gravityflow');
                ?>
">
							<?php 
                echo esc_html($event->log_object);
                ?>
						</td>
						<td data-label="<?php 
                esc_html_e('Event', 'gravityflow');
                ?>
">
							<?php 
                switch ($event->log_object) {
                    case 'workflow':
                        echo $event->log_event;
                        break;
                    case 'step':
                        echo esc_html($event->log_event);
                        break;
                    case 'assignee':
                        echo esc_html($event->display_name) . ' <i class="fa fa-arrow-right"></i> ' . esc_html($event->log_value);
                        break;
                    default:
                        echo esc_html($event->log_value);
                }
                ?>
						</td>
						<td data-label="<?php 
                esc_html_e('Step', 'gravityflow');
                ?>
">
							<?php 
                if ($event->feed_id) {
                    $step = gravity_flow()->get_step($event->feed_id);
                    if ($step) {
                        $step_name = $step->get_name();
                        echo esc_html($step_name);
                    }
                }
                ?>
						</td>
						<td data-label="<?php 
                esc_html_e('Event', 'gravityflow');
                ?>
">
							<?php 
                if (!empty($event->duration)) {
                    echo self::format_duration($event->duration);
                }
                ?>
						</td>

					</tr>
				<?php 
            }
            ?>
				</tbody>
			</table>

		<?php 
        } else {
            ?>
				<div id="gravityflow-no-activity-container">

					<div id="gravityflow-no-activity-content">
						<i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i>
						<br /><br />
						<?php 
            esc_html_e('Waiting for workflow activity', 'gravityflow');
            ?>
					</div>

				</div>
			<?php 
        }
    }
Esempio n. 3
0
 function __construct($args = array())
 {
     $default_bulk_actions = array('print' => esc_html__('Print', 'gravityflow'));
     if (GFAPI::current_user_can_any('gravityflow_admin_actions')) {
         $default_bulk_actions['restart_workflow'] = esc_html__('Restart Workflow', 'gravityflow');
     }
     $default_args = array('singular' => __('entry', 'gravityflow'), 'plural' => __('entries', 'gravityflow'), 'ajax' => false, 'base_url' => admin_url('admin.php?page=gravityflow-status'), 'detail_base_url' => admin_url('admin.php?page=gravityflow-inbox&view=entry'), 'constraint_filters' => array(), 'field_ids' => array(), 'screen' => 'gravityflow-status', 'display_all' => GFAPI::current_user_can_any('gravityflow_status_view_all'), 'bulk_actions' => $default_bulk_actions, 'per_page' => 20, 'id_column' => true, 'submitter_column' => true, 'step_column' => true, 'status_column' => true, 'last_updated' => false);
     $args = wp_parse_args($args, $default_args);
     require_once ABSPATH . 'wp-admin/includes/template.php';
     if (!class_exists('WP_Screen')) {
         require_once ABSPATH . 'wp-admin/includes/class-wp-screen.php';
     }
     parent::__construct($args);
     $this->base_url = $args['base_url'];
     $this->detail_base_url = $args['detail_base_url'];
     $this->constraint_filters = $args['constraint_filters'];
     if (!is_array($args['field_ids'])) {
         $args['field_ids'] = explode(',', $args['field_ids']);
     }
     $this->field_ids = $args['field_ids'];
     $this->display_all = $args['display_all'];
     $this->bulk_actions = $args['bulk_actions'];
     $this->set_counts();
     $this->per_page = $args['per_page'];
     $this->id_column = $args['id_column'];
     $this->step_column = $args['step_column'];
     $this->submitter_column = $args['submitter_column'];
     $this->status_column = $args['status_column'];
     $this->last_updated = $args['last_updated'];
 }
Esempio n. 4
0
    public static function display($args)
    {
        $assignee_key = sanitize_text_field(rgget('assignee'));
        list($assignee_type, $assignee_id) = rgexplode('|', $assignee_key, 2);
        $range = sanitize_key(rgget('range'));
        switch ($range) {
            case 'last-6-months':
                $start_date = date('Y-m-d', strtotime('-6 months'));
                break;
            case 'last-3-months':
                $start_date = date('Y-m-d', strtotime('-3 months'));
                break;
            default:
                $start_date = date('Y-m-d', strtotime('-1 year'));
        }
        $defaults = array('view' => rgget('view'), 'form_id' => absint(rgget('form-id')), 'step_id' => absint(rgget('step-id')), 'category' => sanitize_key(rgget('category')), 'range' => $range, 'start_date' => $start_date, 'assignee' => $assignee_key, 'assignee_type' => $assignee_type, 'assignee_id' => $assignee_id, 'check_permissions' => true, 'base_url' => admin_url('admin.php?page=gravityflow-reports'));
        $args = array_merge($defaults, $args);
        if ($args['check_permissions'] && !GFAPI::current_user_can_any('gravityflow_reports')) {
            esc_html_e("You don't have permission to view this page", 'gravityflow');
            return;
        }
        $filter_vars['config'] = self::get_filter_config_vars();
        $filter_vars['selected'] = array('formId' => $args['form_id'], 'category' => $args['category'], 'stepId' => empty($args['step_id']) ? '' : $args['step_id'], 'assignee' => $args['assignee']);
        ?>
		<script>var gravityflowFilterVars = <?php 
        echo json_encode($filter_vars);
        ?>
;</script>

		<div id="gravityflow-reports-filter" style="margin-bottom:10px;">
		<form method="GET" action="<?php 
        echo esc_url($args['base_url']);
        ?>
">
			<input type="hidden" value="gravityflow-reports" name="page" />
			<?php 
        self::range_drop_down($args['range']);
        ?>
			<?php 
        self::form_drop_down($args['form_id']);
        ?>
			<?php 
        self::category_drop_down($args['category']);
        ?>
			<select id="gravityflow-reports-steps" style="display:none;" name="step-id"></select>
			<select id="gravityflow-reports-assignees" style="display:none;" name="assignee"></select>
			<input type="submit" value="<?php 
        esc_html_e('Filter', 'gravityflow');
        ?>
" class="button-secondary" />
		</form>
		</div>
		<?php 
        if (empty($args['form_id'])) {
            self::report_all_forms($args);
            return;
        }
        $form_id = $args['form_id'];
        if ($args['category'] == 'assignee') {
            if (empty($args['assignee_key'])) {
                self::report_form_by_assignee($form_id, $args);
            }
        } elseif ($args['category'] == 'step') {
            if (empty($args['step_id'])) {
                self::report_form_by_step($form_id, $args);
            } else {
                $step_id = $args['step_id'];
                if (empty($args['assignee_id'])) {
                    self::report_step_by_assignee($step_id, $args);
                } else {
                    $assignee_type = $args['assignee_type'];
                    $assignee_id = $args['assignee_id'];
                    self::report_assignee_by_month($assignee_type, $assignee_id, $args);
                }
            }
        } else {
            self::report_form_by_month($form_id, $args);
        }
    }
 public function ajax_download_export()
 {
     if (!wp_verify_nonce(rgget('nonce'), 'gravityflow_download_export') || !GFAPI::current_user_can_any('gravityflow_status')) {
         $response['status'] = 'error';
         $response['message'] = __('Not authorized', 'gravityflow');
         $response_json = json_encode($response);
         echo $response_json;
         die;
     }
     $file_name = $_REQUEST['file_name'];
     $upload_dir = wp_upload_dir();
     $file_path = trailingslashit($upload_dir['basedir']) . $file_name . '.csv';
     $file = '';
     if (@file_exists($file_path)) {
         $file = @file_get_contents($file_path);
         @unlink($file_path);
     }
     nocache_headers();
     header('Content-Type: text/csv; charset=utf-8');
     header('Content-Disposition: attachment; filename=' . $file_name . '-' . date('m-d-Y') . '.csv');
     header('Expires: 0');
     echo $file;
     die;
 }
    /**
     * @param $form
     * @param $entry
     * @param null|Gravity_Flow_Step $current_step
     * @param array $args
     */
    public static function entry_detail($form, $entry, $current_step = null, $args = array())
    {
        $form_id = absint($form['id']);
        $form = apply_filters('gform_pre_render', $form);
        $form = apply_filters('gform_pre_render_' . $form_id, $form);
        $defaults = array('display_empty_fields' => true, 'check_permissions' => true, 'show_header' => true, 'timeline' => true, 'display_instructions' => true);
        $args = array_merge($defaults, $args);
        $display_empty_fields = (bool) $args['display_empty_fields'];
        $check_view_entry_permissions = (bool) $args['check_permissions'];
        $show_header = (bool) $args['show_header'];
        $show_timeline = (bool) $args['timeline'];
        $display_instructions = (bool) $args['display_instructions'];
        ?>

		<script type="text/javascript">

			if ( typeof ajaxurl == 'undefined' ) {
				ajaxurl = <?php 
        echo json_encode(admin_url('admin-ajax.php'));
        ?>
;
			}

			function DeleteFile(leadId, fieldId, deleteButton) {
				if (confirm(<?php 
        echo json_encode(__("Would you like to delete this file? 'Cancel' to stop. 'OK' to delete", 'gravityflow'));
        ?>
)) {
					var fileIndex = jQuery(deleteButton).parent().index();
					var mysack = new sack("<?php 
        echo admin_url('admin-ajax.php');
        ?>
");
					mysack.execute = 1;
					mysack.method = 'POST';
					mysack.setVar("action", "rg_delete_file");
					mysack.setVar("rg_delete_file", "<?php 
        echo wp_create_nonce('rg_delete_file');
        ?>
");
					mysack.setVar("lead_id", leadId);
					mysack.setVar("field_id", fieldId);
					mysack.setVar("file_index", fileIndex);
					mysack.onError = function () {
						alert(<?php 
        echo json_encode(__('Ajax error while deleting file.', 'gravityflow'));
        ?>
)
					};
					mysack.runAJAX();

					return true;
				}
			}

			function EndDeleteFile(fieldId, fileIndex) {
				var previewFileSelector = "#preview_existing_files_" + fieldId + " .ginput_preview";
				var $previewFiles = jQuery(previewFileSelector);
				var rr = $previewFiles.eq(fileIndex);
				$previewFiles.eq(fileIndex).remove();
				var $visiblePreviewFields = jQuery(previewFileSelector);
				if ($visiblePreviewFields.length == 0) {
					jQuery('#preview_' + fieldId).hide();
					jQuery('#upload_' + fieldId).show('slow');
				}
			}

			function ToggleShowEmptyFields() {
				if (jQuery("#gentry_display_empty_fields").is(":checked")) {
					createCookie("gf_display_empty_fields", true, 10000);
					document.location = document.location.href;
				}
				else {
					eraseCookie("gf_display_empty_fields");
					document.location = document.location.href;
				}
			}

			function createCookie(name, value, days) {
				if (days) {
					var date = new Date();
					date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
					var expires = "; expires=" + date.toGMTString();
				}
				else var expires = "";
				document.cookie = name + "=" + value + expires + "; path=/";
			}

			function eraseCookie(name) {
				createCookie(name, "", -1);
			}


		</script>

		<div class="wrap gf_entry_wrap gravityflow_workflow_wrap gravityflow_workflow_detail">

			<?php 
        if ($show_header) {
            ?>
			<h2 class="gf_admin_page_title">
				<img width="45" height="22" src="<?php 
            echo gravity_flow()->get_base_url();
            ?>
/images/gravityflow-icon-blue-grad.svg" style="margin-right:5px;"/>
				<span><?php 
            echo esc_html__('Workflow Entry #', 'gravityflow') . absint($entry['id']);
            ?>
</span><span class="gf_admin_page_subtitle"><span class='gf_admin_page_formname'><?php 
            esc_html_e('Workflow Form', 'gravityflow');
            ?>
: <?php 
            esc_html_e($form['title']);
            ?>
</span></span>
			</h2>

			<div id="gf_form_toolbar">
				<ul id="gf_form_toolbar_links">

					<?php 
            $menu_items = gravity_flow()->get_toolbar_menu_items();
            echo GFForms::format_toolbar_menu_items($menu_items);
            ?>
				</ul>
			</div>

			<?php 
        }
        if ($check_view_entry_permissions) {
            // Check view permissions
            global $current_user;
            if ($entry['created_by'] != $current_user->ID) {
                $user_status = false;
                if ($current_step) {
                    $user_status = $current_step->get_user_status();
                    if (!$user_status) {
                        $user_roles = gravity_flow()->get_user_roles();
                        foreach ($user_roles as $user_role) {
                            $user_status = $current_step->get_role_status($user_role);
                        }
                    }
                }
                $full_access = GFAPI::current_user_can_any(array('gform_full_access', 'gravityflow_status_view_all'));
                if (!($user_status || $full_access)) {
                    $permission_denied_message = esc_attr__("You don't have permission to view this entry.", 'gravityflow');
                    $permission_denied_message = apply_filters('gravityflow_permission_denied_message_entry_detail', $permission_denied_message, $current_step);
                    echo $permission_denied_message;
                    return;
                }
            }
        }
        $url = remove_query_arg(array('gworkflow_token', 'new_status'));
        ?>
			<div class="gform_wrapper">
				<form method="post" id="entry_form" enctype='multipart/form-data' action="<?php 
        echo esc_url($url);
        ?>
">
					<?php 
        wp_nonce_field('gforms_save_entry', 'gforms_save_entry');
        ?>
					<div id="poststuff" class="metabox-holder has-right-sidebar">

						<div id="side-info-column" class="inner-sidebar">
							<?php 
        gravity_flow()->workflow_entry_detail_status_box($form, $entry, $current_step);
        if (is_user_logged_in() || $check_view_entry_permissions) {
            ?>

							<!-- begin print button -->
							<div class="detail-view-print">
								<a href="javascript:;"
								   onclick="var notes_qs = jQuery('#gform_print_notes').is(':checked') ? '&notes=1' : ''; var url='<?php 
            echo admin_url('admin-ajax.php');
            ?>
?action=gravityflow_print_entries&lid=<?php 
            echo absint($entry['id']);
            ?>
' + notes_qs; printPage(url);"
								   class="button"><?php 
            esc_html_e('Print', 'gravityflow');
            ?>
</a>

									<?php 
            if ($show_timeline) {
                ?>

									<input type="checkbox" name="print_notes" value="print_notes" checked="checked"
									       id="gform_print_notes"/>
									<label for="print_notes"><?php 
                esc_html_e('include timeline', 'gravityflow');
                ?>
</label>
									<?php 
            }
            ?>

							</div>
							<!-- end print button -->

							<?php 
        }
        ?>
						</div>

						<div id="post-body" class="has-sidebar">
							<div id="post-body-content" class="has-sidebar-content">
								<?php 
        do_action('gravityflow_entry_detail_content_before', $form, $entry);
        $editable_fields = array();
        if ($current_step) {
            $current_user_status = $current_step->get_user_status();
            $current_role_status = false;
            if ($current_step) {
                foreach (gravity_flow()->get_user_roles() as $role) {
                    $current_role_status = $current_step->get_role_status($role);
                    if ($current_role_status == 'pending') {
                        break;
                    }
                }
            }
            $can_update = $current_step && ($current_user_status == 'pending' || $current_role_status == 'pending');
            $editable_fields = $can_update ? $current_step->get_editable_fields() : array();
            if ($can_update && $display_instructions && $current_step->instructionsEnable) {
                $instructions = $current_step->instructionsValue;
                $instructions = GFCommon::replace_variables($instructions, $form, $entry, false, true, true);
                $instructions = $current_step->replace_variables($instructions, null);
                $instructions = wp_kses_post($instructions);
                ?>
										<div class="postbox">
											<div class="inside">
												<?php 
                echo $instructions;
                ?>
											</div>

										</div>

										<?php 
            }
        }
        self::entry_detail_grid($form, $entry, $display_empty_fields, $editable_fields, $current_step);
        do_action('gravityflow_entry_detail', $form, $entry);
        if ($show_timeline) {
            ?>
									<div class="postbox">
										<h3>
											<label for="name"><?php 
            esc_html_e('Timeline', 'gravityflow');
            ?>
</label>
										</h3>

										<div class="inside">
											<?php 
            self::timeline($entry, $form);
            ?>
										</div>

									</div>

								<?php 
        }
        ?>

							</div>
						</div>

					</div>

				</form>
			</div>
		</div>
		<?php 
    }
    public static function render()
    {
        $form_id = 0;
        $entries = rgget('lid');
        if (0 == $entries) {
            // get all the entry ids for the current filter / search
            $filter = rgget('filter');
            $search = rgget('search');
            $star = $filter == 'star' ? 1 : null;
            $read = $filter == 'unread' ? 0 : null;
            $status = in_array($filter, array('trash', 'spam')) ? $filter : 'active';
            $search_criteria['status'] = $status;
            if ($star) {
                $search_criteria['field_filters'][] = array('key' => 'is_starred', 'value' => (bool) $star);
            }
            if (!is_null($read)) {
                $search_criteria['field_filters'][] = array('key' => 'is_read', 'value' => (bool) $read);
            }
            $search_field_id = rgget('field_id');
            $search_operator = rgget('operator');
            if (isset($_GET['field_id']) && $_GET['field_id'] !== '') {
                $key = $search_field_id;
                $val = rgget('s');
                $strpos_row_key = strpos($search_field_id, '|');
                if ($strpos_row_key !== false) {
                    //multi-row
                    $key_array = explode('|', $search_field_id);
                    $key = $key_array[0];
                    $val = $key_array[1] . ':' . $val;
                }
                $search_criteria['field_filters'][] = array('key' => $key, 'operator' => rgempty('operator', $_GET) ? 'is' : rgget('operator'), 'value' => $val);
            }
            $entry_ids = GFFormsModel::search_lead_ids($form_id, $search_criteria);
        } else {
            $entry_ids = explode(',', $entries);
        }
        $page_break = rgget('page_break') ? 'print-page-break' : false;
        // sort lead IDs numerically
        sort($entry_ids);
        if (empty($entry_ids)) {
            die(esc_html__('Form Id and Lead Id are required parameters.', 'gravityflow'));
        }
        $min = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG || isset($_GET['gform_debug']) ? '' : '.min';
        ?>

		<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
			"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
		<head>
			<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
			<meta name="keywords" content="" />
			<meta name="description" content="" />
			<meta name="MSSmartTagsPreventParsing" content="true" />
			<meta name="Robots" content="noindex, nofollow" />
			<meta http-equiv="Imagetoolbar" content="No" />
			<title>
				<?php 
        $entry_count = count($entry_ids);
        $title = $entry_count > 1 ? esc_html__('Bulk Print', 'gravityflow') : esc_html__('Entry # ', 'gravityflow') . $entry_ids[0];
        $title = apply_filters('gravityflow_page_title_print_entry', $title, $entry_count);
        echo esc_html($title);
        ?>
			</title>
			<link rel='stylesheet' href='<?php 
        echo GFCommon::get_base_url();
        ?>
/css/print<?php 
        echo $min;
        ?>
.css' type='text/css' />
			<link rel='stylesheet' href='<?php 
        echo gravity_flow()->get_base_url();
        ?>
/css/entry-detail<?php 
        echo $min;
        ?>
.css' type='text/css' />
			<?php 
        $styles = apply_filters('gravityflow_print_styles', false);
        if (!empty($styles)) {
            wp_print_styles($styles);
        }
        ?>
		</head>
		<body>

		<div id="view-container">
			<?php 
        require_once GFCommon::get_base_path() . '/entry_detail.php';
        foreach ($entry_ids as $entry_id) {
            $entry = RGFormsModel::get_lead($entry_id);
            $form = GFAPI::get_form($entry['form_id']);
            do_action('gravityflow_print_entry_header', $form, $entry);
            // Separate each entry inside a form element so radio buttons don't get treated as a single group across multiple entries.
            echo '<form>';
            $gravity_flow = gravity_flow();
            $current_step = $gravity_flow->get_current_step($form, $entry);
            // Check view permissions
            global $current_user;
            if ($entry['created_by'] != $current_user->ID) {
                $user_status = false;
                if ($current_step) {
                    $user_status = $current_step->get_user_status();
                    gravity_flow()->log_debug(__METHOD__ . '() - user status = ' . $user_status);
                    if (!$user_status) {
                        $user_roles = gravity_flow()->get_user_roles();
                        foreach ($user_roles as $user_role) {
                            $user_status = $current_step->get_role_status($user_role);
                            if ($user_status) {
                                break;
                            }
                        }
                    }
                }
                $full_access = GFAPI::current_user_can_any(array('gform_full_access', 'gravityflow_status_view_all'));
                if (!($user_status || $full_access)) {
                    esc_attr_e("You don't have permission to view this entry.", 'gravityflow');
                    continue;
                }
            }
            require_once $gravity_flow->get_base_path() . '/includes/pages/class-entry-detail.php';
            Gravity_Flow_Entry_Detail::entry_detail_grid($form, $entry, false, array(), $current_step);
            echo '</form>';
            if (rgget('notes')) {
                Gravity_Flow_Entry_Detail::timeline($entry, $form);
            }
            // output entry divider/page break
            if (array_search($entry_id, $entry_ids) < count($entry_ids) - 1) {
                echo '<div class="print-hr ' . $page_break . '"></div>';
            }
            do_action('gravityflow_print_entry_footer', $form, $entry);
        }
        ?>
		</div>
		</body>
		</html>
		<?php 
    }