diff options
Diffstat (limited to 'include')
-rwxr-xr-x | include/classes/class.bigpipe.php | 79 | ||||
-rwxr-xr-x | include/classes/class.pagelet.php | 84 | ||||
-rwxr-xr-x | include/functions.php | 12 |
3 files changed, 175 insertions, 0 deletions
diff --git a/include/classes/class.bigpipe.php b/include/classes/class.bigpipe.php new file mode 100755 index 0000000..1edefc8 --- /dev/null +++ b/include/classes/class.bigpipe.php @@ -0,0 +1,79 @@ +<?php +class BigPipe { + public static $enabled = TRUE; + private static $pagelets = []; + private static $count = 0; + + #==================================================================================================== + # Gibt TRUE zurück wenn BigPipe eingeschaltet ist + #==================================================================================================== + public static function isEnabled() { + return self::$enabled ? TRUE : FALSE; + } + + #==================================================================================================== + # Neues Pagelet zur Pipeline hinzufügen + #==================================================================================================== + public static function addPagelet(Pagelet $Pagelet, $priority) { + self::$pagelets[$priority][] = $Pagelet; + self::$count++; + } + + #==================================================================================================== + # Gibt einen einzelnen Pagelet-Response aus + #==================================================================================================== + private static function pageletResponse(Pagelet $Pagelet, $async = FALSE, $last = FALSE) { + $data = [ + 'ID' => $Pagelet->getID(), + 'RESOURCES' => ['CSS' => $Pagelet->getCSSFiles(), 'JS' => $Pagelet->getJSFiles(), 'JS_CODE' => removeLineBreaksAndTabs($Pagelet->getJSCode())] + ]; + + if($last) { + $data['IS_LAST'] = true; + } + + echo '<code class="hidden" id="_'.$data['ID'].'"><!-- '.str_replace('--', '--', removeLineBreaksAndTabs($Pagelet->getHTML())).' --></code>'."\n"; + echo '<script>BigPipe.onPageletArrive('.json_encode($data).($async ? ', document.getElementById("_'.$Pagelet->getID().'").innerHTML' : NULL).');</script>'."\n\n"; + } + + #==================================================================================================== + # Sendet den Output-Buffer so weit wie möglich in Richtung User + #==================================================================================================== + public static function flushOutputBuffer() { + ob_flush(); flush(); + } + + #==================================================================================================== + # Alle Pagelets an Client schicken + #==================================================================================================== + public static function render($async = FALSE) { + self::flushOutputBuffer(); + + $i = 0; + + ksort(self::$pagelets); + + foreach(array_reverse(self::$pagelets) as $priority => $pagelets) { + foreach($pagelets as $Pagelet) { + if(!self::isEnabled()) { + if($Pagelet->getJSCode()) { + echo '<script>'.$Pagelet->getJSCode().'</script>'."\n"; + } + + foreach($Pagelet->getCSSFiles() as $CSSFile) { + echo '<link href="'.$CSSFile.'" rel="stylesheet" />'."\n"; + } + + foreach($Pagelet->getJSFiles() as $JSFile) { + echo '<script src="'.$JSFile.'"></script>'."\n"; + } + } + + else { + self::pageletResponse($Pagelet, $async, (self::$count === ++$i)); + self::flushOutputBuffer(); + } + } + } + } +}
\ No newline at end of file diff --git a/include/classes/class.pagelet.php b/include/classes/class.pagelet.php new file mode 100755 index 0000000..c1f211a --- /dev/null +++ b/include/classes/class.pagelet.php @@ -0,0 +1,84 @@ +<?php +class Pagelet { + private $ID = NULL; + private $HTML = NULL; + private $JSCode = ""; + private $CSSFiles = []; + private $JSFiles = []; + private static $count = 0; + + public function __construct($priority = 50) { + $this->ID = 'P'.++self::$count; + BigPipe::addPagelet($this, $priority); + } + + #==================================================================================================== + # ID zurückgeben + #==================================================================================================== + public function getID() { + return $this->ID; + } + + #==================================================================================================== + # HTML-Code zurückgeben + #==================================================================================================== + public function getHTML() { + return $this->HTML; + } + + #==================================================================================================== + # CSS-Ressourcen zurückgeben + #==================================================================================================== + public function getCSSFiles() { + return $this->CSSFiles; + } + + #==================================================================================================== + # JS-Ressourcen zurückgeben + #==================================================================================================== + public function getJSFiles() { + return $this->JSFiles; + } + + #==================================================================================================== + # JS-Code zurückgeben + #==================================================================================================== + public function getJSCode() { + return $this->JSCode; + } + + #==================================================================================================== + # HTML-Code hinzufügen + #==================================================================================================== + public function addHTML($HTML) { + $this->HTML .= $HTML; + } + + #==================================================================================================== + # CSS-Ressource hinzufügen + #==================================================================================================== + public function addCSS($file) { + $this->CSSFiles[] = $file; + } + + #==================================================================================================== + # JS-Ressource hinzufügen + #==================================================================================================== + public function addJS($file) { + $this->JSFiles[] = $file; + } + + #==================================================================================================== + # JS-Code hinzufügen + #==================================================================================================== + public function addJSCode($code) { + $this->JSCode .= $code; + } + + #==================================================================================================== + # Magische Methode: __toString() + #==================================================================================================== + public function __toString() { + return '<div id="'.$this->getID().'">'.((!BigPipe::isEnabled()) ? $this->getHTML() : NULL).'</div>'; + } +}
\ No newline at end of file diff --git a/include/functions.php b/include/functions.php new file mode 100755 index 0000000..443d594 --- /dev/null +++ b/include/functions.php @@ -0,0 +1,12 @@ +<?php +#==================================================================================================== +# FUNCTION: Entfernt alle Zeilenumbrüche und Tabulatoren aus einem String +#==================================================================================================== +function removeLineBreaksAndTabs($mixed, $replace = NULL) { + if(is_array($mixed)) { + return array_map(__FUNCTION__, $mixed); + } + + return is_string($mixed) ? str_replace(["\r\n", "\r", "\n", "\t"], $replace, $mixed) : $mixed; +} +?>
\ No newline at end of file |