/**
* Attempts to return the theme for the current request
*
* This first throws a sympal.theme.set_theme_from_request event, giving
* anyone the opportunity to determine the theme. If this event is not
* handled, we continue with some default rules for setting themes.
*
* @param sfContext $context
* @param array An array of valid themes, to be used for user-entered themes
*
* @return string The theme (defaults to the default theme)
*/
public function getThemeForRequest(sfContext $context, $validThemes)
{
$event = $context->getEventDispatcher()->notifyUntil(new sfEvent($this, 'theme.set_theme_from_request', array('context' => $context)));
if ($event->isProcessed()) {
return $event->getReturnValue();
}
if ($this->getOption('allow_changing_theme_by_url', true)) {
$user = $context->getUser();
$request = $context->getRequest();
if ($theme = $request->getParameter($this->getOption('theme_request_parameter_name', 'sf_theme'))) {
// make sure the theme is valid
if (in_array($theme, $validThemes)) {
$user->setCurrentTheme($theme);
return $theme;
} else {
// unset the user attribute
$user->setCurrentTheme(false);
}
}
if ($theme = $user->getCurrentTheme()) {
return $theme;
}
}
// Get the theme from module/route. False is a valid response (don't set theme)
$module = $context->getModuleName();
$route = $context->getRouting()->getCurrentRouteName();
$theme = $this->getThemeFromConfig($module, $route);
if ($theme || $theme === false) {
return $theme;
}
return $this->getOption('default_theme');
}