aboutsummaryrefslogtreecommitdiffstats
path: root/include/classes/BigPipe
diff options
context:
space:
mode:
Diffstat (limited to 'include/classes/BigPipe')
-rwxr-xr-xinclude/classes/BigPipe/BigPipe.php81
-rwxr-xr-xinclude/classes/BigPipe/Pagelet.php86
2 files changed, 167 insertions, 0 deletions
diff --git a/include/classes/BigPipe/BigPipe.php b/include/classes/BigPipe/BigPipe.php
new file mode 100755
index 0000000..b69f1d8
--- /dev/null
+++ b/include/classes/BigPipe/BigPipe.php
@@ -0,0 +1,81 @@
+<?php
+namespace BigPipe;
+
+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('--', '&#45;&#45;', 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/BigPipe/Pagelet.php b/include/classes/BigPipe/Pagelet.php
new file mode 100755
index 0000000..6fe0032
--- /dev/null
+++ b/include/classes/BigPipe/Pagelet.php
@@ -0,0 +1,86 @@
+<?php
+namespace BigPipe;
+
+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