] # #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# # # # [More information coming soon] # # # #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# namespace BigPipe; class Pagelet extends Item { private $HTML = ''; private $JSCode = []; private $priority = NULL; private $resources = []; private $dependencies = []; private $tagname = 'div'; private $tagHTML = ''; #=============================================================================== # Priorities for pagelet sorting #=============================================================================== const PRIORITY_HIGHEST = 100; const PRIORITY_HIGH = 75; const PRIORITY_NORMAL = 50; const PRIORITY_LOW = 25; const PRIORITY_LOWEST = 0; #=============================================================================== # Phase numbers for PhaseDoneJS #=============================================================================== const PHASE_INIT = 0; # After the pagelet object was initialized const PHASE_LOADCSS = 1; # After all the CSS resources have been loaded const PHASE_HTML = 2; # After the placeholder HTML was replaced const PHASE_LOADJS = 3; # After all the JS resources have been loaded const PHASE_DONE = 4; # After the static JS code has been executed public function __construct($customID = NULL, $priority = self::PRIORITY_NORMAL) { $this->ID = $customID ?? spl_object_hash($this); $this->priority = $priority; $this->resources = array_pad($this->resources, 2, []); $this->phaseDoneJS = array_pad($this->phaseDoneJS, 5, []); BigPipe::enqueue($this); } #=============================================================================== # Return the priority #=============================================================================== public function getPriority() { return $this->priority; } #=============================================================================== # Return the HTML content #=============================================================================== public function getHTML() { return $this->HTML; } #=============================================================================== # Return the main JS code #=============================================================================== public function getJSCode(): array { return $this->JSCode; } #=============================================================================== # Return attached resources #=============================================================================== public function getResources(): array { return $this->resources; } #=============================================================================== # Return all display dependencies #=============================================================================== public function getDependencies(): array { return array_unique($this->dependencies); } #=============================================================================== # Add HTML or attach more #=============================================================================== public function addHTML($HTML) { return $this->HTML .= $HTML; } #=============================================================================== # Add resource #=============================================================================== public function addResource(Resource $Resource): Resource { return $this->resources[$Resource->getType()][] = $Resource; } #=============================================================================== # Attach a main JS code part #=============================================================================== public function addJSCode($code) { return $this->JSCode[] = $code; } #=============================================================================== # Attach a display dependency #=============================================================================== public function addDependency(Pagelet $Pagelet) { return $this->dependencies[] = $Pagelet->getID(); } #=============================================================================== # Set custom placeholder tagname #=============================================================================== public function setTagname($tagname) { return $this->tagname = $tagname; } #=============================================================================== # Set custom placeholder HTML #=============================================================================== public function setPlaceholderHTML($HTML) { return $this->tagHTML = $HTML; } #=============================================================================== # Return the pagelet structure #=============================================================================== public function getStructure(): array { foreach($this->getResources()[Resource::TYPE_STYLESHEET] as $Resource) { $stylesheets[] = $Resource->getStructure(); } foreach($this->getResources()[Resource::TYPE_JAVASCRIPT] as $Resource) { $javascripts[] = $Resource->getStructure(); } return [ 'ID' => $this->getID(), 'NEED' => $this->getDependencies(), 'RSRC' => [ Resource::TYPE_STYLESHEET => $stylesheets ?? [], Resource::TYPE_JAVASCRIPT => $javascripts ?? [] ], 'CODE' => $this->getJSCode(), 'PHASE' => $this->getPhaseDoneJS() ]; } #=============================================================================== # Flush pagelet immediately #=============================================================================== public function flush() { if(BigPipe::enabled()) { $pageletHTML = str_replace(["\r", "\n", "\t"], '', $this->getHTML()); $pageletHTML = str_replace('--', '--', $pageletHTML); $pageletJSON = json_encode($this->getStructure()); echo "\n"; echo "\n\n"; BigPipe::dequeue($this); BigPipe::flushOutputBuffer(); } } #=============================================================================== # Magic method: __toString() #=============================================================================== public function __toString() { $pageletHTML = "<{$this->tagname} id=\"{$this->getID()}\">"; $pageletHTML .= !BigPipe::enabled() ? $this->getHTML() : $this->tagHTML; $pageletHTML .= "tagname}>"; return $pageletHTML; } }