* @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);
}
}