metadataBlock = (int)$_REQUEST['__metablock__']; } } public function addMetadata($metadata) { $id = count($this->metadata); $this->metadata[$id] = $metadata; return $this->metadataBlock.'_'.$id; } public function getMetadataBlock() { return $this->metadataBlock; } public function initBehavior($behavior, array $config = array()) { $this->requireResource('javelin-behavior-'.$behavior); $this->behaviors[$behavior][] = $config; return $this; } public function requireResource($symbol) { $this->symbols[$symbol] = true; $this->needsResolve = true; return $this; } private function resolveResources() { if ($this->needsResolve) { $map = CelerityResourceMap::getInstance(); $this->resolved = $map->resolveResources(array_keys($this->symbols)); $this->packaged = $map->packageResources($this->resolved); $this->needsResolve = false; } return $this; } public function renderResourcesOfType($type) { $this->resolveResources(); $output = array(); foreach ($this->packaged as $resource) { if ($resource['type'] == $type) { $output[] = $this->renderResource($resource); } } return implode("\n", $output); } private function renderResource(array $resource) { switch ($resource['type']) { case 'css': $path = phutil_escape_html($resource['uri']); return ''; case 'js': $path = phutil_escape_html($resource['uri']); return ''; } throw new Exception("Unable to render resource."); } public function renderHTMLFooter() { $data = array(); if ($this->metadata) { $json_metadata = json_encode($this->metadata); $this->metadata = array(); } else { $json_metadata = '{}'; } // Even if there is no metadata on the page, Javelin uses the mergeData() // call to start dispatching the event queue. $data[] = 'JX.Stratcom.mergeData('.$this->metadataBlock.', '. $json_metadata.');'; $onload = array(); if ($this->behaviors) { $behavior = json_encode($this->behaviors); $onload[] = 'JX.initBehaviors('.$behavior.')'; $this->behaviors = array(); } if ($onload) { foreach ($onload as $func) { $data[] = 'JX.onload(function(){'.$func.'});'; } } if ($data) { $data = implode("\n", $data); return ''; } else { return ''; } } public function renderAjaxResponse($payload, $error = null) { $response = array( 'error' => $error, 'payload' => $payload, ); if ($this->metadata) { $response['javelin_metadata'] = $this->metadata; $this->metadata = array(); } if ($this->behaviors) { $response['javelin_behaviors'] = $this->behaviors; $this->behaviors = array(); } $response = 'for (;;);'.json_encode($response); return $response; } }