You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
730 lines
22 KiB
PHP
730 lines
22 KiB
PHP
<?php
|
|
/***************************************************************************************
|
|
* _functions.inc
|
|
*
|
|
* The following defined here so that they can be used by multiple template files.
|
|
* This file contains various "render" functions that generate markups specific
|
|
* to the site profile (theme).
|
|
*
|
|
* What's Here:
|
|
*
|
|
* getTag() - Render a Tag List.
|
|
* renderOnPageBlocks() - Render on-page blocks.
|
|
* renderInfoBlocks() - Render Info blocks.
|
|
* renderCopyrights(Page $page) - Render site copyrights content
|
|
* getReferences() - Render testimonial/references
|
|
* renderSidebar() - Return sidebar item as html markup
|
|
* renderGoogleLocationMap() - Render google map locations
|
|
* getContactUsForm() - Render contact form
|
|
*
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* renderCopyrights(Page $page) - Render site copyrights content
|
|
* You can find site copyrights content under Admin > Pages > Home edit page and find Global site settings.
|
|
*
|
|
* @param Page $page - instance of the page.
|
|
* @return String - html markup string of copyright statement
|
|
*/
|
|
|
|
setlocale(LC_NUMERIC, 'en_US.UTF-8');
|
|
|
|
#########################################################
|
|
# getter
|
|
#########################################################
|
|
/**
|
|
* getTag()
|
|
*
|
|
* @param PageArray $tags - instance of PageArray
|
|
* @param int $limit - limit of the output
|
|
* @return string - html markup string of Tag list elements.
|
|
*/
|
|
function getTag(PageArray $tags, $limit = 0){
|
|
$list = "";
|
|
$count = "0";
|
|
foreach($tags as $tag){
|
|
$count++;
|
|
if($count > $limit && $limit != 0) break;
|
|
$title = $tag->title;
|
|
$list .= "<li>$title</li>";
|
|
}
|
|
return $list;
|
|
}
|
|
|
|
function getPageArray($posts){
|
|
// Erzeuge ein Array aus $posts
|
|
if(!$posts instanceof PageArray){
|
|
if($posts instanceof Page){
|
|
$post = $posts;
|
|
$posts = new PageArray();
|
|
$posts->add($post);
|
|
} else if(empty($posts)){
|
|
$post = wire('page');
|
|
$posts = new PageArray();
|
|
$posts->add($post);
|
|
} else if(is_string($posts)){
|
|
// selector string
|
|
$selector = $posts;
|
|
$posts = wire('pages')->find("$selector");
|
|
}
|
|
}
|
|
return $posts;
|
|
}
|
|
|
|
###################################################
|
|
# Render
|
|
####################################################
|
|
function renderPage($template = "") {
|
|
if(empty($template)) $template = wire('page')->template;
|
|
$config = wire('config');
|
|
|
|
//Create delegate template
|
|
$template = new TemplateFile($config->paths->templates . "markup/$template.inc");
|
|
|
|
//Get the output and save it on $out.
|
|
return $template->render();
|
|
}
|
|
|
|
/* Alternative zur obigen Lösung:
|
|
function renderPage($posts = "", $small = false){
|
|
if(!$posts instanceof PageArray){
|
|
if($posts instanceof Page){
|
|
$post = $posts;
|
|
$posts = new PageArray();
|
|
$posts->add($post);
|
|
} else if(empty($posts)){
|
|
$post = wire('page');
|
|
$posts = new PageArray();
|
|
$posts->add($post);
|
|
} else if(is_string($posts)){
|
|
// selector string
|
|
$selector = $posts;
|
|
$posts = wire('pages')->find("$selector");
|
|
}
|
|
}
|
|
|
|
$out = '';
|
|
foreach ($posts as $p) {
|
|
switch($p->template){
|
|
case 'post':
|
|
$out .= renderPost($p, $small);
|
|
break;
|
|
case 'node':
|
|
$out .= renderEvent($p, $small);
|
|
break;
|
|
case 'router':
|
|
$out .= renderRouter($p, $small);
|
|
break;
|
|
case 'profile':
|
|
$out .= renderProfile($p, $small);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if($posts->getLimit() < $posts->getTotal()) $out .= $posts->renderPager(array(
|
|
'nextItemLabel' => "Ältere Artikel",
|
|
'previousItemLabel' => "Neure Artikel",
|
|
));
|
|
|
|
return $out;
|
|
}
|
|
*/
|
|
|
|
function renderCopyrights(Page $page) {
|
|
|
|
if (!$page->summary) return '';
|
|
|
|
$text = str_replace(
|
|
// find these:
|
|
array('{year}'),
|
|
// and replace with these:
|
|
array(date('Y')),
|
|
// in the copyright_text text
|
|
$page->summary);
|
|
|
|
return $text;
|
|
}
|
|
|
|
function renderTimeline($timeline){
|
|
// Überprüfe ob $timeline von der richtigen Instants ist
|
|
if(!$timeline instanceof PageArray) {
|
|
if($timeline instanceof Page){
|
|
//single page
|
|
$post = $timeline;
|
|
$timeline = new PageArray();
|
|
$timeline->add($post);
|
|
} else if(is_string($timeline)) {
|
|
// selector string
|
|
$selector = $timeline;
|
|
$timeline = wire('pages')->find("template=post, sort=-date, $selector");
|
|
} else {
|
|
throw new WireException('getTimeline requires a PageArray, Page or selector string');
|
|
}
|
|
}
|
|
|
|
|
|
// Count for the while Schleife
|
|
$count = 0;
|
|
$timeline_blocks = '';
|
|
$config = wire('config');
|
|
|
|
foreach($timeline as $post){
|
|
$image = $post->images->first();
|
|
$t = new TemplateFile($config->paths->templates . "markup/timeline_block.inc");
|
|
$t->set('title', $post->date);
|
|
$t->set('subtitle', $post->title);
|
|
$t->set('summary', $post->summary);
|
|
$t->set('image', $post->images->first()->size(156,156)->url);
|
|
$t->set('image_description', $image->description);
|
|
$t->set('readmore', $post->httpUrl);
|
|
$t->set('leftright', ($count % 2 != 0 ? "" : "class='timeline-inverted'"));
|
|
|
|
$timeline_blocks .= $t->render();
|
|
|
|
$count++;
|
|
}
|
|
|
|
$t = new TemplateFile($config->paths->templates . "markup/timeline.inc");
|
|
$t->set('timeline_blocks', $timeline_blocks);
|
|
|
|
return $t->render();
|
|
|
|
}
|
|
|
|
/* Vorbereitung für Landingpages einzelner Communitys */
|
|
function renderOnPageBlocks() {
|
|
|
|
// Get the current page instance from global scope.
|
|
$page = wire('page');
|
|
// Get the config instance from global scope.
|
|
$config = wire('config');
|
|
|
|
if (!count($page->on_page_blocks)) return '';
|
|
|
|
/* Get on-page blocks */
|
|
$pageBlocks = $page->on_page_blocks;
|
|
|
|
$out = '';
|
|
|
|
foreach ($pageBlocks as $block) {
|
|
|
|
//Create delegate template
|
|
$template = new TemplateFile($config->paths->templates . "markup/page-block-type-{$block->render_option}.inc");
|
|
//Assign the rendered view to content variable to show up on page-block-type-x.inc
|
|
$template->set('image', $block->image);
|
|
|
|
$content = str_replace(
|
|
// find these:
|
|
array('<ul>','<!-- pagebreak -->'),
|
|
// and replace with these:
|
|
array('<ul class="default-list-square">', '<br/>'),
|
|
// in the $block->body text
|
|
$block->body
|
|
);
|
|
|
|
//Assign the rendered view to content variables to show up on page-block-type-x.inc
|
|
$template->set('content', $content);
|
|
$template->set('headline', $block->get('headline|title'));
|
|
|
|
//Get the output and save it on $out.
|
|
$out .= $template->render();
|
|
}
|
|
|
|
return $out;
|
|
}
|
|
|
|
/* Rendern der Infoblocks von Router */
|
|
function renderInfoBlocks() {
|
|
|
|
// Get the current page instance from global scope.
|
|
$page = wire('page');
|
|
// Get the config instance from global scope.
|
|
$config = wire('config');
|
|
|
|
if (!count($page->info_blocks)) return '';
|
|
|
|
/* Get Info blocks */
|
|
$infoBlocks = $page->info_blocks;
|
|
|
|
$out = '';
|
|
|
|
foreach ($infoBlocks as $block) {
|
|
|
|
//Create delegate template
|
|
$template = new TemplateFile($config->paths->templates . "markup/info-block.inc");
|
|
|
|
$content = str_replace(
|
|
// find these:
|
|
array('<ul>','<!-- pagebreak -->'),
|
|
// and replace with these:
|
|
array('<ul class="default-list-square">', '<br/>'),
|
|
// in the $block->body text
|
|
$block->body
|
|
);
|
|
|
|
//Assign the rendered view to content variables to show up on page-block-type-x.inc
|
|
$template->set('content', $content);
|
|
$template->set('headline', $block->get('title'));
|
|
|
|
//Get the output and save it on $out.
|
|
$out .= $template->render();
|
|
}
|
|
|
|
return $out;
|
|
}
|
|
|
|
function renderSidebarFilter(){
|
|
$hersteller = listPages(wire('pages')->find("template=hersteller"));
|
|
$features = listPages(wire('pages')->find("template=features"));
|
|
|
|
$output = "<div id='sidebar' class='large-2 columns'>
|
|
<h3>Filter</h3>
|
|
<h5>Hersteller</h5>
|
|
<ul class='filter'>
|
|
$hersteller
|
|
</ul>
|
|
|
|
<h5>Features</h5>
|
|
<ul class='filter'>
|
|
$features
|
|
</ul>
|
|
</div><!-- #sidebar-->";
|
|
|
|
return $output;
|
|
}
|
|
|
|
// Render a Page Title
|
|
function renderPageName($title){
|
|
$sanitizer = wire('sanitizer');
|
|
$string = iconv("UTF-8", "ASCII//TRANSLIT", $title);
|
|
$string = preg_replace("/\s+/", " ", $string); // Überflüssige Leerzeichen entfernen
|
|
$string = trim($string); // Leerzeichen am Anfang und Ende entfernen
|
|
$string = $sanitizer->pageName($string);
|
|
|
|
return $string;
|
|
}
|
|
|
|
function renderNewNodesList(){
|
|
$nodes = wire('pages')->find("template=node, sort=-created, limit=10");
|
|
$list = "";
|
|
foreach($nodes as $node){
|
|
$color = ($node->online ? "green" : "red");
|
|
$alt = ($node->online ? "Online" : "Offline");
|
|
$list .= "<li><i class='fa fa-wifi' style='color:$color' alt='$alt'></i> <a href='{$node->httpUrl}'>{$node->get('subtitle|title')}</a>";
|
|
$list .= ($node->address ? "<br/><span class='node-address'><i class='fa fa-fw'></i> {$node->address}</span></li>" : "");
|
|
}
|
|
$output = "<h4>Neuste Nodes</h4><ul class='node-list'>$list</ul>";
|
|
return $output;
|
|
}
|
|
|
|
#########################################################
|
|
# Mac Address Handling
|
|
#########################################################
|
|
function validateMac($mac){
|
|
// trim
|
|
$mac = trim($mac);
|
|
// 01:23:45:67:89:ab
|
|
if (preg_match('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/', $mac))
|
|
return true;
|
|
// 01_23_45_67_89_ab
|
|
if (preg_match('/^([a-fA-F0-9]{2}_){5}[a-fA-F0-9]{2}$/', $mac))
|
|
// 01-23-45-67-89-ab
|
|
if (preg_match('/^([a-fA-F0-9]{2}\-){5}[a-fA-F0-9]{2}$/', $mac))
|
|
return true;
|
|
// 0123456789ab
|
|
else if (preg_match('/^[a-fA-F0-9]{12}$/', $mac))
|
|
return true;
|
|
// 0123.4567.89ab
|
|
else if (preg_match('/^([a-fA-F0-9]{4}\.){2}[a-fA-F0-9]{4}$/', $mac))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
function normalizeMac($mac){
|
|
// trim
|
|
$mac = trim($mac);
|
|
|
|
// remove any dots
|
|
$mac = str_replace(".", ":", $mac);
|
|
|
|
// remove any underscore
|
|
$mac = str_replace("_", ":", $mac);
|
|
|
|
// replace dashes with colons
|
|
$mac = str_replace("-", ":", $mac);
|
|
|
|
// counting colons
|
|
$colon_count = substr_count ($mac , ":");
|
|
|
|
// insert enough colons if none exist
|
|
if ($colon_count == 0)
|
|
{
|
|
$mac = substr_replace($mac, ":", 2, 0);
|
|
$mac = substr_replace($mac, ":", 5, 0);
|
|
$mac = substr_replace($mac, ":", 8, 0);
|
|
$mac = substr_replace($mac, ":", 11, 0);
|
|
$mac = substr_replace($mac, ":", 14, 0);
|
|
}
|
|
|
|
// uppercase
|
|
$mac = strtoupper($mac);
|
|
|
|
// DE:AD:BE:EF:10:24
|
|
return $mac;
|
|
}
|
|
|
|
function serializeMac($serialize){
|
|
$serialize = getPageArray($serialize);
|
|
$serialize_array = array();
|
|
|
|
foreach($serialize as $one){
|
|
$serialize_array[] = array('mac' => strtolower(str_replace(":", "", $one->title)),
|
|
'staticip' => strtoupper($one->static_ip));
|
|
}
|
|
|
|
return serialize($serialize_array);
|
|
}
|
|
|
|
##########################################################
|
|
# Page and User handling
|
|
#########################################################
|
|
function listPages(PageArray $pages){
|
|
$output = "";
|
|
foreach($pages as $page){
|
|
$output .= "<li><a href='{$page->httpUrl}'>{$page->title}</a></li>";
|
|
}
|
|
return $output;
|
|
}
|
|
|
|
|
|
/**
|
|
* Function to Create Processwire Pages
|
|
*
|
|
* @param string $template the template for the new page
|
|
* @param Page/string $parent parent Page can be a Page or string
|
|
* @param string $title Title of the new Page
|
|
* @return PageArray The new Page
|
|
*/
|
|
function createPage($template, $parent, $title){
|
|
if(!$parent instanceof Page) $parent = wire('pages')->get("/$parent/"); // Wenn keine Seite übergeben wird suche eine raus.
|
|
|
|
$pageName = renderPageName($title);
|
|
|
|
$t = new Page();
|
|
$t->template = $template;
|
|
$t->parent = $parent;
|
|
$t->name = $pageName;
|
|
$t->title = $title;
|
|
$t->save();
|
|
|
|
return $t;
|
|
}
|
|
|
|
/**
|
|
* Fucntion to handle Node registration
|
|
*
|
|
* @param string $mac the MAC Address from the Node
|
|
* @param string $key the Node PublicKey for the VPN connection_status
|
|
* @return int -1 = Existiert bereits; 0 = Fehler; 1 = true; 2 = aktualisiert
|
|
*/
|
|
function registerNode($mac, $key){
|
|
if(empty($mac) || empty($key)) return 0;
|
|
// Definiere Systemvariablen
|
|
$page = wire('page');
|
|
$node = wire('pages')->get("template=node, title=$mac");
|
|
$parent = wire('pages')->get($page->id);
|
|
$operator = wire('user')->id;
|
|
// Existiert der Node bereits?
|
|
if($node instanceof Nullpage){
|
|
$titlemac = strtoupper($mac);
|
|
$n = createPage('node', $parent, $titlemac);
|
|
$fehlercode = 1;
|
|
} elseif($node->operator->id != $operator) {
|
|
// Checke ob der Node vom Besitzer geändert wird.
|
|
wire('log')->save('node', "Node $mac existiert bereits!");
|
|
return -1;
|
|
} else {
|
|
$n = $node;
|
|
$fehlercode = 2;
|
|
}
|
|
|
|
$n->key = $key;
|
|
$n->operator = $operator;
|
|
$n->of(false);
|
|
$n->save();
|
|
$n->of(true);
|
|
|
|
// Remove key and mac from the session!
|
|
wire('session')->remove('key');
|
|
wire('session')->remove('mac');
|
|
|
|
return $fehlercode;
|
|
}
|
|
|
|
/**
|
|
* deleteNode deletes one ore more nodes.
|
|
*/
|
|
function deleteNode($posts){
|
|
// Erzeuge ein Array aus $posts
|
|
if(!$posts instanceof PageArray){
|
|
if($posts instanceof Page){
|
|
$post = $posts;
|
|
$posts = new PageArray();
|
|
$posts->add($post);
|
|
} else if(empty($posts)){
|
|
$post = wire('page');
|
|
$posts = new PageArray();
|
|
$posts->add($post);
|
|
} else if(is_string($posts)){
|
|
// selector string
|
|
$selector = $posts;
|
|
$posts = wire('pages')->find("$selector");
|
|
}
|
|
}
|
|
|
|
foreach($posts as $post){
|
|
if($post->template != "node") break; // Only for nodes
|
|
$pages = wire('pages');
|
|
|
|
$pages->delete($post, true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function registerUser($u){
|
|
// inizialisation ldapHelper Module for Ldap Registration
|
|
$ldapHelper = wire('modules')->get("ldapHelper");
|
|
|
|
if(!wire('users')->get($u["username"]) instanceof NullPage) return "<div data-alert class='alert-box alert'>Der Benutzer mit dem Namen {$u["username"]} existiert bereits.</div>";
|
|
if(!wire('users')->get("email={$u["email"]}") instanceof NullPage) return "<div data-alert class='alert-box alert'>Die E-Mail {$u["email"]} wird bereits verwendet.</div>";
|
|
|
|
if(!$ldapHelper->ldapHelperRegistradeUser($u)) return "<div data-alert class='alert-box alert'>Das Anlegen eines LDAP Users hat leider nicht funktioniert. Bitte versuche es zu einem späteren Zeitpunkt noch einmal.</div> ";
|
|
|
|
$new_user = new User();
|
|
$new_user->of(false);
|
|
$new_user->name = $u["username"];
|
|
$new_user->email = $u["email"];
|
|
$new_user->pass = $u["password"];
|
|
$new_user->addRole("user");
|
|
$new_user->firstname = $u["firstname"];
|
|
$new_user->lastname = $u["lastname"];
|
|
$new_user->admin_theme = "AdminThemeReno";
|
|
$new_user->authkey = getToken();
|
|
$new_user->save();
|
|
$new_user->of(true);
|
|
|
|
$aktivierungslink = wire('page')->httpUrl ."?authkey=". $new_user->authkey ."&user=". $new_user->name;
|
|
$mail = wireMail();
|
|
$mail->to($u["email"])->from('registration@ffmyk.de');
|
|
$mail->subject("Account Aktivierung");
|
|
$mail->body("===== Account Aktivierung ===== \n\n
|
|
mit dieser E-Mail kannst du deinen soeben eingerichteten Account bei Freifunk-Myk aktivieren.\n
|
|
$aktivierungslink \n
|
|
Sollte der Link nicht anklickbar sein, kopiere ihn und füge ihn in die Adresszeile deines Browsers ein.");
|
|
if($mail->send()) wire('log')->message('Send Mail: Account Aktivierung') ;
|
|
|
|
$session = wire('session');
|
|
$session->remove('username');
|
|
$session->remove('email');
|
|
$session->remove('firstname');
|
|
$session->remove('lastname');
|
|
|
|
return "<div data-alert class='alert-box success radius'>Die Registrierung war erfolgreich, du erhälst nun eine E-Mail mit einem Aktivierungslink.</div>";
|
|
}
|
|
#################################################
|
|
# secret
|
|
#################################################
|
|
function authorize($auth_user, $secret){
|
|
if($auth_user->authkey === $secret && $auth_user->authsuccess != true){
|
|
$auth_user->of(false);
|
|
$auth_user->authsuccess = true;
|
|
$auth_user->save();
|
|
$auth_user->of(true);
|
|
|
|
$mail = wireMail();
|
|
$mail->to($auth_user->email)->from('registration@ffmyk.de');
|
|
$mail->subject("Herzlich Wilkommen");
|
|
$mail->body("===== Wilkommen bei Freifunk-Myk ===== \n\n
|
|
Wir freuen uns dich bei Freifunk-Myk begrüßen zu dürfen. Im Folgenden erklären wir dir die Besonderheiten deines Accounts. \n\n
|
|
=== Mehr als nur ein Account === \n
|
|
Mit deinem Account bei Freifunk-Myk kannst du dich nicht nur auf unserer Webseite, sondern bei vielen weiteren Diensten im Freifunk-Myk einloggen.\n
|
|
Ob Router registrieren, Wiki editieren oder dich im Jabber zu unterhalten. Alles mit einem Account.\n\n
|
|
=== Jabber ===\n
|
|
Jabber ist ein föderalisiertes Chatsystem. Es stehten Clients für Computer, Smartphones und andere Geräte bereit.
|
|
Du besitzt mit der Registrierung auf Freifunk-Myk direkt einen Jabber Account mit der folgenden ID: {$auth_user->name}@ffmyk.de und deinem Passwort.
|
|
Wenn du dich einloggst findest du in deiner Kontaktliste direkt eine Liste der Administratoren und kannst dich mit ihnen unterhalten.\n\n
|
|
Das Freifunk-Myk Team wünscht dir viel Spaß und freut sich auf deine Mitarbeit.");
|
|
if($mail->send()) wire('log')->message("Send Mail: Welcome to {$auth_user->email} ") ;
|
|
|
|
return "<div data-alert class='alert-box success radius'>
|
|
Dein Account ist erfolgreich Aktiviert. Wir senden dir noch eine Wilkommens E-Mail in der du wichtige Informationen zu unseren Diensten und zu deinem Account findest.
|
|
</div>";
|
|
} else {
|
|
return "<div data-alert class='alert-box alert'>
|
|
Dein Account wurde bereits Aktiviert.
|
|
</div>";
|
|
}
|
|
}
|
|
|
|
function crypto_rand_secure($min, $max) {
|
|
$range = $max - $min;
|
|
if ($range < 0) return $min; // not so random...
|
|
$log = log($range, 2);
|
|
$bytes = (int) ($log / 8) + 1; // length in bytes
|
|
$bits = (int) $log + 1; // length in bits
|
|
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
|
|
do {
|
|
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
|
|
$rnd = $rnd & $filter; // discard irrelevant bits
|
|
} while ($rnd >= $range);
|
|
return $min + $rnd;
|
|
}
|
|
|
|
function getToken($length=32){
|
|
$token = "";
|
|
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
|
|
$codeAlphabet.= "0123456789";
|
|
for($i=0;$i<$length;$i++){
|
|
$token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
|
|
}
|
|
return $token;
|
|
}
|
|
|
|
/**
|
|
* Return a Page from searched Router
|
|
*
|
|
* return Page
|
|
*/
|
|
function getRouter($search){
|
|
$pages = wire('pages');
|
|
$sanitizer = wire('sanitizer');
|
|
$search = explode(" ",$search);
|
|
|
|
foreach($search as $string){
|
|
$result = $pages->get("template=router, name|title={$sanitizer->pageName($string)}");
|
|
if($result->id) break;
|
|
}
|
|
|
|
if($result instanceof NullPage) return false;
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Umkreissuche für Nodes
|
|
* read: https://www.tutorials.de/threads/umkreis-um-eine-koordinate-berechnen-und-alle-koordinaten-in-db-suchen.217768/
|
|
*
|
|
* String latitude
|
|
* String longitude
|
|
* Int dist Distance
|
|
*
|
|
* return String Processwire Selector
|
|
*/
|
|
function umkreissuche($template, $latitude, $longitude, $dist = 5, $sort = true){
|
|
// Return if the Template dosn't exists
|
|
if(!wire('templates')->get("$template")) return;
|
|
$t = wire('templates')->get("$template");
|
|
// Return if Template didn't has latitude or longitude field!
|
|
if(!$t->hasField('latitude')) return;
|
|
|
|
$ursprungsbreite = str_replace(",", ".", $latitude);
|
|
$ursprungslaenge = str_replace(",", ".", $longitude);
|
|
|
|
$alpha = 180*$dist/(6371*3.14159);
|
|
|
|
$geo1 = $ursprungsbreite-$alpha;
|
|
$geo2 = $ursprungsbreite+$alpha;
|
|
$geo3 = $ursprungslaenge-$alpha;
|
|
$geo4 = $ursprungslaenge+$alpha;
|
|
|
|
// Ungenaue suche
|
|
$search = wire('pages')->find("template=$template, latitude>=$geo1, latitude<=$geo2, longitude>=$geo3, longitude<=$geo4");
|
|
|
|
$result = new PageArray();
|
|
|
|
$a = $ursprungsbreite/180*3.14159;
|
|
$b = $ursprungslaenge/180*3.14159;
|
|
|
|
$z = 1;
|
|
foreach($search as $value){
|
|
$c = str_replace(',','.',$value->latitude);
|
|
$d = str_replace(',','.',$value->longitude);
|
|
$c = $c/180*3.14159;
|
|
$d = $d/180*3.14159;
|
|
|
|
$e = sin($a)*sin($c);
|
|
$f = cos($a)*cos($c)*cos($d-$b);
|
|
$g = acos($e + $f);
|
|
$h = $g * 6378.137;
|
|
$ausgabe = sprintf("%01.3f", $h);
|
|
if($ausgabe > $dist || $h == 0) {
|
|
continue;
|
|
}
|
|
|
|
$value->set('dist', $ausgabe);
|
|
$result->add($value);
|
|
}
|
|
|
|
if($sort){
|
|
$result = $result->sort('dist');
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
function getDistance($dist){
|
|
$a = array( 'km' => 1,
|
|
'm' => 0.001);
|
|
|
|
foreach ($a as $metric => $key) {
|
|
$b = $dist / $key;
|
|
if (intval($b) >= 1){
|
|
$b = round($b, 2);
|
|
$ausgabe = "$b $metric";
|
|
break;
|
|
} else {
|
|
$ausgabe = "> 1 m";
|
|
}
|
|
}
|
|
|
|
return $ausgabe;
|
|
}
|
|
|
|
/**
|
|
* Author : Ayman Hussein
|
|
* http://stackoverflow.com/questions/1416697/converting-timestamp-to-time-ago-in-php-e-g-1-day-ago-2-days-ago
|
|
*/
|
|
function time_elapsed_string($ptime){
|
|
$etime = time() - $ptime;
|
|
|
|
if ($etime < 1){
|
|
return '0 seconds';
|
|
}
|
|
|
|
$a = array( 365 * 24 * 60 * 60 => 'year',
|
|
30 * 24 * 60 * 60 => 'month',
|
|
24 * 60 * 60 => 'day',
|
|
60 * 60 => 'hour',
|
|
60 => 'minute',
|
|
1 => 'second'
|
|
);
|
|
$a_plural = array( 'year' => 'Jahre',
|
|
'month' => 'Monate',
|
|
'day' => 'Tage',
|
|
'hour' => 'Stunden',
|
|
'minute' => 'Minuten',
|
|
'second' => 'Sekunden'
|
|
);
|
|
|
|
foreach ($a as $secs => $str){
|
|
$d = $etime / $secs;
|
|
if ($d >= 1){
|
|
$r = round($d);
|
|
return 'seit '. $r . ' ' . ($r > 1 ? $a_plural[$str] : $str);
|
|
}
|
|
}
|
|
}
|