aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorThomas Lange <code@nerdmind.de>2016-06-25 15:34:34 +0200
committerThomas Lange <code@nerdmind.de>2016-06-25 15:34:34 +0200
commit21824df56bd13d81f10ac0b86c5cad31def51f3e (patch)
tree5d5e8c29a87c82163d55d139680db359bc5cf839 /include
parentc5637489e603c588fca41e2b7bd4345b67914f33 (diff)
downloadbigpipe-21824df56bd13d81f10ac0b86c5cad31def51f3e.tar.gz
bigpipe-21824df56bd13d81f10ac0b86c5cad31def51f3e.tar.xz
bigpipe-21824df56bd13d81f10ac0b86c5cad31def51f3e.zip
Update with new features and code improvements.
+ New classes have been added: "BigPipe\Resource", "BigPipe\Resource\CSS", "BigPipe\Resource\JS". If you wan't to add a resource to a Pagelet, you can now built a new resource object with the "CSS" or "JS" class (the "Resource" class is abstract and the parent class of "CSS" and "JS") and can add PhaseDoneJS callbacks for this resources with "Resource::addPhaseDoneJS()" similar to "Pagelet::addPhaseDoneJS()". To add the resource to your pagelet: "$Pagelet->addResource($Resource)". Of course, you can still use the two SHORT methods "Pagelet::addCSS()" and "Pagelet::addJS()" which needs only one parameter with the resource URL. + Each resource has now PhaseDoneJS callbacks for 3 phases (Object initializied [INIT], Loading started [LOAD], Loading complete [DONE]). + Check your usage of the PhaseDoneJS callback constants of the Pagelet class: These constants have been renamed. + Debugging mode: Just set BigPipe::debugging(TRUE) and each pagelet and resource will be pass through a function which adds PhaseDoneJS callbacks with debug informations (Look now at the Javascript console and enjoy the beautiful colors which makes the debug informations better readable for your eyes. \(o_o)/). + Several code improvements on almost all files.
Diffstat (limited to 'include')
-rwxr-xr-xinclude/classes/BigPipe/BigPipe.php105
-rwxr-xr-xinclude/classes/BigPipe/DemoPagelet.php17
-rwxr-xr-xinclude/classes/BigPipe/Pagelet.php74
-rwxr-xr-xinclude/classes/BigPipe/Resource.php74
-rw-r--r--include/classes/BigPipe/Resource/CSS.php20
-rw-r--r--include/classes/BigPipe/Resource/JS.php20
-rw-r--r--include/pagelets.php13
7 files changed, 252 insertions, 71 deletions
diff --git a/include/classes/BigPipe/BigPipe.php b/include/classes/BigPipe/BigPipe.php
index 1af4d8a..082ca14 100755
--- a/include/classes/BigPipe/BigPipe.php
+++ b/include/classes/BigPipe/BigPipe.php
@@ -2,23 +2,31 @@
namespace BigPipe;
class BigPipe {
- private static $enabled = TRUE;
- private static $debug = TRUE;
- private static $pagelets = [];
- private static $count = 0;
+ private static $debugging = FALSE;
+ private static $enabled = TRUE;
+ private static $pagelets = [];
+ private static $count = 0;
#===============================================================================
- # Return TRUE if the pipeline is enabled
+ # Enable or disable the pipeline mode
#===============================================================================
- public static function isEnabled() {
+ public static function enabled($change = NULL) {
+ if($change !== NULL) {
+ self::$enabled = (bool) $change;
+ }
+
return self::$enabled;
}
#===============================================================================
- # Enable or disable the pipeline mode
+ # Return if debugging is enabled or change
#===============================================================================
- public static function enablePipeline($enabled = TRUE) {
- return self::$enabled = (bool) $enabled;
+ public static function debugging($change = NULL): bool {
+ if($change !== NULL) {
+ self::$debugging = (bool) $change;
+ }
+
+ return self::$debugging;
}
#===============================================================================
@@ -33,20 +41,45 @@ class BigPipe {
# Prints a single pagelet response
#===============================================================================
private static function singleResponse(Pagelet $Pagelet, $last = FALSE) {
+ if(self::debugging()) {
+ self::addDebugPhaseDoneJS($Pagelet);
+
+ array_map('self::addDebugPhaseDoneJS', $Pagelet->getCSSResources());
+ array_map('self::addDebugPhaseDoneJS', $Pagelet->getJSResources());
+
+ usleep(rand(125, 175) * 2000);
+ }
+
+ $stylesheets = [];
+ $javascripts = [];
+
+ foreach($Pagelet->getCSSResources() as $Resource) {
+ $stylesheets[$Resource->getURL()] = $Resource->getPhaseDoneJS();
+ }
+
+ foreach($Pagelet->getJSResources() as $Resource) {
+ $javascripts[$Resource->getURL()] = $Resource->getPhaseDoneJS();
+ }
+
$pageletJSON = [
- 'ID' => $Pagelet->getID(), 'NEED' => $Pagelet->getDependencies(),
- 'RESOURCES' => ['CSS' => $Pagelet->getCSSFiles(), 'JS' => $Pagelet->getJSFiles(), 'JS_CODE' => removeLineBreaksAndTabs($Pagelet->getJSCode())],
- 'PHASES' => (object) $Pagelet->getPhaseDoneJS()
+ 'ID' => $Pagelet->getID(),
+ 'NEED' => $Pagelet->getDependencies(),
+ 'RSRC' => (object) [
+ Resource::TYPE_STYLESHEET => (object) $stylesheets,
+ Resource::TYPE_JAVASCRIPT => (object) $javascripts,
+ ],
+ 'CODE' => removeLineBreaksAndTabs($Pagelet->getJSCode()),
+ 'PHASE' => $Pagelet->getPhaseDoneJS()
];
if($last) {
- $pageletJSON['IS_LAST'] = true;
+ $pageletJSON['IS_LAST'] = TRUE;
}
$pageletHTML = removeLineBreaksAndTabs($Pagelet->getHTML());
$pageletHTML = str_replace('--', '&#45;&#45;', $pageletHTML);
- $pageletJSON = json_encode($pageletJSON, (self::$debug ? JSON_PRETTY_PRINT : NULL));
+ $pageletJSON = json_encode($pageletJSON, (self::debugging() ? JSON_PRETTY_PRINT : NULL));
echo "<code class=\"hidden\" id=\"_{$Pagelet->getID()}\"><!-- {$pageletHTML} --></code>\n";
echo "<script>BigPipe.onPageletArrive({$pageletJSON}, document.getElementById(\"_{$Pagelet->getID()}\"));</script>\n\n";
@@ -71,13 +104,13 @@ class BigPipe {
foreach(array_reverse(self::$pagelets) as $priority => $pagelets) {
foreach($pagelets as $Pagelet) {
- if(!self::isEnabled()) {
- foreach($Pagelet->getCSSFiles() as $CSSFile) {
- echo "<link href=\"{$CSSFile}\" rel=\"stylesheet\" />\n";
+ if(!self::enabled()) {
+ foreach($Pagelet->getCSSResources() as $Resource) {
+ echo $Resource->renderHTML()."\n";
}
- foreach($Pagelet->getJSFiles() as $JSFile) {
- echo "<script src=\"{$JSFile}\"></script>\n";
+ foreach($Pagelet->getJSResources() as $Resource) {
+ echo $Resource->renderHTML()."\n";
}
foreach($Pagelet->getJSCode() as $JSCode) {
@@ -88,10 +121,38 @@ class BigPipe {
else {
self::singleResponse($Pagelet, (self::$count === ++$i));
self::flushOutputBuffer();
-
- self::$debug AND usleep((rand(250, 1000) * 1000));
}
}
}
}
-} \ No newline at end of file
+
+ #===============================================================================
+ # Add PhaseDoneJS for debugging Pagelet and Resource
+ #===============================================================================
+ private static function addDebugPhaseDoneJS($Instance) {
+ $objpath = str_replace('\\', '|', get_class($Instance));
+
+ if($Instance instanceof Pagelet) {
+ $message = "console.log(\"%%c[{$objpath}]%%c#(%%c%s%%c): PhaseDoneJS for phase: %s\", \"font-weight:bold\", \"color:#666\", \"color:#008B45\", \"color:#666\")";
+
+ $Instance->addPhaseDoneJS($Instance::PHASE_INIT, sprintf($message, $Instance->getID(), 'INIT'));
+ $Instance->addPhaseDoneJS($Instance::PHASE_LOADCSS, sprintf($message, $Instance->getID(), 'LOADCSS'));
+ $Instance->addPhaseDoneJS($Instance::PHASE_HTML, sprintf($message, $Instance->getID(), 'HTML'));
+ $Instance->addPhaseDoneJS($Instance::PHASE_LOADJS, sprintf($message, $Instance->getID(), 'LOADJS'));
+ $Instance->addPhaseDoneJS($Instance::PHASE_DONE, sprintf($message, $Instance->getID(), 'DONE'));
+
+ return $Instance;
+ }
+
+ if($Instance instanceof Resource) {
+ $message = "console.log(\"[{$objpath}]%%c#(%%c%s%%c): PhaseDoneJS for phase: %s\", \"color:#666\", \"color:#008B45\", \"color:#666\")";
+
+ $Instance->addPhaseDoneJS($Instance::PHASE_INIT, sprintf($message, $Instance->getID(), 'INIT'));
+ $Instance->addPhaseDoneJS($Instance::PHASE_LOAD, sprintf($message, $Instance->getID(), 'LOAD'));
+ $Instance->addPhaseDoneJS($Instance::PHASE_DONE, sprintf($message, $Instance->getID(), 'DONE'));
+
+ return $Instance;
+ }
+ }
+}
+?> \ No newline at end of file
diff --git a/include/classes/BigPipe/DemoPagelet.php b/include/classes/BigPipe/DemoPagelet.php
deleted file mode 100755
index adb9f89..0000000
--- a/include/classes/BigPipe/DemoPagelet.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-namespace BigPipe;
-
-class DemoPagelet extends Pagelet {
-
- public function __construct($customID = NULL, $priority = Pagelet::PRIORITY_NORMAL, array $dependencies = []) {
- parent::__construct($customID, $priority, $dependencies);
-
- $message = '%s: PhaseDoneJS for phase %s';
-
- $this->addPhaseDoneJS(self::PHASE_ARRIVE, 'console.log("'.sprintf($message, $this->getID(), 'ARRIVE').'")');
- $this->addPhaseDoneJS(self::PHASE_LOADCSS, 'console.log("'.sprintf($message, $this->getID(), 'LOADCSS').'")');
- $this->addPhaseDoneJS(self::PHASE_PUTHTML, 'console.log("'.sprintf($message, $this->getID(), 'PUTHTML').'")');
- $this->addPhaseDoneJS(self::PHASE_LOADJS, 'console.log("'.sprintf($message, $this->getID(), 'LOADJS').'")');
- $this->addPhaseDoneJS(self::PHASE_EXECJS, 'console.log("'.sprintf($message, $this->getID(), 'EXECJS').'")');
- }
-} \ No newline at end of file
diff --git a/include/classes/BigPipe/Pagelet.php b/include/classes/BigPipe/Pagelet.php
index 436e12a..7502a02 100755
--- a/include/classes/BigPipe/Pagelet.php
+++ b/include/classes/BigPipe/Pagelet.php
@@ -2,11 +2,11 @@
namespace BigPipe;
class Pagelet {
- private $ID = NULL;
+ private $ID = '';
private $HTML = '';
private $JSCode = [];
- private $JSFiles = [];
- private $CSSFiles = [];
+ private $JSResources = [];
+ private $CSSResources = [];
private $phaseDoneJS = [];
private $dependencies = [];
private $tagname = 'div';
@@ -24,11 +24,11 @@ class Pagelet {
#===============================================================================
# Phase numbers for PhaseDoneJS
#===============================================================================
- const PHASE_ARRIVE = 0; # After the pagelet reached BigPipe
+ const PHASE_INIT = 0; # After the pagelet object was initialized
const PHASE_LOADCSS = 1; # After all the CSS resources have been loaded
- const PHASE_PUTHTML = 2; # After the HTML content has been injected into the placeholders
+ const PHASE_HTML = 2; # After the placeholder HTML was replaced
const PHASE_LOADJS = 3; # After all the JS resources have been loaded
- const PHASE_EXECJS = 4; # After the static JS code has been executed
+ const PHASE_DONE = 4; # After the static JS code has been executed
public function __construct($customID = NULL, $priority = self::PRIORITY_NORMAL, array $dependencies = []) {
$this->phaseDoneJS = array_pad($this->phaseDoneJS, 5, []);
@@ -53,20 +53,6 @@ class Pagelet {
}
#===============================================================================
- # Return the CSS resources
- #===============================================================================
- public function getCSSFiles() {
- return $this->CSSFiles;
- }
-
- #===============================================================================
- # Return the JS resources
- #===============================================================================
- public function getJSFiles() {
- return $this->JSFiles;
- }
-
- #===============================================================================
# Return the main JS code
#===============================================================================
public function getJSCode() {
@@ -81,17 +67,35 @@ class Pagelet {
}
#===============================================================================
- # Attach a CSS resource
+ # Add resource
+ #===============================================================================
+ public function addResource(Resource $Resource): Resource {
+ switch($Resource->getType()) {
+ case Resource::TYPE_STYLESHEET:
+ return $this->CSSResources[] = $Resource;
+ break;
+
+ case Resource::TYPE_JAVASCRIPT:
+ return $this->JSResources[] = $Resource;
+ break;
+
+ default:
+ return $Resource;
+ }
+ }
+
+ #===============================================================================
+ # Short: Add CSS resource by URL
#===============================================================================
- public function addCSS($href) {
- return $this->CSSFiles[] = $href;
+ public function addCSS($resourceURL): Resource {
+ return $this->addResource(new Resource\CSS($resourceURL));
}
#===============================================================================
- # Attach a JS resource
+ # Short: Add JS resource by URL
#===============================================================================
- public function addJS($href) {
- return $this->JSFiles[] = $href;
+ public function addJS($resourceURL): Resource {
+ return $this->addResource(new Resource\JS($resourceURL));
}
#===============================================================================
@@ -111,11 +115,25 @@ class Pagelet {
#===============================================================================
# Return all registered PhaseDoneJS callbacks
#===============================================================================
- public function getPhaseDoneJS() {
+ public function getPhaseDoneJS(): array {
return $this->phaseDoneJS;
}
#===============================================================================
+ # Return the attached CSS resources
+ #===============================================================================
+ public function getCSSResources(): array {
+ return $this->CSSResources;
+ }
+
+ #===============================================================================
+ # Return the attached JS resources
+ #===============================================================================
+ public function getJSResources(): array {
+ return $this->JSResources;
+ }
+
+ #===============================================================================
# Return all display dependencies
#===============================================================================
public function getDependencies(): array {
@@ -134,7 +152,7 @@ class Pagelet {
#===============================================================================
public function __toString() {
$pageletHTML = "<{$this->tagname} id=\"{$this->getID()}\">";
- $pageletHTML .= !BigPipe::isEnabled() ? $this->getHTML() : NULL;
+ $pageletHTML .= !BigPipe::enabled() ? $this->getHTML() : NULL;
$pageletHTML .= "</{$this->tagname}>";
return $pageletHTML;
diff --git a/include/classes/BigPipe/Resource.php b/include/classes/BigPipe/Resource.php
new file mode 100755
index 0000000..d93ad16
--- /dev/null
+++ b/include/classes/BigPipe/Resource.php
@@ -0,0 +1,74 @@
+<?php
+namespace BigPipe;
+
+abstract class Resource {
+ private $ID = '';
+ private $type = '';
+ private $resourceURL = '';
+ private $phaseDoneJS = [];
+ private static $count = 0;
+
+ #===============================================================================
+ # Render resource HTML for disabled pipeline
+ #===============================================================================
+ abstract public function renderHTML();
+
+ #===============================================================================
+ # Resource types
+ #===============================================================================
+ const TYPE_STYLESHEET = 0;
+ const TYPE_JAVASCRIPT = 1;
+
+ #===============================================================================
+ # Phase numbers for PhaseDoneJS
+ #===============================================================================
+ const PHASE_INIT = 0; # Resource object has been initialized
+ const PHASE_LOAD = 1; # Loading of resource has been started
+ const PHASE_DONE = 2; # Loading of resource is done.
+
+ #===============================================================================
+ # Build resource
+ #===============================================================================
+ public function __construct($type, $resourceURL) {
+ $this->phaseDoneJS = array_pad($this->phaseDoneJS, 3, []);
+ $this->ID = 'R'.++self::$count;
+ $this->type = $type;
+ $this->resourceURL = $resourceURL;
+ }
+
+ #===============================================================================
+ # Return the unique ID
+ #===============================================================================
+ public function getID() {
+ return $this->ID;
+ }
+
+ #===============================================================================
+ # Return the resource type
+ #===============================================================================
+ public function getType() {
+ return $this->type;
+ }
+
+ #===============================================================================
+ # Return the resource URL
+ #===============================================================================
+ public function getURL() {
+ return $this->resourceURL;
+ }
+
+ #===============================================================================
+ # Attach a PhaseDoneJS callback
+ #===============================================================================
+ public function addPhaseDoneJS($phase, $callback) {
+ return $this->phaseDoneJS[$phase][] = removeLineBreaksAndTabs($callback);
+ }
+
+ #===============================================================================
+ # Return all registered PhaseDoneJS callbacks
+ #===============================================================================
+ public function getPhaseDoneJS() {
+ return $this->phaseDoneJS;
+ }
+}
+?> \ No newline at end of file
diff --git a/include/classes/BigPipe/Resource/CSS.php b/include/classes/BigPipe/Resource/CSS.php
new file mode 100644
index 0000000..71d2244
--- /dev/null
+++ b/include/classes/BigPipe/Resource/CSS.php
@@ -0,0 +1,20 @@
+<?php
+namespace BigPipe\Resource;
+
+class CSS extends \BigPipe\Resource {
+
+ #===============================================================================
+ # Build resource
+ #===============================================================================
+ public function __construct($resourceURL) {
+ parent::__construct(parent::TYPE_STYLESHEET, $resourceURL);
+ }
+
+ #===============================================================================
+ # Render resource HTML
+ #===============================================================================
+ public function renderHTML() {
+ return sprintf('<link data-id="%s" href="%s" rel="stylesheet" />', $this->getID(), $this->getURL());
+ }
+}
+?> \ No newline at end of file
diff --git a/include/classes/BigPipe/Resource/JS.php b/include/classes/BigPipe/Resource/JS.php
new file mode 100644
index 0000000..f9e109b
--- /dev/null
+++ b/include/classes/BigPipe/Resource/JS.php
@@ -0,0 +1,20 @@
+<?php
+namespace BigPipe\Resource;
+
+class JS extends \BigPipe\Resource {
+
+ #===============================================================================
+ # Build resource
+ #===============================================================================
+ public function __construct($resourceURL) {
+ parent::__construct(parent::TYPE_JAVASCRIPT, $resourceURL);
+ }
+
+ #===============================================================================
+ # Render resource HTML
+ #===============================================================================
+ public function renderHTML() {
+ return sprintf('<script data-id="%s" src="%s"></script>', $this->getID(), $this->getURL());
+ }
+}
+?> \ No newline at end of file
diff --git a/include/pagelets.php b/include/pagelets.php
index 176bc74..9725879 100644
--- a/include/pagelets.php
+++ b/include/pagelets.php
@@ -1,8 +1,13 @@
<?php
#===============================================================================
+# Enable debugging mode
+#===============================================================================
+BigPipe\BigPipe::debugging(TRUE);
+
+#===============================================================================
# Pagelet with red background color
#===============================================================================
-$PageletRed = new BigPipe\DemoPagelet('redPL');
+$PageletRed = new BigPipe\Pagelet('redPL');
$PageletRed->addHTML('<section id="red" class="text">I AM A PAGELET WITH RED BACKGROUND</section>');
$PageletRed->addCSS('static/red.php');
$PageletRed->addCSS('static/red.php');
@@ -12,7 +17,7 @@ $PageletRed->addJSCode("document.getElementById('red').innerHTML += ' [JS execut
#===============================================================================
# Pagelet with blue background color
#===============================================================================
-$PageletBlue = new BigPipe\DemoPagelet('bluePL', BigPipe\Pagelet::PRIORITY_HIGH);
+$PageletBlue = new BigPipe\Pagelet('bluePL', BigPipe\Pagelet::PRIORITY_HIGH);
$PageletBlue->addHTML('<section id="blue" class="text">I AM A PAGELET WITH BLUE BACKGROUND</section>');
$PageletBlue->addCSS('static/blue.php');
$PageletRed->addCSS('static/red.php');
@@ -22,7 +27,7 @@ $PageletBlue->addJSCode("document.getElementById('blue').innerHTML += ' [JS exec
#===============================================================================
# Pagelet with green background color
#===============================================================================
-$PageletGreen = new BigPipe\DemoPagelet('greenPL');
+$PageletGreen = new BigPipe\Pagelet('greenPL');
{
#===============================================================================
@@ -39,7 +44,7 @@ $PageletGreen = new BigPipe\DemoPagelet('greenPL');
// the first which arrives, but it will first be displayed if his dependency
// pagelets are already displayed.
- $InnerPagelet = new BigPipe\DemoPagelet('innerPL', BigPipe\Pagelet::PRIORITY_HIGHEST, [$PageletGreen->getID()]);
+ $InnerPagelet = new BigPipe\Pagelet('innerPL', BigPipe\Pagelet::PRIORITY_HIGHEST, [$PageletGreen->getID()]);
$InnerPagelet->addHTML('<section sytle="background:#FFF;padding:5px;">Inner Pagelet \(o_o)/</section>');
}