* @version SVN: $Id$ */ class tsTitleViewConfigHandler extends sfViewConfigHandler { /** * Executes this configuration handler. * * @param array $configFiles An array of absolute filesystem path to a configuration file * * @return string Data to be written to a cache file * * @throws sfConfigurationException If a requested configuration file does not exist or is not readable * @throws sfParseException If a requested configuration file is improperly formatted * @throws sfInitializationException If a view.yml key check fails */ public function execute($configFiles) { //parse the yaml $this->yamlConfig = self::getConfiguration($configFiles); // init our data array $data = array(); $data[] = "\$response = \$this->context->getResponse();\n\n"; // first pass: iterate through all view names to determine the real view name $first = true; foreach ($this->yamlConfig as $viewName => $values) { if ($viewName == 'all') { continue; } $data[] = ($first ? '' : 'else ')."if (\$this->actionName.\$this->viewName == '$viewName')\n". "{\n"; $data[] = $this->addTemplate($viewName); $data[] = "}\n"; $first = false; } // general view configuration $data[] = ($first ? '' : "else\n{")."\n"; $data[] = $this->addTemplate($viewName); $data[] = ($first ? '' : "}")."\n\n"; // second pass: iterate through all real view names $first = true; foreach ($this->yamlConfig as $viewName => $values) { if ($viewName == 'all') { continue; } $data[] = ($first ? '' : 'else ')."if (\$templateName.\$this->viewName == '$viewName')\n". "{\n"; $data[] = $this->addLayout($viewName); $data[] = $this->addComponentSlots($viewName); $data[] = $this->addHtmlHead($viewName); $data[] = $this->addHtmlTitle($viewName); $data[] = $this->addEscaping($viewName); $data[] = $this->addHtmlAsset($viewName); $data[] = "}\n"; $first = false; } // general view configuration $data[] = ($first ? '' : "else\n{")."\n"; $data[] = $this->addLayout(); $data[] = $this->addComponentSlots(); $data[] = $this->addHtmlHead(); $data[] = $this->addHtmlTitle(); $data[] = $this->addEscaping(); $data[] = $this->addHtmlAsset(); $data[] = ($first ? '' : "}")."\n"; // compile data $retval = sprintf("mergeConfigValue('http_metas', $viewName) as $httpequiv => $content) { $data[] = sprintf(" \$response->addHttpMeta('%s', '%s', false);", $httpequiv, str_replace('\'', '\\\'', $content)); } foreach ($this->mergeConfigValue('metas', $viewName) as $name => $content) { if ($name != 'title') { $data[] = sprintf(" \$response->addMeta('%s', '%s', false, false);", $name, str_replace('\'', '\\\'', preg_replace('/&(?=\w+;)/', '&', htmlspecialchars($content, ENT_QUOTES, sfConfig::get('sf_charset'))))); } } return implode("\n", $data)."\n"; } /** * Adds metas title statements to the data. * * @param string $viewName The view name * * @return string The PHP statement */ protected function addHtmlTitle($viewName = '') { $data = array(); $keyName = 'title'; $values = array(); if (isset($this->yamlConfig['all']['metas'][$keyName])) { $values = is_array($this->yamlConfig['all']['metas'][$keyName]) ? $this->yamlConfig['all']['metas'][$keyName] : array($this->yamlConfig['all']['metas'][$keyName]); } if ($viewName && isset($this->yamlConfig[$viewName]['metas'][$keyName])) { $values = array_merge($values, is_array($this->yamlConfig[$viewName]['metas'][$keyName]) ? $this->yamlConfig[$viewName]['metas'][$keyName] : array($this->yamlConfig[$viewName]['metas'][$keyName])); } $values = array_reverse(array_filter($values)); foreach ($values as $part) { $data[] = sprintf(" \$response->getTitle()->unshift('%s');", str_replace('\'', '\\\'', preg_replace('/&(?=\w+;)/', '&', htmlspecialchars($part, ENT_QUOTES, sfConfig::get('sf_charset'))))); } return implode("\n", $data)."\n"; } /** * @see sfConfigHandler */ static public function getConfiguration(array $configFiles) { return self::mergeConfig(self::parseYamls($configFiles)); } static protected function mergeConfig($config) { // merge javascripts and stylesheets $config['all']['stylesheets'] = array_merge(isset($config['default']['stylesheets']) && is_array($config['default']['stylesheets']) ? $config['default']['stylesheets'] : array(), isset($config['all']['stylesheets']) && is_array($config['all']['stylesheets']) ? $config['all']['stylesheets'] : array()); unset($config['default']['stylesheets']); $config['all']['javascripts'] = array_merge(isset($config['default']['javascripts']) && is_array($config['default']['javascripts']) ? $config['default']['javascripts'] : array(), isset($config['all']['javascripts']) && is_array($config['all']['javascripts']) ? $config['all']['javascripts'] : array()); unset($config['default']['javascripts']); $config['all']['metas']['title'] = array_merge( isset($config['default']['metas']['title']) && is_array($config['default']['metas']['title']) ? $config['default']['metas']['title'] : (isset($config['default']['metas']['title']) ? array($config['default']['metas']['title']) : array()), isset($config['all']['metas']['title']) && is_array($config['all']['metas']['title']) ? $config['all']['metas']['title'] : (isset($config['all']['metas']['title']) ? array($config['all']['metas']['title']) : array()) ); unset($config['default']['metas']['title']); // merge default and all $config['all'] = sfToolkit::arrayDeepMerge( isset($config['default']) && is_array($config['default']) ? $config['default'] : array(), isset($config['all']) && is_array($config['all']) ? $config['all'] : array() ); unset($config['default']); return self::replaceConstants($config); } }