adsb-receiver/build/portal/html/classes/template.class.php

310 wiersze
14 KiB
PHP

<?php
/////////////////////////////////////////////////////////////////////////////////////
// ADS-B RECEIVER PORTAL //
// =============================================================================== //
// Copyright and Licensing Information: //
// //
// The MIT License (MIT) //
// //
// Copyright (c) 2015-2019 Joseph A. Prochazka //
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy //
// of this software and associated documentation files (the "Software"), to deal //
// in the Software without restriction, including without limitation the rights //
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell //
// copies of the Software, and to permit persons to whom the Software is //
// furnished to do so, subject to the following conditions: //
// //
// The above copyright notice and this permission notice shall be included in all //
// copies or substantial portions of the Software. //
// //
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR //
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, //
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE //
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER //
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, //
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE //
// SOFTWARE. //
/////////////////////////////////////////////////////////////////////////////////////
class template {
// PUT THE TEMPLATE TOGETHER
function display(&$pageData) {
$common = new common($this);
// Check if the portal is installed or needs upgraded.
$thisVersion = "2.7.2";
if (!file_exists($_SERVER['DOCUMENT_ROOT']."/classes/settings.class.php")) {
header ("Location: /install/install.php");
} elseif ($common->getSetting("version") != $thisVersion){
header ("Location: /install/upgrade.php");
}
// The Base URL of this page (needed for Plane Finder client link)
$pageData['baseurl'] = $common->getBaseUrl();
// Load the master template along with required data for the master template..
$master = $this->readTemplate('master.tpl');
require_once($_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR."classes".DIRECTORY_SEPARATOR."links.class.php");
$links = new links();
$pageData['links'] = $links->getAllLinks();
// Load the template for the requested page.
$page = $this->readTemplate($common->removeExtension($_SERVER["SCRIPT_NAME"]).'.tpl');
$output = $this->mergeAreas($master, $page);
$output = $this->mergeSettings($output);
$output = $this->mergePageData($output, $pageData);
$output = $this->processIfs($output, $pageData);
$output = $this->processForeach($output, $pageData);
$output = $this->processFors($output, $pageData);
$output = $this->processWhiles($output, $pageData);
$output = $this->removeComments($output);
// Insert page ID mainly used to mark an active navigation link when using Bootstrap.
$output = str_replace("{template:pageId}", $common->removeExtension($_SERVER["SCRIPT_NAME"])."-link", $output);
echo $output;
}
// TEMPLATE SYSTEM FUNCTIONS
// Return the contents of the requested template.
function readTemplate($template) {
$common = new Common($this);
return file_get_contents($_SERVER['DOCUMENT_ROOT']."/templates/".$common->getSetting('template')."/".$template, "r");
}
function mergeAreas($master, $template) {
// {area:name}
// ...
// {/area}
$common = new Common($this);
$pattern = '/\{area:(.*?)\}/';
preg_match_all($pattern, $master, $areas);
foreach ($areas[0] as $element) {
$id = $common->extractString($element, ':', '}');
if (strpos($template, '{area:'.$id.'/}') !== TRUE) {
$content = $common->extractString($template, '{area:'.$id.'}', '{/area}');
$master = str_replace("{area:".$id."}", $content, $master);
} else {
$master = str_replace("{area:'.$id.'}", "", $master);
}
}
return $master;
}
function mergeSettings($output) {
// {setting:key}
$common = new Common($this);
$pattern = '/\{setting:(.*?)\}/';
preg_match_all($pattern, $output, $settings, PREG_PATTERN_ORDER);
foreach ($settings[0] as $element) {
$name = $common->extractString($element, ':', '}');
$value = $common->getSetting($name);
$output = str_replace("{setting:".$name."}", $value, $output);
}
return $output;
}
function mergePageData($output, $pageData) {
// {page:key}
$common = new Common($this);
$pattern = '/\{page:(.*?)\}/';
preg_match_all($pattern, $output, $pageVariables, PREG_PATTERN_ORDER);
foreach ($pageVariables[0] as $element) {
$variable = $common->extractString($element, ':', '}');
foreach ($pageData as $key => $value) {
if ($key == $variable) {
$output = str_replace("{page:".$key."}", $value, $output);
}
}
}
return $output;
}
function processIfs($output, $pageData) {
// {if setting:key eq TRUE} ... {else} ... {/if}
$common = new Common($this);
$pattern = '/\{if[\s](.*?)\{\/if}/s';
preg_match_all($pattern, $output, $ifs, PREG_PATTERN_ORDER);
foreach ($ifs[0] as $element) {
$pattern = '/\{if[\s](.*?)\}/s';
preg_match($pattern, $element, $statement);
if (strpos($statement[0], ' eq ') !== FALSE){
$operator = "eq";
} else {
$operator = "neq";
}
$ifThis = $common->extractString($statement[0], "{if ", " ");
if (strpos($statement[0], 'setting:') !== FALSE) {
$ifThis = $common->getSetting($common->extractString($statement[0], "{if setting:", " "));
} elseif (strpos($statement[0], 'page:') !== FALSE) {
$variable = $common->extractString($statement[0], "{if page:", " ");
foreach ($pageData as $key => $value) {
if ($key == $variable) {
$ifThis = $value;
}
}
}
$that = $common->extractString($statement[0], " ".$operator." ", "}");
if ($that == "TRUE") {
$that = $common->stringToBoolean($that);
}
if ($operator == "eq") {
if ($ifThis == $that) {
if (preg_match("/\{else\}/s", $element)) {
$content = $common->extractString($element, "}", "{else}");
$output = str_replace($element, $content, $output);
} else {
$content = $common->extractString($element, "}", "{/if}");
$output = str_replace($element, $content, $output);
}
} else {
if (preg_match("/\{else\}/s", $element)) {
$content = $common->extractString($element, "{else}", "{/if}");
$output = str_replace($element, $content, $output);
} else {
$output = str_replace($element, "", $output);
}
}
} else {
if ($ifThis != $that) {
if (preg_match("/\{else\}/s", $element)) {
$content = $common->extractString($element, "}", "{else}");
$output = str_replace($element, $content, $output);
} else {
$content = $common->extractString($element, "}", "{/if}");
$output = str_replace($element, $content, $output);
}
} else {
if (preg_match("/\{else\}/s", $element)) {
$elseContent = $common->extractString($element, "{else}", "{/if}");
$output = str_replace($element, $elseContent, $output);
} else {
$output = str_replace($element, "", $output);
}
}
}
}
return $output;
}
function processForeach($output, $pageData) {
// {foreach array as item}
// ...
// {/foreach}
$common = new Common($this);
$html = NULL;
$pattern = '/\{foreach(.*?)\{\/foreach\}/s';
preg_match_all($pattern, $output, $foreach, PREG_PATTERN_ORDER);
foreach ($foreach[0] as $element) {
// Loop through $pageData.
if (strpos($element, 'page:') !== false) {
$variable = $common->extractString($element, "{foreach page:", " ");
$itemName = $common->extractString($element, "{foreach page:".$variable." as ", "}");
$contents = $common->extractString($element, "{foreach page:".$variable." as ".$itemName."}", "{/foreach}");
$thisIteration = $contents;
foreach ($pageData as $keys => $values) {
if ($keys == $variable) {
foreach ($values as $item) {
foreach ($item as $key => $value) {
$pattern = '/\{'.$itemName.'->(.*?)\}/';
preg_match_all($pattern, $thisIteration, $placeholders, PREG_PATTERN_ORDER);
foreach ($placeholders as $placeholder) {
if (strpos($thisIteration, '{'.$itemName.'->'.$key.'}') !== false) {
$thisIteration = str_replace('{'.$itemName.'->'.$key.'}', $value, $thisIteration);
}
}
}
$html .= $thisIteration;
$thisIteration = $contents;
}
}
}
$output = str_replace($element, $html, $output);
$html = NULL;
}
}
return $output;
}
function processFors($output, $pageData) {
// {for i eq 1 | i lte 5 | i++}
// ...
// {/for}
$common = new Common($this);
$html = NULL;
$pattern = '/\{for(.*?)\{\/for\}/s';
preg_match_all($pattern, $output, $fors, PREG_PATTERN_ORDER);
foreach ($fors[0] as $element) {
// {for pageNumber eq 1 to page:pageLinks}
$counterName = $common->extractString($element, "{for ", " ");
$counter = $common->extractString($element, "{for ", " ");
$counterValue = $common->extractString($element, "{for ".$counter." eq ", " ");
$counterLimit = $common->extractString($element, "{for ".$counter." eq ".$counterValue." to ", "}");
$contents = $common->extractString($element, "{for ".$counter." eq ".$counterValue." to ".$counterLimit."}", "{/for}");
$thisIteration = $contents;
// Loop through $pageData.
if (strpos($element, 'page:') !== false) {
$thisCounterValue = $counterValue;
$limit = $pageData[str_replace("page:", "", $counterLimit)];
for ($counter = $counterValue; $thisCounterValue <= $limit; $thisCounterValue++) {
$thisIteration = str_replace('{'.$counterName.'}', $thisCounterValue, $thisIteration);
$html .= $thisIteration;
$thisIteration = $contents;
}
$output = str_replace($element, $html, $output);
}
}
return $output;
}
function processWhiles($output) {
// {while i lte 5}
// ...
// {i++}
// {/while}
return $output;
}
function removeComments($output) {
// {* This comment is not to be rendered... *}
$pattern = '/\{\*(.*?)\*\}/s';
preg_match_all($pattern, $output, $comments, PREG_PATTERN_ORDER);
foreach ($comments[0] as $element) {
$output = str_replace($element, "", $output);
}
return $output;
}
}
?>