* @license PHP License * @package WB * @subpackage service */ WBClass::load('WBService'); /** * Deliver site's html * * @version 0.8.1 * @package WB * @subpackage service */ class WBService_Site extends WBService { /** * decide whether to select locale settings from path * @var bool */ protected $useI18nFromPath = true; /** * Display * * @param int $status * @param mixed $data to be send * @param string $checksum * @return bool true */ public function run(&$status, &$data, &$checksum = null) { // browser must revalidate $this->res->setCacheControl(WBResponse::CACHECONTROL_MUSTREVALIDATE); $this->res->setMaxAge(600); // keep path in session $this->sess->set('wb/service/path/site', $this->req->path); /** @var WBStatistic_LinkTracker */ $lt = WBClass::create('WBStatistic_LinkTracker'); $lt->add(); $rUrl = $lt->redirect(); if (!empty($rUrl)){ $this->res->addHeader('Location', $rUrl); $data = str_replace('{URL}', $rUrl, 'Please continue at {URL}. Thank you.'); $status = 301; return true; } // load page config $params = $this->conf->get('content'); $this->processPath($params, $this->path); $this->processPathRequest($params, $this->path); $this->processEvents($params); $this->addJavaScript(); /** @var patTemplate */ $tmpl = WBClass::create('patTemplate'); $tmpl->readTemplatesFromInput($this->conf->get('skin/tmpl', 'main') . '.tmpl'); $this->cont = WBClass::create('WBContent_Composite'); $this->cont->setEnvironment(WBContent::ENV_SITE); $this->cont->configure( '', $params, array() ); $params = $this->cont->run(); $tmpl->addGlobalVar('area_content', $this->cont->getString()); $tmpl->addGlobalVars($this->cont->getBubbles()); $head = $this->getAlternativeLanguageURLs(); $head[] = WBHtml::get(WBHtml::AREA_HEAD); $head = implode("\n", $head); $tmpl->addGlobalVar('area_head', $head); $tmpl->addGlobalVar('area_foot', WBHtml::get(WBHtml::AREA_FOOT)); $tmpl->addGlobalVar('area_js_onload', WBHtml::get(WBHtml::AREA_JS_ONLOAD)); $data = $tmpl->getParsedTemplate('page'); $status = $this->cont->getStatusCode(); $this->res->useCache($this->cont->isCachable()); // save parameters in session which allows to continue using AJAX $paramName = md5($this->part . ':params:' . WBParam::get('wb/dir/base')); $this->sess->set($paramName, $params); $stat = WBClass::create('WBStatistic_View'); $stat->addPath(implode('/', $this->path)); return true; } /** * Get List of Alternate Language URLs * * Build list of alternate URLs for HTML header and add HTTP-Link header * for same URLs * * @return array */ private function getAlternativeLanguageURLs() { $alt = array(); $head = array(); if (!$this->useI18nFromPath) { return $alt; } $requestPath = $this->confLocale->get('locale/languages/requestpath', array()); if (empty($requestPath)) { return $alt; } $site = implode('/', $this->path); foreach ($requestPath as $lang => $path) { $lang = explode('_', strtolower($lang)); if ('__default' == $path) { $alt[] = sprintf('', $lang[0], $site); $head[] = sprintf('<[[PROTOCOL]]://[[SERVER]][[SELF_NO_LANG]]%s>; rel="alternate; hreflang="%s"', $site, $lang[0]); continue; } $alt[] = sprintf('', $lang[0], $path, $site); $head[] = sprintf('<[[PROTOCOL]]://[[SERVER]][[SELF_NO_LANG]]%s/%s>; rel="alternate; hreflang="%s"', $path, $site, $lang[0]); } $alt[] = sprintf('', $site); $head[] = sprintf('<[[PROTOCOL]]://[[SERVER]][[SELF_NO_LANG]]%s>; rel="alternate; hreflang="x-default"', $site); $this->res->addHeader('Link', implode(', ', $head)); return $alt; } /** * load prototypish javascipt files * * Originally Wombat used prootype.js. Hence all classes are * base on prototype features. Still you can override this method * to implement some custom WB-classes. * * This method loads the list of javascript includes from site.xml * (depending on current part) * * @todo consider addeing more str_replace textes */ protected function addJavaScript() { WBClass::load('WBHtml_JS'); $javascript = $this->conf->get('javascript', array()); if (isset($javascript['include'])) { if (!is_array($javascript['include'])) { $javascript['include'] = array(); } foreach ($javascript['include'] as $inc) { WBHtml_JS::add($inc); } } if (isset($javascript['includedefer'])) { if (!is_array($javascript['includedefer'])) { $javascript['includedefer'] = array(); } foreach ($javascript['includedefer'] as $inc) { WBHtml_JS::add($inc, WBHtml_JS::AREA_INCLUDE_DEFER); } } if (isset($javascript['onload'])) { $search = array(); $replace = array(); if ($this->useI18n) { $search[] = '{LANG_COMPLETE}'; $replace[] = patI18n::getLocale(patI18n::LOCALE_TYPE_COMPLETE); } $onload = str_replace($search, $replace, $javascript['onload']); WBHtml_JS::add($onload, WBHtml_JS::AREA_ONLOAD); } } /** * process queued events * * @param array $params * @return bool always true */ protected function processEvents(&$params) { $queue = $this->getEventQueue(); if (empty($queue)) { return true; } $log = array( 'process' => 'event', 'part' => $this->part, 'path' => implode('/', $this->path), 'event' => '', ); $allowed = $this->conf->get('events', array()); if (!is_array($allowed)) { $allowed = array($allowed); } $conf = WBClass::create('WBConfig'); /** @var $conf WBConfig */ $conf->setLoader($this->conf->getLoader()->getName()); foreach ($queue as $q) { if (!isset($allowed[$q['name']])) { continue; } // override if (!isset($allowed[$q['name']]['override'])) { continue; } if (!$conf->load($this->part . '/event/' . $q['name'], true)) { continue; } $log['event'] = $q['name']; $this->log->notice($log); $page = $conf->get(); $this->overrideAreas($params, $page, array()); } $this->flushEventQueue(); return true; } }