--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/thd/cache/frontend/prod/config/config_core_compile.yml.php Tue Sep 22 16:40:38 2009 +0200
@@ -0,0 +1,4062 @@
+<?php
+// auto-generated by sfCompileConfigHandler
+// date: 2009/09/16 12:26:20
+
+
+class sfAutoload
+{
+ static protected
+ $freshCache = false,
+ $instance = null;
+ protected
+ $overriden = array(),
+ $classes = array();
+ protected function __construct()
+ {
+ }
+ static public function getInstance()
+ {
+ if (!isset(self::$instance))
+ {
+ self::$instance = new sfAutoload();
+ }
+ return self::$instance;
+ }
+ static public function register()
+ {
+ ini_set('unserialize_callback_func', 'spl_autoload_call');
+ if (false === spl_autoload_register(array(self::getInstance(), 'autoload')))
+ {
+ throw new sfException(sprintf('Unable to register %s::autoload as an autoloading method.', get_class(self::getInstance())));
+ }
+ }
+ static public function unregister()
+ {
+ spl_autoload_unregister(array(self::getInstance(), 'autoload'));
+ }
+ public function setClassPath($class, $path)
+ {
+ $this->overriden[$class] = $path;
+ $this->classes[$class] = $path;
+ }
+ public function getClassPath($class)
+ {
+ return isset($this->classes[$class]) ? $this->classes[$class] : null;
+ }
+ public function reloadClasses($force = false)
+ {
+ if (self::$freshCache)
+ {
+ return;
+ }
+ $configuration = sfProjectConfiguration::getActive();
+ if (!$configuration || !$configuration instanceof sfApplicationConfiguration)
+ {
+ return;
+ }
+ self::$freshCache = true;
+ if (file_exists($configuration->getConfigCache()->getCacheName('config/autoload.yml')))
+ {
+ self::$freshCache = false;
+ if ($force)
+ {
+ unlink($configuration->getConfigCache()->getCacheName('config/autoload.yml'));
+ }
+ }
+ $file = $configuration->getConfigCache()->checkConfig('config/autoload.yml');
+ $this->classes = include($file);
+ foreach ($this->overriden as $class => $path)
+ {
+ $this->classes[$class] = $path;
+ }
+ }
+ public function autoload($class)
+ {
+ if (!$this->classes)
+ {
+ self::reloadClasses();
+ }
+ return self::loadClass($class);
+ }
+ public function autoloadAgain($class)
+ {
+ self::reloadClasses(true);
+ return self::loadClass($class);
+ }
+ public function loadClass($class)
+ {
+ if (class_exists($class, false) || interface_exists($class, false))
+ {
+ return true;
+ }
+ if (isset($this->classes[$class]))
+ {
+ require($this->classes[$class]);
+ return true;
+ }
+ if (sfContext::hasInstance() && ($module = sfContext::getInstance()->getModuleName()) && isset($this->classes[$module.'/'.$class]))
+ {
+ require($this->classes[$module.'/'.$class]);
+ return true;
+ }
+ return false;
+ }
+}
+
+
+abstract class sfComponent
+{
+ protected
+ $moduleName = '',
+ $actionName = '',
+ $context = null,
+ $dispatcher = null,
+ $request = null,
+ $response = null,
+ $varHolder = null,
+ $requestParameterHolder = null;
+ public function __construct($context, $moduleName, $actionName)
+ {
+ $this->initialize($context, $moduleName, $actionName);
+ }
+ public function initialize($context, $moduleName, $actionName)
+ {
+ $this->moduleName = $moduleName;
+ $this->actionName = $actionName;
+ $this->context = $context;
+ $this->dispatcher = $context->getEventDispatcher();
+ $this->varHolder = new sfParameterHolder();
+ $this->request = $context->getRequest();
+ $this->response = $context->getResponse();
+ $this->requestParameterHolder = $this->request->getParameterHolder();
+ }
+ abstract function execute($request);
+ public function getModuleName()
+ {
+ return $this->moduleName;
+ }
+ public function getActionName()
+ {
+ return $this->actionName;
+ }
+ public final function getContext()
+ {
+ return $this->context;
+ }
+ public final function getLogger()
+ {
+ return $this->context->getLogger();
+ }
+ public function logMessage($message, $priority = 'info')
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array($message, 'priority' => constant('sfLogger::'.strtoupper($priority)))));
+ }
+ }
+ public function debugMessage($message)
+ {
+ if (sfConfig::get('sf_web_debug') && sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent(null, 'application.log', array('This feature is deprecated in favor of the log_message helper.', 'priority' => sfLogger::ERR)));
+ }
+ }
+ public function getRequestParameter($name, $default = null)
+ {
+ return $this->requestParameterHolder->get($name, $default);
+ }
+ public function hasRequestParameter($name)
+ {
+ return $this->requestParameterHolder->has($name);
+ }
+ public function getRequest()
+ {
+ return $this->request;
+ }
+ public function getResponse()
+ {
+ return $this->response;
+ }
+ public function getController()
+ {
+ return $this->context->getController();
+ }
+ public function generateUrl($route, $params = array(), $absolute = false)
+ {
+ return $this->context->getRouting()->generate($route, $params, $absolute);
+ }
+ public function getUser()
+ {
+ return $this->context->getUser();
+ }
+ public function setVar($name, $value, $safe = false)
+ {
+ $this->varHolder->set($name, $safe ? new sfOutputEscaperSafe($value) : $value);
+ }
+ public function getVar($name)
+ {
+ return $this->varHolder->get($name);
+ }
+ public function getVarHolder()
+ {
+ return $this->varHolder;
+ }
+ public function __set($key, $value)
+ {
+ return $this->varHolder->setByRef($key, $value);
+ }
+ public function & __get($key)
+ {
+ return $this->varHolder->get($key);
+ }
+ public function __isset($name)
+ {
+ return $this->varHolder->has($name);
+ }
+ public function __unset($name)
+ {
+ $this->varHolder->remove($name);
+ }
+ public function __call($method, $arguments)
+ {
+ $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'component.method_not_found', array('method' => $method, 'arguments' => $arguments)));
+ if (!$event->isProcessed())
+ {
+ throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
+ }
+ return $event->getReturnValue();
+ }
+}
+
+
+abstract class sfAction extends sfComponent
+{
+ protected
+ $security = array();
+ public function initialize($context, $moduleName, $actionName)
+ {
+ parent::initialize($context, $moduleName, $actionName);
+ if ($file = $context->getConfigCache()->checkConfig('modules/'.$this->getModuleName().'/config/security.yml', true))
+ {
+ require($file);
+ }
+ }
+ public function preExecute()
+ {
+ }
+ public function postExecute()
+ {
+ }
+ public function forward404($message = null)
+ {
+ throw new sfError404Exception($this->get404Message($message));
+ }
+ public function forward404Unless($condition, $message = null)
+ {
+ if (!$condition)
+ {
+ throw new sfError404Exception($this->get404Message($message));
+ }
+ }
+ public function forward404If($condition, $message = null)
+ {
+ if ($condition)
+ {
+ throw new sfError404Exception($this->get404Message($message));
+ }
+ }
+ public function redirect404()
+ {
+ return $this->redirect('/'.sfConfig::get('sf_error_404_module').'/'.sfConfig::get('sf_error_404_action'));
+ }
+ public function forward($module, $action)
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Forward to action "%s/%s"', $module, $action))));
+ }
+ $this->getController()->forward($module, $action);
+ throw new sfStopException();
+ }
+ public function forwardIf($condition, $module, $action)
+ {
+ if ($condition)
+ {
+ $this->forward($module, $action);
+ }
+ }
+ public function forwardUnless($condition, $module, $action)
+ {
+ if (!$condition)
+ {
+ $this->forward($module, $action);
+ }
+ }
+ public function redirect($url, $statusCode = 302)
+ {
+ $this->getController()->redirect($url, 0, $statusCode);
+ throw new sfStopException();
+ }
+ public function redirectIf($condition, $url, $statusCode = 302)
+ {
+ if ($condition)
+ {
+ $this->redirect($url, $statusCode);
+ }
+ }
+ public function redirectUnless($condition, $url, $statusCode = 302)
+ {
+ if (!$condition)
+ {
+ $this->redirect($url, $statusCode);
+ }
+ }
+ public function renderText($text)
+ {
+ $this->getResponse()->setContent($this->getResponse()->getContent().$text);
+ return sfView::NONE;
+ }
+ public function getPartial($templateName, $vars = null)
+ {
+ $this->getContext()->getConfiguration()->loadHelpers('Partial');
+ $vars = !is_null($vars) ? $vars : $this->varHolder->getAll();
+ return get_partial($templateName, $vars);
+ }
+ public function renderPartial($templateName, $vars = null)
+ {
+ return $this->renderText($this->getPartial($templateName, $vars));
+ }
+ public function getComponent($moduleName, $componentName, $vars = null)
+ {
+ $this->getContext()->getConfiguration()->loadHelpers('Partial');
+ $vars = !is_null($vars) ? $vars : $this->varHolder->getAll();
+ return get_component($moduleName, $componentName, $vars);
+ }
+ public function renderComponent($moduleName, $componentName, $vars = null)
+ {
+ return $this->renderText($this->getComponent($moduleName, $componentName, $vars));
+ }
+ public function getDefaultView()
+ {
+ if (!sfConfig::get('sf_compat_10'))
+ {
+ throw new sfConfigurationException('You must set "compat_10" to true if you want to use this method which is deprecated.');
+ }
+ return sfView::INPUT;
+ }
+ public function handleError()
+ {
+ if (!sfConfig::get('sf_compat_10'))
+ {
+ throw new sfConfigurationException('You must set "compat_10" to true if you want to use this method which is deprecated.');
+ }
+ return sfView::ERROR;
+ }
+ public function validate()
+ {
+ if (!sfConfig::get('sf_compat_10'))
+ {
+ throw new sfConfigurationException('You must set "compat_10" to true if you want to use this method which is deprecated.');
+ }
+ return true;
+ }
+ public function getSecurityConfiguration()
+ {
+ return $this->security;
+ }
+ public function setSecurityConfiguration($security)
+ {
+ $this->security = $security;
+ }
+ public function isSecure()
+ {
+ $actionName = strtolower($this->getActionName());
+ if (isset($this->security[$actionName]['is_secure']))
+ {
+ return $this->security[$actionName]['is_secure'];
+ }
+ if (isset($this->security['all']['is_secure']))
+ {
+ return $this->security['all']['is_secure'];
+ }
+ return false;
+ }
+ public function getCredential()
+ {
+ $actionName = strtolower($this->getActionName());
+ if (isset($this->security[$actionName]['credentials']))
+ {
+ $credentials = $this->security[$actionName]['credentials'];
+ }
+ else if (isset($this->security['all']['credentials']))
+ {
+ $credentials = $this->security['all']['credentials'];
+ }
+ else
+ {
+ $credentials = null;
+ }
+ return $credentials;
+ }
+ public function setTemplate($name, $module = null)
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Change template to "%s/%s"', is_null($module) ? 'CURRENT' : $module, $name))));
+ }
+ if (!is_null($module))
+ {
+ $name = sfConfig::get('sf_app_dir').'/modules/'.$module.'/templates/'.$name;
+ }
+ sfConfig::set('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_template', $name);
+ }
+ public function getTemplate()
+ {
+ return sfConfig::get('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_template');
+ }
+ public function setLayout($name)
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Change layout to "%s"', $name))));
+ }
+ sfConfig::set('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_layout', $name);
+ }
+ public function getLayout()
+ {
+ return sfConfig::get('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_layout');
+ }
+ public function setViewClass($class)
+ {
+ sfConfig::set('mod_'.strtolower($this->getModuleName()).'_view_class', $class);
+ }
+ public function getRoute()
+ {
+ return $this->getRequest()->getAttribute('sf_route');
+ }
+ protected function get404Message($message = null)
+ {
+ return is_null($message) ? sprintf('This request has been forwarded to a 404 error page by the action "%s/%s".', $this->getModuleName(), $this->getActionName()) : $message;
+ }
+}
+
+
+abstract class sfActions extends sfAction
+{
+ public function execute($request)
+ {
+ $actionToRun = 'execute'.ucfirst($this->getActionName());
+ if ($actionToRun === 'execute')
+ {
+ throw new sfInitializationException(sprintf('sfAction initialization failed for module "%s". There was no action given.', $this->getModuleName()));
+ }
+ if (!is_callable(array($this, $actionToRun)))
+ {
+ throw new sfInitializationException(sprintf('sfAction initialization failed for module "%s", action "%s". You must create a "%s" method.', $this->getModuleName(), $this->getActionName(), $actionToRun));
+ }
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Call "%s->%s()"', get_class($this), $actionToRun))));
+ }
+ return $this->$actionToRun($request);
+ }
+}
+
+
+class sfActionStack
+{
+ protected
+ $stack = array();
+ public function addEntry($moduleName, $actionName, $actionInstance)
+ {
+ $actionEntry = new sfActionStackEntry($moduleName, $actionName, $actionInstance);
+ $this->stack[] = $actionEntry;
+ return $actionEntry;
+ }
+ public function getEntry($index)
+ {
+ $retval = null;
+ if ($index > -1 && $index < count($this->stack))
+ {
+ $retval = $this->stack[$index];
+ }
+ return $retval;
+ }
+ public function popEntry()
+ {
+ return array_pop($this->stack);
+ }
+ public function getFirstEntry()
+ {
+ $retval = null;
+ if (isset($this->stack[0]))
+ {
+ $retval = $this->stack[0];
+ }
+ return $retval;
+ }
+ public function getLastEntry()
+ {
+ $count = count($this->stack);
+ $retval = null;
+ if (isset($this->stack[0]))
+ {
+ $retval = $this->stack[$count - 1];
+ }
+ return $retval;
+ }
+ public function getSize()
+ {
+ return count($this->stack);
+ }
+}
+
+
+class sfActionStackEntry
+{
+ protected
+ $actionInstance = null,
+ $actionName = null,
+ $moduleName = null,
+ $presentation = null;
+ public function __construct($moduleName, $actionName, $actionInstance)
+ {
+ $this->actionName = $actionName;
+ $this->actionInstance = $actionInstance;
+ $this->moduleName = $moduleName;
+ }
+ public function getActionName()
+ {
+ return $this->actionName;
+ }
+ public function getActionInstance()
+ {
+ return $this->actionInstance;
+ }
+ public function getModuleName()
+ {
+ return $this->moduleName;
+ }
+ public function & getPresentation()
+ {
+ return $this->presentation;
+ }
+ public function setPresentation(&$presentation)
+ {
+ $this->presentation =& $presentation;
+ }
+}
+
+
+class sfLoader
+{
+ static public function getHelperDirs($moduleName = '')
+ {
+ $configuration = sfProjectConfiguration::getActive();
+ $configuration->getEventDispatcher()->notify(new sfEvent(null, 'application.log', array('The sfLoader::getHelperDirs() method is deprecated. Please use the same method from sfApplicationConfiguration.', 'priority' => sfLogger::ERR)));
+ return $configuration->getHelperDirs($moduleName);
+ }
+ static public function loadHelpers($helpers, $moduleName = '')
+ {
+ $configuration = sfProjectConfiguration::getActive();
+ $configuration->getEventDispatcher()->notify(new sfEvent(null, 'application.log', array('The sfLoader::loadHelpers() method is deprecated. Please use the same method from sfApplicationConfiguration.', 'priority' => sfLogger::ERR)));
+ return $configuration->loadHelpers($helpers, $moduleName);
+ }
+}
+
+
+abstract class sfController
+{
+ protected
+ $context = null,
+ $dispatcher = null,
+ $controllerClasses = array(),
+ $maxForwards = 5,
+ $renderMode = sfView::RENDER_CLIENT;
+ public function __construct($context)
+ {
+ $this->initialize($context);
+ }
+ public function initialize($context)
+ {
+ $this->context = $context;
+ $this->dispatcher = $context->getEventDispatcher();
+ $this->maxForwards = sfConfig::get('sf_max_forwards', $this->maxForwards);
+ }
+ public function componentExists($moduleName, $componentName)
+ {
+ return $this->controllerExists($moduleName, $componentName, 'component', false);
+ }
+ public function actionExists($moduleName, $actionName)
+ {
+ return $this->controllerExists($moduleName, $actionName, 'action', false);
+ }
+ protected function controllerExists($moduleName, $controllerName, $extension, $throwExceptions)
+ {
+ $dirs = $this->context->getConfiguration()->getControllerDirs($moduleName);
+ foreach ($dirs as $dir => $checkEnabled)
+ {
+ if ($checkEnabled && !in_array($moduleName, sfConfig::get('sf_enabled_modules')) && is_readable($dir))
+ {
+ throw new sfConfigurationException(sprintf('The module "%s" is not enabled.', $moduleName));
+ }
+ $classFile = strtolower($extension);
+ $classSuffix = ucfirst(strtolower($extension));
+ $file = $dir.'/'.$controllerName.$classSuffix.'.class.php';
+ if (is_readable($file))
+ {
+ require_once($file);
+ $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix] = $controllerName.$classSuffix;
+ return true;
+ }
+ $module_file = $dir.'/'.$classFile.'s.class.php';
+ if (is_readable($module_file))
+ {
+ require_once($module_file);
+ if (!class_exists($moduleName.$classSuffix.'s', false))
+ {
+ if ($throwExceptions)
+ {
+ throw new sfControllerException(sprintf('There is no "%s" class in your action file "%s".', $moduleName.$classSuffix.'s', $module_file));
+ }
+ return false;
+ }
+ if (!in_array('execute'.ucfirst($controllerName), get_class_methods($moduleName.$classSuffix.'s')))
+ {
+ if ($throwExceptions)
+ {
+ throw new sfControllerException(sprintf('There is no "%s" method in your action class "%s".', 'execute'.ucfirst($controllerName), $moduleName.$classSuffix.'s'));
+ }
+ return false;
+ }
+ $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix] = $moduleName.$classSuffix.'s';
+ return true;
+ }
+ }
+ if ($throwExceptions && sfConfig::get('sf_debug'))
+ {
+ $dirs = array_keys($dirs);
+ foreach ($dirs as &$dir)
+ {
+ $dir = str_replace(sfConfig::get('sf_root_dir'), '%SF_ROOT_DIR%', $dir);
+ }
+ throw new sfControllerException(sprintf('Controller "%s/%s" does not exist in: %s.', $moduleName, $controllerName, implode(', ', $dirs)));
+ }
+ return false;
+ }
+ public function forward($moduleName, $actionName)
+ {
+ $moduleName = preg_replace('/[^a-z0-9_]+/i', '', $moduleName);
+ $actionName = preg_replace('/[^a-z0-9_]+/i', '', $actionName);
+ if ($this->getActionStack()->getSize() >= $this->maxForwards)
+ {
+ throw new sfForwardException(sprintf('Too many forwards have been detected for this request (> %d).', $this->maxForwards));
+ }
+ $this->context->getConfigCache()->import('modules/'.$moduleName.'/config/generator.yml', false, true);
+ if (!$this->actionExists($moduleName, $actionName))
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Action "%s/%s" does not exist', $moduleName, $actionName))));
+ }
+ throw new sfError404Exception(sprintf('Action "%s/%s" does not exist.', $moduleName, $actionName));
+ }
+ $actionInstance = $this->getAction($moduleName, $actionName);
+ $this->getActionStack()->addEntry($moduleName, $actionName, $actionInstance);
+ require($this->context->getConfigCache()->checkConfig('modules/'.$moduleName.'/config/module.yml'));
+ if ($this->getActionStack()->getSize() == 1 && sfConfig::get('mod_'.strtolower($moduleName).'_is_internal') && !sfConfig::get('sf_test'))
+ {
+ throw new sfConfigurationException(sprintf('Action "%s" from module "%s" cannot be called directly.', $actionName, $moduleName));
+ }
+ if (sfConfig::get('mod_'.strtolower($moduleName).'_enabled'))
+ {
+ $moduleConfig = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/config/config.php';
+ if (is_readable($moduleConfig))
+ {
+ require_once($moduleConfig);
+ }
+ $filterChain = new sfFilterChain();
+ $filterChain->loadConfiguration($actionInstance);
+ $this->context->getEventDispatcher()->notify(new sfEvent($this, 'controller.change_action', array('module' => $moduleName, 'action' => $actionName)));
+ if ($moduleName == sfConfig::get('sf_error_404_module') && $actionName == sfConfig::get('sf_error_404_action'))
+ {
+ $this->context->getResponse()->setStatusCode(404);
+ $this->context->getResponse()->setHttpHeader('Status', '404 Not Found');
+ $this->dispatcher->notify(new sfEvent($this, 'controller.page_not_found', array('module' => $moduleName, 'action' => $actionName)));
+ }
+ $filterChain->execute();
+ }
+ else
+ {
+ $moduleName = sfConfig::get('sf_module_disabled_module');
+ $actionName = sfConfig::get('sf_module_disabled_action');
+ if (!$this->actionExists($moduleName, $actionName))
+ {
+ throw new sfConfigurationException(sprintf('Invalid configuration settings: [sf_module_disabled_module] "%s", [sf_module_disabled_action] "%s".', $moduleName, $actionName));
+ }
+ $this->forward($moduleName, $actionName);
+ }
+ }
+ public function getAction($moduleName, $actionName)
+ {
+ return $this->getController($moduleName, $actionName, 'action');
+ }
+ public function getComponent($moduleName, $componentName)
+ {
+ return $this->getController($moduleName, $componentName, 'component');
+ }
+ protected function getController($moduleName, $controllerName, $extension)
+ {
+ $classSuffix = ucfirst(strtolower($extension));
+ if (!isset($this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix]))
+ {
+ $this->controllerExists($moduleName, $controllerName, $extension, true);
+ }
+ $class = $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix];
+ $moduleClass = $moduleName.'_'.$class;
+ if (class_exists($moduleClass, false))
+ {
+ $class = $moduleClass;
+ }
+ return new $class($this->context, $moduleName, $controllerName);
+ }
+ public function getActionStack()
+ {
+ return $this->context->getActionStack();
+ }
+ public function getRenderMode()
+ {
+ return $this->renderMode;
+ }
+ public function getView($moduleName, $actionName, $viewName)
+ {
+ $file = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/view/'.$actionName.$viewName.'View.class.php';
+ if (is_readable($file))
+ {
+ require_once($file);
+ $class = $actionName.$viewName.'View';
+ $moduleClass = $moduleName.'_'.$class;
+ if (class_exists($moduleClass, false))
+ {
+ $class = $moduleClass;
+ }
+ }
+ else
+ {
+ $class = sfConfig::get('mod_'.strtolower($moduleName).'_view_class', 'sfPHP').'View';
+ }
+ return new $class($this->context, $moduleName, $actionName, $viewName);
+ }
+ public function sendEmail($module, $action)
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array('sendEmail method is deprecated', 'priority' => sfLogger::ERR)));
+ }
+ return $this->getPresentationFor($module, $action, 'sfMail');
+ }
+ public function getPresentationFor($module, $action, $viewName = null)
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Get presentation for action "%s/%s" (view class: "%s")', $module, $action, $viewName))));
+ }
+ $renderMode = $this->getRenderMode();
+ $this->setRenderMode(sfView::RENDER_VAR);
+ $actionStack = $this->getActionStack();
+ $index = $actionStack->getSize();
+ if ($viewName)
+ {
+ $currentViewName = sfConfig::get('mod_'.strtolower($module).'_view_class');
+ sfConfig::set('mod_'.strtolower($module).'_view_class', $viewName);
+ }
+ try
+ {
+ $this->forward($module, $action);
+ }
+ catch (Exception $e)
+ {
+ $this->setRenderMode($renderMode);
+ if ($viewName)
+ {
+ sfConfig::set('mod_'.strtolower($module).'_view_class', $currentViewName);
+ }
+ throw $e;
+ }
+ $actionEntry = $actionStack->getEntry($index);
+ $presentation =& $actionEntry->getPresentation();
+ $this->setRenderMode($renderMode);
+ $nb = $actionStack->getSize() - $index;
+ while ($nb-- > 0)
+ {
+ $actionEntry = $actionStack->popEntry();
+ if ($actionEntry->getModuleName() == sfConfig::get('sf_login_module') && $actionEntry->getActionName() == sfConfig::get('sf_login_action'))
+ {
+ throw new sfException('Your action is secured, but the user is not authenticated.');
+ }
+ else if ($actionEntry->getModuleName() == sfConfig::get('sf_secure_module') && $actionEntry->getActionName() == sfConfig::get('sf_secure_action'))
+ {
+ throw new sfException('Your action is secured, but the user does not have access.');
+ }
+ }
+ if ($viewName)
+ {
+ sfConfig::set('mod_'.strtolower($module).'_view_class', $currentViewName);
+ }
+ return $presentation;
+ }
+ public function setRenderMode($mode)
+ {
+ if ($mode == sfView::RENDER_CLIENT || $mode == sfView::RENDER_VAR || $mode == sfView::RENDER_NONE)
+ {
+ $this->renderMode = $mode;
+ return;
+ }
+ throw new sfRenderException(sprintf('Invalid rendering mode: %s.', $mode));
+ }
+ public function inCLI()
+ {
+ return 0 == strncasecmp(PHP_SAPI, 'cli', 3);
+ }
+ public function __call($method, $arguments)
+ {
+ $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'controller.method_not_found', array('method' => $method, 'arguments' => $arguments)));
+ if (!$event->isProcessed())
+ {
+ throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
+ }
+ return $event->getReturnValue();
+ }
+}
+
+
+class sfDatabaseManager
+{
+ protected
+ $configuration = null,
+ $databases = array();
+ public function __construct(sfProjectConfiguration $configuration, $options = array())
+ {
+ $this->initialize($configuration);
+ if (!isset($options['auto_shutdown']) || $options['auto_shutdown'])
+ {
+ register_shutdown_function(array($this, 'shutdown'));
+ }
+ }
+ public function initialize(sfProjectConfiguration $configuration)
+ {
+ $this->configuration = $configuration;
+ $this->loadConfiguration();
+ }
+ public function loadConfiguration()
+ {
+ if ($this->configuration instanceof sfApplicationConfiguration)
+ {
+ $databases = include($this->configuration->getConfigCache()->checkConfig('config/databases.yml'));
+ }
+ else
+ {
+ $configHandler = new sfDatabaseConfigHandler();
+ $databases = $configHandler->evaluate(array($this->configuration->getRootDir().'/config/databases.yml'));
+ }
+ foreach ($databases as $name => $database)
+ {
+ $this->setDatabase($name, $database);
+ }
+ }
+ public function setDatabase($name, sfDatabase $database)
+ {
+ $this->databases[$name] = $database;
+ }
+ public function getDatabase($name = 'default')
+ {
+ if (isset($this->databases[$name]))
+ {
+ return $this->databases[$name];
+ }
+ throw new sfDatabaseException(sprintf('Database "%s" does not exist.', $name));
+ }
+ public function getNames()
+ {
+ return array_keys($this->databases);
+ }
+ public function shutdown()
+ {
+ foreach ($this->databases as $database)
+ {
+ $database->shutdown();
+ }
+ }
+}
+
+
+class sfEvent implements ArrayAccess
+{
+ protected
+ $value = null,
+ $processed = false,
+ $subject = null,
+ $name = '',
+ $parameters = null;
+ public function __construct($subject, $name, $parameters = array())
+ {
+ $this->subject = $subject;
+ $this->name = $name;
+ $this->parameters = $parameters;
+ }
+ public function getSubject()
+ {
+ return $this->subject;
+ }
+ public function getName()
+ {
+ return $this->name;
+ }
+ public function setReturnValue($value)
+ {
+ $this->value = $value;
+ }
+ public function getReturnValue()
+ {
+ return $this->value;
+ }
+ public function setProcessed($processed)
+ {
+ $this->processed = (boolean) $processed;
+ }
+ public function isProcessed()
+ {
+ return $this->processed;
+ }
+ public function getParameters()
+ {
+ return $this->parameters;
+ }
+ public function offsetExists($name)
+ {
+ return array_key_exists($name, $this->parameters);
+ }
+ public function offsetGet($name)
+ {
+ if (!array_key_exists($name, $this->parameters))
+ {
+ throw new InvalidArgumentException(sprintf('The event "%s" has no "%s" parameter.', $this->name, $name));
+ }
+ return $this->parameters[$name];
+ }
+ public function offsetSet($name, $value)
+ {
+ $this->parameters[$name] = $value;
+ }
+ public function offsetUnset($name)
+ {
+ unset($this->parameters[$name]);
+ }
+}
+
+
+abstract class sfFilter
+{
+ protected
+ $parameterHolder = null,
+ $context = null;
+ public static
+ $filterCalled = array();
+ public function __construct($context, $parameters = array())
+ {
+ $this->initialize($context, $parameters);
+ }
+ public function initialize($context, $parameters = array())
+ {
+ $this->context = $context;
+ $this->parameterHolder = new sfParameterHolder();
+ $this->parameterHolder->add($parameters);
+ return true;
+ }
+ protected function isFirstCall()
+ {
+ $class = get_class($this);
+ if (isset(self::$filterCalled[$class]))
+ {
+ return false;
+ }
+ else
+ {
+ self::$filterCalled[$class] = true;
+ return true;
+ }
+ }
+ public final function getContext()
+ {
+ return $this->context;
+ }
+ public function getParameterHolder()
+ {
+ return $this->parameterHolder;
+ }
+ public function getParameter($name, $default = null)
+ {
+ return $this->parameterHolder->get($name, $default);
+ }
+ public function hasParameter($name)
+ {
+ return $this->parameterHolder->has($name);
+ }
+ public function setParameter($name, $value)
+ {
+ return $this->parameterHolder->set($name, $value);
+ }
+}
+
+
+class sfCommonFilter extends sfFilter
+{
+ public function execute($filterChain)
+ {
+ $filterChain->execute();
+ $response = $this->context->getResponse();
+ $content = $response->getContent();
+ if (false !== ($pos = strpos($content, '</head>')))
+ {
+ $this->context->getConfiguration()->loadHelpers(array('Tag', 'Asset'));
+ $html = '';
+ if (!sfConfig::get('symfony.asset.javascripts_included', false))
+ {
+ $html .= get_javascripts($response);
+ }
+ if (!sfConfig::get('symfony.asset.stylesheets_included', false))
+ {
+ $html .= get_stylesheets($response);
+ }
+ if ($html)
+ {
+ $response->setContent(substr($content, 0, $pos).$html.substr($content, $pos));
+ }
+ }
+ sfConfig::set('symfony.asset.javascripts_included', false);
+ sfConfig::set('symfony.asset.stylesheets_included', false);
+ }
+}
+
+
+class sfExecutionFilter extends sfFilter
+{
+ public function execute($filterChain)
+ {
+ $actionInstance = $this->context->getController()->getActionStack()->getLastEntry()->getActionInstance();
+ if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
+ {
+ $timer = sfTimerManager::getTimer(sprintf('Action "%s/%s"', $actionInstance->getModuleName(), $actionInstance->getActionName()));
+ $viewName = $this->handleAction($filterChain, $actionInstance);
+ $timer->addTime();
+ $timer = sfTimerManager::getTimer(sprintf('View "%s" for "%s/%s"', $viewName, $actionInstance->getModuleName(), $actionInstance->getActionName()));
+ $this->handleView($filterChain, $actionInstance, $viewName);
+ $timer->addTime();
+ }
+ else
+ {
+ $viewName = $this->handleAction($filterChain, $actionInstance);
+ $this->handleView($filterChain, $actionInstance, $viewName);
+ }
+ }
+ protected function handleAction($filterChain, $actionInstance)
+ {
+ $uri = $this->context->getRouting()->getCurrentInternalUri();
+ if (sfConfig::get('sf_cache') && !is_null($uri) && $this->context->getViewCacheManager()->hasActionCache($uri))
+ {
+ return sfView::SUCCESS;
+ }
+ return $this->executeAction($actionInstance);
+ }
+ protected function executeAction($actionInstance)
+ {
+ $actionInstance->preExecute();
+ $viewName = $actionInstance->execute($this->context->getRequest());
+ $actionInstance->postExecute();
+ return is_null($viewName) ? sfView::SUCCESS : $viewName;
+ }
+ protected function handleView($filterChain, $actionInstance, $viewName)
+ {
+ switch ($viewName)
+ {
+ case sfView::HEADER_ONLY:
+ $this->context->getResponse()->setHeaderOnly(true);
+ return;
+ case sfView::NONE:
+ return;
+ }
+ $this->executeView($actionInstance->getModuleName(), $actionInstance->getActionName(), $viewName, $actionInstance->getVarHolder()->getAll());
+ }
+ protected function executeView($moduleName, $actionName, $viewName, $viewAttributes)
+ {
+ $controller = $this->context->getController();
+ $view = $controller->getView($moduleName, $actionName, $viewName);
+ $view->execute();
+ $view->getAttributeHolder()->add($viewAttributes);
+ switch ($controller->getRenderMode())
+ {
+ case sfView::RENDER_NONE:
+ break;
+ case sfView::RENDER_CLIENT:
+ $viewData = $view->render();
+ $this->context->getResponse()->setContent($viewData);
+ break;
+ case sfView::RENDER_VAR:
+ $viewData = $view->render();
+ $controller->getActionStack()->getLastEntry()->setPresentation($viewData);
+ break;
+ }
+ }
+}
+
+
+class sfRenderingFilter extends sfFilter
+{
+ public function execute($filterChain)
+ {
+ $filterChain->execute();
+ $response = $this->context->getResponse();
+ if (sfForm::hasToStringException())
+ {
+ throw sfForm::getToStringException();
+ }
+ else if (sfFormField::hasToStringException())
+ {
+ throw sfFormField::getToStringException();
+ }
+ $response->send();
+ }
+}
+
+
+class sfFilterChain
+{
+ protected
+ $chain = array(),
+ $index = -1;
+ public function loadConfiguration($actionInstance)
+ {
+ require(sfContext::getInstance()->getConfigCache()->checkConfig('modules/'.$actionInstance->getModuleName().'/config/filters.yml'));
+ }
+ public function execute()
+ {
+ ++$this->index;
+ if ($this->index < count($this->chain))
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ sfContext::getInstance()->getEventDispatcher()->notify(new sfEvent($this, 'application.log', array(sprintf('Executing filter "%s"', get_class($this->chain[$this->index])))));
+ }
+ $this->chain[$this->index]->execute($this);
+ }
+ }
+ public function hasFilter($class)
+ {
+ foreach ($this->chain as $filter)
+ {
+ if ($filter instanceof $class)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ public function register($filter)
+ {
+ $this->chain[] = $filter;
+ }
+}
+
+
+abstract class sfLogger
+{
+ const EMERG = 0; const ALERT = 1; const CRIT = 2; const ERR = 3; const WARNING = 4; const NOTICE = 5; const INFO = 6; const DEBUG = 7;
+ protected
+ $level = self::INFO;
+ public function __construct(sfEventDispatcher $dispatcher, $options = array())
+ {
+ $this->initialize($dispatcher, $options);
+ if (!isset($options['auto_shutdown']) || $options['auto_shutdown'])
+ {
+ register_shutdown_function(array($this, 'shutdown'));
+ }
+ }
+ public function initialize(sfEventDispatcher $dispatcher, $options = array())
+ {
+ if (isset($options['level']))
+ {
+ $this->setLogLevel($options['level']);
+ }
+ $dispatcher->connect('application.log', array($this, 'listenToLogEvent'));
+ }
+ public function getLogLevel()
+ {
+ return $this->level;
+ }
+ public function setLogLevel($level)
+ {
+ if (!is_int($level))
+ {
+ $level = constant('sfLogger::'.strtoupper($level));
+ }
+ $this->level = $level;
+ }
+ public function log($message, $priority = self::INFO)
+ {
+ if ($this->getLogLevel() < $priority)
+ {
+ return false;
+ }
+ return $this->doLog($message, $priority);
+ }
+ abstract protected function doLog($message, $priority);
+ public function emerg($message)
+ {
+ $this->log($message, self::EMERG);
+ }
+ public function alert($message)
+ {
+ $this->log($message, self::ALERT);
+ }
+ public function crit($message)
+ {
+ $this->log($message, self::CRIT);
+ }
+ public function err($message)
+ {
+ $this->log($message, self::ERR);
+ }
+ public function warning($message)
+ {
+ $this->log($message, self::WARNING);
+ }
+ public function notice($message)
+ {
+ $this->log($message, self::NOTICE);
+ }
+ public function info($message)
+ {
+ $this->log($message, self::INFO);
+ }
+ public function debug($message)
+ {
+ $this->log($message, self::DEBUG);
+ }
+ public function listenToLogEvent(sfEvent $event)
+ {
+ $priority = isset($event['priority']) ? $event['priority'] : self::INFO;
+ $subject = $event->getSubject();
+ $subject = is_object($subject) ? get_class($subject) : (is_string($subject) ? $subject : 'main');
+ foreach ($event->getParameters() as $key => $message)
+ {
+ if ('priority' === $key)
+ {
+ continue;
+ }
+ $this->log(sprintf('{%s} %s', $subject, $message), $priority);
+ }
+ }
+ public function shutdown()
+ {
+ }
+ static public function getPriorityName($priority)
+ {
+ static $levels = array(
+ self::EMERG => 'emerg',
+ self::ALERT => 'alert',
+ self::CRIT => 'crit',
+ self::ERR => 'err',
+ self::WARNING => 'warning',
+ self::NOTICE => 'notice',
+ self::INFO => 'info',
+ self::DEBUG => 'debug',
+ );
+ if (!isset($levels[$priority]))
+ {
+ throw new sfException(sprintf('The priority level "%s" does not exist.', $priority));
+ }
+ return $levels[$priority];
+ }
+}
+
+
+class sfNoLogger extends sfLogger
+{
+ public function initialize(sfEventDispatcher $dispatcher, $options = array())
+ {
+ }
+ protected function doLog($message, $priority)
+ {
+ }
+}
+
+
+abstract class sfRequest
+{
+ const GET = 'GET';
+ const POST = 'POST';
+ const PUT = 'PUT';
+ const DELETE = 'DELETE';
+ const HEAD = 'HEAD';
+ protected
+ $dispatcher = null,
+ $method = null,
+ $options = array(),
+ $parameterHolder = null,
+ $attributeHolder = null;
+ public function __construct(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array())
+ {
+ $this->initialize($dispatcher, $parameters, $attributes, $options);
+ }
+ public function initialize(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array())
+ {
+ $this->dispatcher = $dispatcher;
+ $this->options = $options;
+ if (!isset($this->options['logging']))
+ {
+ $this->options['logging'] = false;
+ }
+ $this->parameterHolder = new sfParameterHolder();
+ $this->attributeHolder = new sfParameterHolder();
+ $this->parameterHolder->add($parameters);
+ $this->attributeHolder->add($attributes);
+ }
+ public function extractParameters($names)
+ {
+ $array = array();
+ $parameters = $this->parameterHolder->getAll();
+ foreach ($parameters as $key => $value)
+ {
+ if (in_array($key, $names))
+ {
+ $array[$key] = $value;
+ }
+ }
+ return $array;
+ }
+ public function getMethod()
+ {
+ return $this->method;
+ }
+ public function setMethod($method)
+ {
+ if (!in_array(strtoupper($method), array(self::GET, self::POST, self::PUT, self::DELETE, self::HEAD)))
+ {
+ throw new sfException(sprintf('Invalid request method: %s.', $method));
+ }
+ $this->method = strtoupper($method);
+ }
+ public function getParameterHolder()
+ {
+ return $this->parameterHolder;
+ }
+ public function getAttributeHolder()
+ {
+ return $this->attributeHolder;
+ }
+ public function getAttribute($name, $default = null)
+ {
+ return $this->attributeHolder->get($name, $default);
+ }
+ public function hasAttribute($name)
+ {
+ return $this->attributeHolder->has($name);
+ }
+ public function setAttribute($name, $value)
+ {
+ $this->attributeHolder->set($name, $value);
+ }
+ public function getParameter($name, $default = null)
+ {
+ return $this->parameterHolder->get($name, $default);
+ }
+ public function hasParameter($name)
+ {
+ return $this->parameterHolder->has($name);
+ }
+ public function setParameter($name, $value)
+ {
+ $this->parameterHolder->set($name, $value);
+ }
+ public function __call($method, $arguments)
+ {
+ $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'request.method_not_found', array('method' => $method, 'arguments' => $arguments)));
+ if (!$event->isProcessed())
+ {
+ throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
+ }
+ return $event->getReturnValue();
+ }
+ public function __clone()
+ {
+ $this->parameterHolder = clone $this->parameterHolder;
+ $this->attributeHolder = clone $this->attributeHolder;
+ }
+}
+
+
+abstract class sfResponse implements Serializable
+{
+ protected
+ $options = array(),
+ $dispatcher = null,
+ $content = '';
+ public function __construct(sfEventDispatcher $dispatcher, $options = array())
+ {
+ $this->initialize($dispatcher, $options);
+ }
+ public function initialize(sfEventDispatcher $dispatcher, $options = array())
+ {
+ $this->dispatcher = $dispatcher;
+ $this->options = $options;
+ if (!isset($this->options['logging']))
+ {
+ $this->options['logging'] = false;
+ }
+ }
+ public function setEventDispatcher(sfEventDispatcher $dispatcher)
+ {
+ $this->dispatcher = $dispatcher;
+ }
+ public function setContent($content)
+ {
+ $this->content = $content;
+ }
+ public function getContent()
+ {
+ return $this->content;
+ }
+ public function sendContent()
+ {
+ $event = $this->dispatcher->filter(new sfEvent($this, 'response.filter_content'), $this->getContent());
+ $content = $event->getReturnValue();
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Send content (%s o)', strlen($content)))));
+ }
+ echo $content;
+ }
+ public function send()
+ {
+ $this->sendContent();
+ }
+ public function getOptions()
+ {
+ return $this->options;
+ }
+ public function __call($method, $arguments)
+ {
+ $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'response.method_not_found', array('method' => $method, 'arguments' => $arguments)));
+ if (!$event->isProcessed())
+ {
+ throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
+ }
+ return $event->getReturnValue();
+ }
+ public function serialize()
+ {
+ return serialize($this->content);
+ }
+ public function unserialize($serialized)
+ {
+ $this->content = unserialize($serialized);
+ }
+}
+
+
+abstract class sfRouting
+{
+ protected
+ $dispatcher = null,
+ $cache = null,
+ $defaultParameters = array(),
+ $options = array();
+ public function __construct(sfEventDispatcher $dispatcher, sfCache $cache = null, $options = array())
+ {
+ $this->initialize($dispatcher, $cache, $options);
+ if (!isset($this->options['auto_shutdown']) || $this->options['auto_shutdown'])
+ {
+ register_shutdown_function(array($this, 'shutdown'));
+ }
+ }
+ public function getCache()
+ {
+ return $this->cache;
+ }
+ public function initialize(sfEventDispatcher $dispatcher, sfCache $cache = null, $options = array())
+ {
+ $this->dispatcher = $dispatcher;
+ $options['debug'] = isset($options['debug']) ? (boolean) $options['debug'] : false;
+ $this->cache = $options['debug'] ? null : $cache;
+ $this->setDefaultParameter('module', isset($options['default_module']) ? $options['default_module'] : 'default');
+ $this->setDefaultParameter('action', isset($options['default_action']) ? $options['default_action'] : 'index');
+ if (!isset($options['logging']))
+ {
+ $options['logging'] = false;
+ }
+ if (!isset($options['context']))
+ {
+ $options['context'] = array();
+ }
+ $this->options = $options;
+ $this->dispatcher->connect('user.change_culture', array($this, 'listenToChangeCultureEvent'));
+ $this->dispatcher->connect('request.filter_parameters', array($this, 'filterParametersEvent'));
+ $this->loadConfiguration();
+ }
+ public function getOptions()
+ {
+ return $this->options;
+ }
+ public function loadConfiguration()
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'routing.load_configuration'));
+ }
+ abstract public function getCurrentInternalUri($with_route_name = false);
+ abstract public function getRoutes();
+ abstract public function setRoutes($routes);
+ abstract public function hasRoutes();
+ abstract public function clearRoutes();
+ abstract public function generate($name, $params = array(), $absolute = false);
+ abstract public function parse($url);
+ public function getDefaultParameters()
+ {
+ return $this->defaultParameters;
+ }
+ public function getDefaultParameter($key)
+ {
+ return isset($this->defaultParameters[$key]) ? $this->defaultParameters[$key] : null;
+ }
+ public function setDefaultParameter($key, $value)
+ {
+ $this->defaultParameters[$key] = $value;
+ }
+ public function setDefaultParameters($parameters)
+ {
+ $this->defaultParameters = $parameters;
+ }
+ protected function mergeArrays($arr1, $arr2)
+ {
+ foreach ($arr2 as $key => $value)
+ {
+ $arr1[$key] = $value;
+ }
+ return $arr1;
+ }
+ public function listenToChangeCultureEvent(sfEvent $event)
+ {
+ $this->setDefaultParameter('sf_culture', $event['culture']);
+ }
+ public function filterParametersEvent(sfEvent $event, $parameters)
+ {
+ $context = $event->getParameters();
+ $this->options['context'] = $context;
+ if (false === $params = $this->parse($event['path_info']))
+ {
+ return $parameters;
+ }
+ return array_merge($parameters, $params);
+ }
+ protected function fixGeneratedUrl($url, $absolute = false)
+ {
+ if (isset($this->options['context']['prefix']))
+ {
+ if (0 === strpos($url, 'http'))
+ {
+ $url = preg_replace('#https?\://[^/]+#', '$0'.$this->options['context']['prefix'], $url);
+ }
+ else
+ {
+ $url = $this->options['context']['prefix'].$url;
+ }
+ }
+ if ($absolute && isset($this->options['context']['host']) && 0 !== strpos($url, 'http'))
+ {
+ $url = 'http'.(isset($this->options['context']['is_secure']) && $this->options['context']['is_secure'] ? 's' : '').'://'.$this->options['context']['host'].$url;
+ }
+ return $url;
+ }
+ public function shutdown()
+ {
+ }
+}
+
+
+abstract class sfStorage
+{
+ protected
+ $options = array();
+ public function __construct($options = array())
+ {
+ $this->initialize($options);
+ if ($this->options['auto_shutdown'])
+ {
+ register_shutdown_function(array($this, 'shutdown'));
+ }
+ }
+ public function initialize($options = array())
+ {
+ $this->options = array_merge(array(
+ 'auto_shutdown' => true,
+ ), $options);
+ }
+ public function getOptions()
+ {
+ return $this->options;
+ }
+ abstract public function read($key);
+ abstract public function regenerate($destroy = false);
+ abstract public function remove($key);
+ abstract public function shutdown();
+ abstract public function write($key, $data);
+}
+
+
+class sfUser
+{
+ const ATTRIBUTE_NAMESPACE = 'symfony/user/sfUser/attributes';
+ const CULTURE_NAMESPACE = 'symfony/user/sfUser/culture';
+ protected
+ $options = array(),
+ $attributeHolder = null,
+ $culture = null,
+ $storage = null,
+ $dispatcher = null;
+ public function __construct(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
+ {
+ $this->initialize($dispatcher, $storage, $options);
+ if ($this->options['auto_shutdown'])
+ {
+ register_shutdown_function(array($this, 'shutdown'));
+ }
+ }
+ public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
+ {
+ $this->dispatcher = $dispatcher;
+ $this->storage = $storage;
+ $this->options = array_merge(array(
+ 'auto_shutdown' => true,
+ 'culture' => null,
+ 'default_culture' => 'en',
+ 'use_flash' => false,
+ 'logging' => false,
+ ), $options);
+ $this->attributeHolder = new sfNamespacedParameterHolder(self::ATTRIBUTE_NAMESPACE);
+ $attributes = $storage->read(self::ATTRIBUTE_NAMESPACE);
+ if (is_array($attributes))
+ {
+ foreach ($attributes as $namespace => $values)
+ {
+ $this->attributeHolder->add($values, $namespace);
+ }
+ }
+ $currentCulture = $storage->read(self::CULTURE_NAMESPACE);
+ $this->setCulture(!is_null($this->options['culture']) ? $this->options['culture'] : (!is_null($currentCulture) ? $currentCulture : $this->options['default_culture']));
+ if ($this->options['use_flash'] && $names = $this->attributeHolder->getNames('symfony/user/sfUser/flash'))
+ {
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Flag old flash messages ("%s")', implode('", "', $names)))));
+ }
+ foreach ($names as $name)
+ {
+ $this->attributeHolder->set($name, true, 'symfony/user/sfUser/flash/remove');
+ }
+ }
+ }
+ public function getOptions()
+ {
+ return $this->options;
+ }
+ public function setCulture($culture)
+ {
+ if ($this->culture != $culture)
+ {
+ $this->culture = $culture;
+ $this->dispatcher->notify(new sfEvent($this, 'user.change_culture', array('culture' => $culture)));
+ }
+ }
+ public function setFlash($name, $value, $persist = true)
+ {
+ if (!$this->options['use_flash'])
+ {
+ return;
+ }
+ $this->setAttribute($name, $value, 'symfony/user/sfUser/flash');
+ if ($persist)
+ {
+ $this->attributeHolder->remove($name, null, 'symfony/user/sfUser/flash/remove');
+ }
+ else
+ {
+ $this->setAttribute($name, true, 'symfony/user/sfUser/flash/remove');
+ }
+ }
+ public function getFlash($name, $default = null)
+ {
+ if (!$this->options['use_flash'])
+ {
+ return $default;
+ }
+ return $this->getAttribute($name, $default, 'symfony/user/sfUser/flash');
+ }
+ public function hasFlash($name)
+ {
+ if (!$this->options['use_flash'])
+ {
+ return false;
+ }
+ return $this->hasAttribute($name, 'symfony/user/sfUser/flash');
+ }
+ public function getCulture()
+ {
+ return $this->culture;
+ }
+ public function getAttributeHolder()
+ {
+ return $this->attributeHolder;
+ }
+ public function getAttribute($name, $default = null, $ns = null)
+ {
+ return $this->attributeHolder->get($name, $default, $ns);
+ }
+ public function hasAttribute($name, $ns = null)
+ {
+ return $this->attributeHolder->has($name, $ns);
+ }
+ public function setAttribute($name, $value, $ns = null)
+ {
+ return $this->attributeHolder->set($name, $value, $ns);
+ }
+ public function shutdown()
+ {
+ if ($this->options['use_flash'] && $names = $this->attributeHolder->getNames('symfony/user/sfUser/flash/remove'))
+ {
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Remove old flash messages ("%s")', implode('", "', $names)))));
+ }
+ foreach ($names as $name)
+ {
+ $this->attributeHolder->remove($name, null, 'symfony/user/sfUser/flash');
+ $this->attributeHolder->remove($name, null, 'symfony/user/sfUser/flash/remove');
+ }
+ }
+ $attributes = array();
+ foreach ($this->attributeHolder->getNamespaces() as $namespace)
+ {
+ $attributes[$namespace] = $this->attributeHolder->getAll($namespace);
+ }
+ $this->storage->write(self::ATTRIBUTE_NAMESPACE, $attributes);
+ $this->storage->write(self::CULTURE_NAMESPACE, $this->culture);
+ }
+ public function __call($method, $arguments)
+ {
+ $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'user.method_not_found', array('method' => $method, 'arguments' => $arguments)));
+ if (!$event->isProcessed())
+ {
+ throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
+ }
+ return $event->getReturnValue();
+ }
+}
+
+
+class sfNamespacedParameterHolder extends sfParameterHolder
+{
+ protected $default_namespace = null;
+ protected $parameters = array();
+ public function __construct($namespace = 'symfony/default')
+ {
+ $this->default_namespace = $namespace;
+ }
+ public function setDefaultNamespace($namespace, $move = true)
+ {
+ if ($move)
+ {
+ $values = $this->removeNamespace();
+ $this->addByRef($values, $namespace);
+ }
+ $this->default_namespace = $namespace;
+ }
+ public function getDefaultNamespace()
+ {
+ return $this->default_namespace;
+ }
+ public function clear()
+ {
+ $this->parameters = null;
+ $this->parameters = array();
+ }
+ public function & get($name, $default = null, $ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ if (isset($this->parameters[$ns][$name]))
+ {
+ $value = & $this->parameters[$ns][$name];
+ }
+ else if (isset($this->parameters[$ns]))
+ {
+ $value = sfToolkit::getArrayValueForPath($this->parameters[$ns], $name, $default);
+ }
+ else
+ {
+ $value = $default;
+ }
+ return $value;
+ }
+ public function getNames($ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ if (isset($this->parameters[$ns]))
+ {
+ return array_keys($this->parameters[$ns]);
+ }
+ return array();
+ }
+ public function getNamespaces()
+ {
+ return array_keys($this->parameters);
+ }
+ public function & getAll($ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ $parameters = array();
+ if (isset($this->parameters[$ns]))
+ {
+ $parameters = $this->parameters[$ns];
+ }
+ return $parameters;
+ }
+ public function has($name, $ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ if (isset($this->parameters[$ns][$name]))
+ {
+ return true;
+ }
+ else if (isset($this->parameters[$ns]))
+ {
+ return sfToolkit::hasArrayValueForPath($this->parameters[$ns], $name);
+ }
+ return false;
+ }
+ public function hasNamespace($ns)
+ {
+ return isset($this->parameters[$ns]);
+ }
+ public function remove($name, $default = null, $ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ $retval = $default;
+ if (isset($this->parameters[$ns]) && array_key_exists($name, $this->parameters[$ns]))
+ {
+ $retval = $this->parameters[$ns][$name];
+ unset($this->parameters[$ns][$name]);
+ }
+ else
+ {
+ $retval = sfToolkit::removeArrayValueForPath($this->parameters[$ns], $name, $default);
+ }
+ return $retval;
+ }
+ public function & removeNamespace($ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ $retval = null;
+ if (isset($this->parameters[$ns]))
+ {
+ $retval =& $this->parameters[$ns];
+ unset($this->parameters[$ns]);
+ }
+ return $retval;
+ }
+ public function set($name, $value, $ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ if (!isset($this->parameters[$ns]))
+ {
+ $this->parameters[$ns] = array();
+ }
+ $this->parameters[$ns][$name] = $value;
+ }
+ public function setByRef($name, & $value, $ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ if (!isset($this->parameters[$ns]))
+ {
+ $this->parameters[$ns] = array();
+ }
+ $this->parameters[$ns][$name] =& $value;
+ }
+ public function add($parameters, $ns = null)
+ {
+ if ($parameters === null) return;
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ if (!isset($this->parameters[$ns]))
+ {
+ $this->parameters[$ns] = array();
+ }
+ foreach ($parameters as $key => $value)
+ {
+ $this->parameters[$ns][$key] = $value;
+ }
+ }
+ public function addByRef(& $parameters, $ns = null)
+ {
+ if (!$ns)
+ {
+ $ns = $this->default_namespace;
+ }
+ if (!isset($this->parameters[$ns]))
+ {
+ $this->parameters[$ns] = array();
+ }
+ foreach ($parameters as $key => &$value)
+ {
+ $this->parameters[$ns][$key] =& $value;
+ }
+ }
+ public function serialize()
+ {
+ return serialize(array($this->default_namespace, $this->parameters));
+ }
+ public function unserialize($serialized)
+ {
+ $data = unserialize($serialized);
+ $this->default_namespace = $data[0];
+ $this->parameters = $data[1];
+ }
+}
+
+
+abstract class sfView
+{
+ const ALERT = 'Alert';
+ const ERROR = 'Error';
+ const INPUT = 'Input';
+ const NONE = 'None';
+ const SUCCESS = 'Success';
+ const RENDER_NONE = 1;
+ const RENDER_CLIENT = 2;
+ const RENDER_VAR = 4;
+ const HEADER_ONLY = 8;
+ protected
+ $context = null,
+ $dispatcher = null,
+ $decorator = false,
+ $decoratorDirectory = null,
+ $decoratorTemplate = null,
+ $directory = null,
+ $componentSlots = array(),
+ $template = null,
+ $attributeHolder = null,
+ $parameterHolder = null,
+ $moduleName = '',
+ $actionName = '',
+ $viewName = '',
+ $extension = '.php';
+ public function __construct($context, $moduleName, $actionName, $viewName)
+ {
+ $this->initialize($context, $moduleName, $actionName, $viewName);
+ }
+ public function initialize($context, $moduleName, $actionName, $viewName)
+ {
+ $this->moduleName = $moduleName;
+ $this->actionName = $actionName;
+ $this->viewName = $viewName;
+ $this->context = $context;
+ $this->dispatcher = $context->getEventDispatcher();
+ sfOutputEscaper::markClassesAsSafe(array('sfForm', 'sfModelGeneratorHelper'));
+ $this->attributeHolder = $this->initializeAttributeHolder();
+ $this->parameterHolder = new sfParameterHolder();
+ $this->parameterHolder->add(sfConfig::get('mod_'.strtolower($moduleName).'_view_param', array()));
+ $request = $context->getRequest();
+ if (!is_null($format = $request->getRequestFormat()))
+ {
+ if ('html' != $format)
+ {
+ $this->setExtension('.'.$format.$this->getExtension());
+ }
+ if ($mimeType = $request->getMimeType($format))
+ {
+ $this->context->getResponse()->setContentType($mimeType);
+ if ('html' != $format)
+ {
+ $this->setDecorator(false);
+ }
+ }
+ $this->dispatcher->notify(new sfEvent($this, 'view.configure_format', array('format' => $format, 'response' => $context->getResponse(), 'request' => $context->getRequest())));
+ }
+ $this->configure();
+ return true;
+ }
+ protected function initializeAttributeHolder($attributes = array())
+ {
+ if ('both' === sfConfig::get('sf_escaping_strategy'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array('Escaping strategy "both" is deprecated, please use "on".', 'priority' => sfLogger::ERR)));
+ sfConfig::set('sf_escaping_strategy', 'on');
+ }
+ else if ('bc' === sfConfig::get('sf_escaping_strategy'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array('Escaping strategy "bc" is deprecated, please use "off".', 'priority' => sfLogger::ERR)));
+ sfConfig::set('sf_escaping_strategy', 'off');
+ }
+ $attributeHolder = new sfViewParameterHolder($this->dispatcher, $attributes, array(
+ 'escaping_method' => sfConfig::get('sf_escaping_method'),
+ 'escaping_strategy' => sfConfig::get('sf_escaping_strategy'),
+ ));
+ return $attributeHolder;
+ }
+ abstract function execute();
+ abstract function configure();
+ public function getDecoratorDirectory()
+ {
+ return $this->decoratorDirectory;
+ }
+ public function getDecoratorTemplate()
+ {
+ return $this->decoratorTemplate;
+ }
+ public function getDirectory()
+ {
+ return $this->directory;
+ }
+ abstract function getEngine();
+ public function getTemplate()
+ {
+ return $this->template;
+ }
+ public function getAttributeHolder()
+ {
+ return $this->attributeHolder;
+ }
+ public function getAttribute($name, $default = null)
+ {
+ return $this->attributeHolder->get($name, $default);
+ }
+ public function hasAttribute($name)
+ {
+ return $this->attributeHolder->has($name);
+ }
+ public function setAttribute($name, $value)
+ {
+ $this->attributeHolder->set($name, $value);
+ }
+ public function getParameterHolder()
+ {
+ return $this->parameterHolder;
+ }
+ public function getParameter($name, $default = null)
+ {
+ return $this->parameterHolder->get($name, $default);
+ }
+ public function hasParameter($name)
+ {
+ return $this->parameterHolder->has($name);
+ }
+ public function setParameter($name, $value)
+ {
+ $this->parameterHolder->set($name, $value);
+ }
+ public function isDecorator()
+ {
+ return $this->decorator;
+ }
+ public function setDecorator($boolean)
+ {
+ $this->decorator = (boolean) $boolean;
+ if (false === $boolean)
+ {
+ $this->decoratorTemplate = false;
+ }
+ }
+ protected function preRenderCheck()
+ {
+ if (is_null($this->template))
+ {
+ throw new sfRenderException('A template has not been set.');
+ }
+ if (!is_readable($this->directory.'/'.$this->template))
+ {
+ if ('404' == $this->context->getResponse()->getStatusCode())
+ {
+ $this->template = sfException::getTemplatePathForError($this->context->getRequest()->getRequestFormat(), false);
+ $this->directory = dirname($this->template);
+ $this->template = basename($this->template);
+ $this->setAttribute('code', '404');
+ $this->setAttribute('text', 'Not Found');
+ }
+ else
+ {
+ throw new sfRenderException(sprintf('The template "%s" does not exist or is unreadable in "%s".', $this->template, $this->directory));
+ }
+ }
+ if ($this->decorator && !is_readable($this->decoratorDirectory.'/'.$this->decoratorTemplate))
+ {
+ throw new sfRenderException(sprintf('The decorator template "%s" does not exist or is unreadable in "%s".', $this->decoratorTemplate, $this->decoratorDirectory));
+ }
+ }
+ abstract function render();
+ public function setDecoratorDirectory($directory)
+ {
+ $this->decoratorDirectory = $directory;
+ }
+ public function setDecoratorTemplate($template)
+ {
+ if (false === $template)
+ {
+ $this->setDecorator(false);
+ return;
+ }
+ else if (is_null($template))
+ {
+ return;
+ }
+ if (!strpos($template, '.'))
+ {
+ $template .= $this->getExtension();
+ }
+ if (sfToolkit::isPathAbsolute($template))
+ {
+ $this->decoratorDirectory = dirname($template);
+ $this->decoratorTemplate = basename($template);
+ }
+ else
+ {
+ $this->decoratorDirectory = $this->context->getConfiguration()->getDecoratorDir($template);
+ $this->decoratorTemplate = $template;
+ }
+ $this->decorator = true;
+ }
+ public function setDirectory($directory)
+ {
+ $this->directory = $directory;
+ }
+ public function setComponentSlot($attributeName, $moduleName, $componentName)
+ {
+ $this->componentSlots[$attributeName] = array();
+ $this->componentSlots[$attributeName]['module_name'] = $moduleName;
+ $this->componentSlots[$attributeName]['component_name'] = $componentName;
+ }
+ public function hasComponentSlot($name)
+ {
+ return isset($this->componentSlots[$name]);
+ }
+ public function getComponentSlot($name)
+ {
+ if (isset($this->componentSlots[$name]) && $this->componentSlots[$name]['module_name'] && $this->componentSlots[$name]['component_name'])
+ {
+ return array($this->componentSlots[$name]['module_name'], $this->componentSlots[$name]['component_name']);
+ }
+ return null;
+ }
+ public function setTemplate($template)
+ {
+ if (sfToolkit::isPathAbsolute($template))
+ {
+ $this->directory = dirname($template);
+ $this->template = basename($template);
+ }
+ else
+ {
+ $this->directory = $this->context->getConfiguration()->getTemplateDir($this->moduleName, $template);
+ $this->template = $template;
+ }
+ }
+ public function getExtension()
+ {
+ return $this->extension;
+ }
+ public function setExtension($extension)
+ {
+ $this->extension = $extension;
+ }
+ public function getModuleName()
+ {
+ return $this->moduleName;
+ }
+ public function getActionName()
+ {
+ return $this->actionName;
+ }
+ public function getViewName()
+ {
+ return $this->viewName;
+ }
+ public function __call($method, $arguments)
+ {
+ $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'view.method_not_found', array('method' => $method, 'arguments' => $arguments)));
+ if (!$event->isProcessed())
+ {
+ throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
+ }
+ return $event->getReturnValue();
+ }
+}
+
+
+class sfViewParameterHolder extends sfParameterHolder
+{
+ protected
+ $dispatcher = null,
+ $escaping = null,
+ $escapingMethod = null;
+ public function __construct(sfEventDispatcher $dispatcher, $parameters = array(), $options = array())
+ {
+ $this->initialize($dispatcher, $parameters, $options);
+ }
+ public function initialize(sfEventDispatcher $dispatcher, $parameters = array(), $options = array())
+ {
+ $this->dispatcher = $dispatcher;
+ $this->add($parameters);
+ $this->setEscaping(isset($options['escaping_strategy']) ? $options['escaping_strategy'] : false);
+ $this->setEscapingMethod(isset($options['escaping_method']) ? $options['escaping_method'] : 'ESC_SPECIALCHARS');
+ }
+ public function isEscaped()
+ {
+ return in_array($this->getEscaping(), array('on', true), true);
+ }
+ public function toArray()
+ {
+ $event = $this->dispatcher->filter(new sfEvent($this, 'template.filter_parameters'), $this->getAll());
+ $parameters = $event->getReturnValue();
+ $attributes = array();
+ if ($this->isEscaped())
+ {
+ $attributes['sf_data'] = sfOutputEscaper::escape($this->getEscapingMethod(), $parameters);
+ foreach ($attributes['sf_data'] as $key => $value)
+ {
+ $attributes[$key] = $value;
+ }
+ }
+ else if (in_array($this->getEscaping(), array('off', false), true))
+ {
+ $attributes = $parameters;
+ $attributes['sf_data'] = sfOutputEscaper::escape(ESC_RAW, $parameters);
+ }
+ else
+ {
+ throw new InvalidArgumentException(sprintf('Unknown strategy "%s".', $this->getEscaping()));
+ }
+ return $attributes;
+ }
+ public function getEscaping()
+ {
+ return $this->escaping;
+ }
+ public function setEscaping($escaping)
+ {
+ $this->escaping = $escaping;
+ }
+ public function getEscapingMethod()
+ {
+ if (empty($this->escapingMethod))
+ {
+ return $this->escapingMethod;
+ }
+ if (!defined($this->escapingMethod))
+ {
+ throw new InvalidArgumentException(sprintf('The escaping method "%s" is not available.', $this->escapingMethod));
+ }
+ return constant($this->escapingMethod);
+ }
+ public function setEscapingMethod($method)
+ {
+ $this->escapingMethod = $method;
+ }
+ public function serialize()
+ {
+ return serialize(array($this->getAll(), $this->escapingMethod, $this->escaping));
+ }
+ public function unserialize($serialized)
+ {
+ list($this->parameters, $escapingMethod, $escaping) = unserialize($serialized);
+ $this->initialize(sfContext::hasInstance() ? sfContext::getInstance()->getEventDispatcher() : new sfEventDispatcher());
+ $this->setEscapingMethod($escapingMethod);
+ $this->setEscaping($escaping);
+ }
+}
+
+
+abstract class sfWebController extends sfController
+{
+ public function genUrl($parameters = array(), $absolute = false)
+ {
+ if (is_string($parameters) && preg_match('#^[a-z][a-z0-9\+.\-]*\://#i', $parameters))
+ {
+ return $parameters;
+ }
+ if (is_string($parameters) && 0 === strpos($parameters, '/'))
+ {
+ return $parameters;
+ }
+ if (is_string($parameters) && $parameters == '#')
+ {
+ return $parameters;
+ }
+ $route = '';
+ $fragment = '';
+ if (is_string($parameters))
+ {
+ if (false !== ($pos = strpos($parameters, '#')))
+ {
+ $fragment = substr($parameters, $pos + 1);
+ $parameters = substr($parameters, 0, $pos);
+ }
+ list($route, $parameters) = $this->convertUrlStringToParameters($parameters);
+ }
+ else if (is_array($parameters))
+ {
+ if (isset($parameters['sf_route']))
+ {
+ $route = $parameters['sf_route'];
+ unset($parameters['sf_route']);
+ }
+ }
+ $url = $this->context->getRouting()->generate($route, $parameters, $absolute);
+ if ($fragment)
+ {
+ $url .= '#'.$fragment;
+ }
+ return $url;
+ }
+ public function convertUrlStringToParameters($url)
+ {
+ $givenUrl = $url;
+ $params = array();
+ $queryString = '';
+ $route = '';
+ if (!$url)
+ {
+ $url = '/';
+ }
+ if ($pos = strpos($url, '?'))
+ {
+ $queryString = substr($url, $pos + 1);
+ $url = substr($url, 0, $pos);
+ }
+ if ($url[0] == '/')
+ {
+ $url = substr($url, 1);
+ }
+ if ($url[0] == '@')
+ {
+ $route = substr($url, 1);
+ }
+ else if (false !== strpos($url, '/'))
+ {
+ list($params['module'], $params['action']) = explode('/', $url);
+ }
+ else if (!$queryString)
+ {
+ $route = $givenUrl;
+ }
+ else
+ {
+ throw new InvalidArgumentException(sprintf('An internal URI must contain a module and an action (module/action) ("%s" given).', $givenUrl));
+ }
+ if ($queryString)
+ {
+ $matched = preg_match_all('/
+ ([^&=]+) # key
+ = # =
+ (.*?) # value
+ (?:
+ (?=&[^&=]+=) | $ # followed by another key= or the end of the string
+ )
+ /x', $queryString, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
+ foreach ($matches as $match)
+ {
+ $params[urldecode($match[1][0])] = urldecode($match[2][0]);
+ }
+ if (!$matched)
+ {
+ throw new sfParseException(sprintf('Unable to parse query string "%s".', $queryString));
+ }
+ }
+ return array($route, $params);
+ }
+ public function redirect($url, $delay = 0, $statusCode = 302)
+ {
+ $url = $this->genUrl($url, true);
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Redirect to "%s"', $url))));
+ }
+ $response = $this->context->getResponse();
+ $response->clearHttpHeaders();
+ $response->setStatusCode($statusCode);
+ $response->setHttpHeader('Location', $url);
+ $response->setContent(sprintf('<html><head><meta http-equiv="refresh" content="%d;url=%s"/></head></html>', $delay, htmlspecialchars($url, ENT_QUOTES, sfConfig::get('sf_charset'))));
+ $response->send();
+ }
+}
+
+
+class sfFrontWebController extends sfWebController
+{
+ public function dispatch()
+ {
+ try
+ {
+ sfFilter::$filterCalled = array();
+ $request = $this->context->getRequest();
+ $moduleName = $request->getParameter('module');
+ $actionName = $request->getParameter('action');
+ if (empty($moduleName) || empty($actionName))
+ {
+ throw new sfError404Exception(sprintf('Empty module and/or action after parsing the URL "%s" (%s/%s).', $request->getPathInfo(), $moduleName, $actionName));
+ }
+ $this->forward($moduleName, $actionName);
+ }
+ catch (sfException $e)
+ {
+ $e->printStackTrace();
+ }
+ catch (Exception $e)
+ {
+ sfException::createFromException($e)->printStackTrace();
+ }
+ }
+}
+
+
+class sfWebRequest extends sfRequest
+{
+ protected
+ $languages = null,
+ $charsets = null,
+ $acceptableContentTypes = null,
+ $pathInfoArray = null,
+ $relativeUrlRoot = null,
+ $getParameters = null,
+ $postParameters = null,
+ $requestParameters = null,
+ $formats = array(),
+ $format = null,
+ $fixedFileArray = false;
+ public function initialize(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array())
+ {
+ parent::initialize($dispatcher, $parameters, $attributes, $options);
+ $this->getParameters = get_magic_quotes_gpc() ? sfToolkit::stripslashesDeep($_GET) : $_GET;
+ $this->parameterHolder->add($this->getParameters);
+ $this->postParameters = get_magic_quotes_gpc() ? sfToolkit::stripslashesDeep($_POST) : $_POST;
+ $this->parameterHolder->add($this->postParameters);
+ if (isset($_SERVER['REQUEST_METHOD']))
+ {
+ switch ($_SERVER['REQUEST_METHOD'])
+ {
+ case 'GET':
+ $this->setMethod(self::GET);
+ break;
+ case 'POST':
+ $this->setMethod(strtoupper($this->getParameter('sf_method', 'POST')));
+ $this->parameterHolder->remove('sf_method');
+ break;
+ case 'PUT':
+ $this->setMethod(self::PUT);
+ break;
+ case 'DELETE':
+ $this->setMethod(self::DELETE);
+ break;
+ case 'HEAD':
+ $this->setMethod(self::HEAD);
+ break;
+ default:
+ $this->setMethod(self::GET);
+ }
+ }
+ else
+ {
+ $this->setMethod(self::GET);
+ }
+ if (isset($this->options['formats']))
+ {
+ foreach ($this->options['formats'] as $format => $mimeTypes)
+ {
+ $this->setFormat($format, $mimeTypes);
+ }
+ }
+ if (!isset($this->options['path_info_key']))
+ {
+ $this->options['path_info_key'] = 'PATH_INFO';
+ }
+ if (!isset($this->options['path_info_array']))
+ {
+ $this->options['path_info_array'] = 'SERVER';
+ }
+ $this->requestParameters = $this->parseRequestParameters();
+ $this->parameterHolder->add($this->requestParameters);
+ $this->fixParameters();
+ }
+ public function getUri()
+ {
+ $pathArray = $this->getPathInfoArray();
+ if ('HTTP_X_REWRITE_URL' == $this->options['path_info_key'])
+ {
+ $uri = isset($pathArray['HTTP_X_REWRITE_URL']) ? $pathArray['HTTP_X_REWRITE_URL'] : '';
+ }
+ else
+ {
+ $uri = isset($pathArray['REQUEST_URI']) ? $pathArray['REQUEST_URI'] : '';
+ }
+ return $this->isAbsUri() ? $uri : $this->getUriPrefix().$uri;
+ }
+ public function isAbsUri()
+ {
+ $pathArray = $this->getPathInfoArray();
+ return isset($pathArray['REQUEST_URI']) ? preg_match('/^http/', $pathArray['REQUEST_URI']) : false;
+ }
+ public function getUriPrefix()
+ {
+ $pathArray = $this->getPathInfoArray();
+ if ($this->isSecure())
+ {
+ $standardPort = '443';
+ $protocol = 'https';
+ }
+ else
+ {
+ $standardPort = '80';
+ $protocol = 'http';
+ }
+ $host = explode(":", $this->getHost());
+ if (count($host) == 1)
+ {
+ $host[] = isset($pathArray['SERVER_PORT']) ? $pathArray['SERVER_PORT'] : '';
+ }
+ if ($host[1] == $standardPort || empty($host[1]))
+ {
+ unset($host[1]);
+ }
+ return $protocol.'://'.implode(':', $host);;
+ }
+ public function getPathInfo()
+ {
+ $pathInfo = '';
+ $pathArray = $this->getPathInfoArray();
+ $sf_path_info_key = $this->options['path_info_key'];
+ if (!isset($pathArray[$sf_path_info_key]) || !$pathArray[$sf_path_info_key])
+ {
+ if (isset($pathArray['REQUEST_URI']))
+ {
+ $script_name = $this->getScriptName();
+ $uri_prefix = $this->isAbsUri() ? $this->getUriPrefix() : '';
+ $pathInfo = preg_replace('/^'.preg_quote($uri_prefix, '/').'/','',$pathArray['REQUEST_URI']);
+ $pathInfo = preg_replace('/^'.preg_quote($script_name, '/').'/', '', $pathInfo);
+ $prefix_name = preg_replace('#/[^/]+$#', '', $script_name);
+ $pathInfo = preg_replace('/^'.preg_quote($prefix_name, '/').'/', '', $pathInfo);
+ $pathInfo = preg_replace('/\??'.preg_quote($pathArray['QUERY_STRING'], '/').'$/', '', $pathInfo);
+ }
+ }
+ else
+ {
+ $pathInfo = $pathArray[$sf_path_info_key];
+ if ($relativeUrlRoot = $this->getRelativeUrlRoot())
+ {
+ $pathInfo = preg_replace('/^'.str_replace('/', '\\/', $relativeUrlRoot).'\//', '', $pathInfo);
+ }
+ }
+ if (isset($_SERVER['SERVER_SOFTWARE']) && false !== stripos($_SERVER['SERVER_SOFTWARE'], 'iis') && $pos = stripos($pathInfo, '.php'))
+ {
+ $pathInfo = substr($pathInfo, $pos + 4);
+ }
+ if (!$pathInfo)
+ {
+ $pathInfo = '/';
+ }
+ return $pathInfo;
+ }
+ public function getPathInfoPrefix()
+ {
+ $prefix = $this->getRelativeUrlRoot();
+ if (!isset($this->options['no_script_name']) || !$this->options['no_script_name'])
+ {
+ $scriptName = $this->getScriptName();
+ $prefix = is_null($prefix) ? $scriptName : $prefix.'/'.basename($scriptName);
+ }
+ return $prefix;
+ }
+ public function getGetParameters()
+ {
+ return $this->getParameters;
+ }
+ public function getPostParameters()
+ {
+ return $this->postParameters;
+ }
+ public function getRequestParameters()
+ {
+ return $this->requestParameters;
+ }
+ public function addRequestParameters($parameters)
+ {
+ $this->requestParameters = array_merge($this->requestParameters, $parameters);
+ $this->getParameterHolder()->add($parameters);
+ $this->fixParameters();
+ }
+ public function getReferer()
+ {
+ $pathArray = $this->getPathInfoArray();
+ return isset($pathArray['HTTP_REFERER']) ? $pathArray['HTTP_REFERER'] : '';
+ }
+ public function getHost()
+ {
+ $pathArray = $this->getPathInfoArray();
+ return isset($pathArray['HTTP_X_FORWARDED_HOST']) ? $pathArray['HTTP_X_FORWARDED_HOST'] : (isset($pathArray['HTTP_HOST']) ? $pathArray['HTTP_HOST'] : '');
+ }
+ public function getScriptName()
+ {
+ $pathArray = $this->getPathInfoArray();
+ return isset($pathArray['SCRIPT_NAME']) ? $pathArray['SCRIPT_NAME'] : (isset($pathArray['ORIG_SCRIPT_NAME']) ? $pathArray['ORIG_SCRIPT_NAME'] : '');
+ }
+ public function isMethod($method)
+ {
+ return strtoupper($method) == $this->getMethod();
+ }
+ public function getMethodName()
+ {
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array('The "sfWebRequest::getMethodName()" method is deprecated, please use "getMethod()" instead.', 'priority' => sfLogger::WARNING)));
+ }
+ return $this->getMethod();
+ }
+ public function getPreferredCulture(array $cultures = null)
+ {
+ $preferredCultures = $this->getLanguages();
+ if (is_null($cultures))
+ {
+ return isset($preferredCultures[0]) ? $preferredCultures[0] : null;
+ }
+ if (!$preferredCultures)
+ {
+ return $cultures[0];
+ }
+ $preferredCultures = array_values(array_intersect($preferredCultures, $cultures));
+ return isset($preferredCultures[0]) ? $preferredCultures[0] : $cultures[0];
+ }
+ public function getLanguages()
+ {
+ if ($this->languages)
+ {
+ return $this->languages;
+ }
+ if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
+ {
+ return array();
+ }
+ $languages = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT_LANGUAGE']);
+ foreach ($languages as $lang)
+ {
+ if (strstr($lang, '-'))
+ {
+ $codes = explode('-', $lang);
+ if ($codes[0] == 'i')
+ {
+ if (count($codes) > 1)
+ {
+ $lang = $codes[1];
+ }
+ }
+ else
+ {
+ for ($i = 0, $max = count($codes); $i < $max; $i++)
+ {
+ if ($i == 0)
+ {
+ $lang = strtolower($codes[0]);
+ }
+ else
+ {
+ $lang .= '_'.strtoupper($codes[$i]);
+ }
+ }
+ }
+ }
+ $this->languages[] = $lang;
+ }
+ return $this->languages;
+ }
+ public function getCharsets()
+ {
+ if ($this->charsets)
+ {
+ return $this->charsets;
+ }
+ if (!isset($_SERVER['HTTP_ACCEPT_CHARSET']))
+ {
+ return array();
+ }
+ $this->charsets = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT_CHARSET']);
+ return $this->charsets;
+ }
+ public function getAcceptableContentTypes()
+ {
+ if ($this->acceptableContentTypes)
+ {
+ return $this->acceptableContentTypes;
+ }
+ if (!isset($_SERVER['HTTP_ACCEPT']))
+ {
+ return array();
+ }
+ $this->acceptableContentTypes = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT']);
+ return $this->acceptableContentTypes;
+ }
+ public function isXmlHttpRequest()
+ {
+ return ($this->getHttpHeader('X_REQUESTED_WITH') == 'XMLHttpRequest');
+ }
+ public function getHttpHeader($name, $prefix = 'http')
+ {
+ if ($prefix)
+ {
+ $prefix = strtoupper($prefix).'_';
+ }
+ $name = $prefix.strtoupper(strtr($name, '-', '_'));
+ $pathArray = $this->getPathInfoArray();
+ return isset($pathArray[$name]) ? sfToolkit::stripslashesDeep($pathArray[$name]) : null;
+ }
+ public function getCookie($name, $defaultValue = null)
+ {
+ $retval = $defaultValue;
+ if (isset($_COOKIE[$name]))
+ {
+ $retval = get_magic_quotes_gpc() ? sfToolkit::stripslashesDeep($_COOKIE[$name]) : $_COOKIE[$name];
+ }
+ return $retval;
+ }
+ public function isSecure()
+ {
+ $pathArray = $this->getPathInfoArray();
+ return (
+ (isset($pathArray['HTTPS']) && (strtolower($pathArray['HTTPS']) == 'on' || $pathArray['HTTPS'] == 1))
+ ||
+ (isset($pathArray['HTTP_SSL_HTTPS']) && (strtolower($pathArray['HTTP_SSL_HTTPS']) == 'on' || $pathArray['HTTP_SSL_HTTPS'] == 1))
+ ||
+ (isset($pathArray['HTTP_X_FORWARDED_PROTO']) && strtolower($pathArray['HTTP_X_FORWARDED_PROTO']) == 'https')
+ );
+ }
+ public function getRelativeUrlRoot()
+ {
+ if (is_null($this->relativeUrlRoot))
+ {
+ if (!isset($this->options['relative_url_root']))
+ {
+ $this->relativeUrlRoot = preg_replace('#/[^/]+\.php5?$#', '', $this->getScriptName());
+ }
+ else
+ {
+ $this->relativeUrlRoot = $this->options['relative_url_root'];
+ }
+ }
+ return $this->relativeUrlRoot;
+ }
+ public function setRelativeUrlRoot($value)
+ {
+ $this->relativeUrlRoot = $value;
+ }
+ public function splitHttpAcceptHeader($header)
+ {
+ $values = array();
+ foreach (array_filter(explode(',', $header)) as $value)
+ {
+ if ($pos = strpos($value, ';'))
+ {
+ $q = (float) trim(substr($value, $pos + 3));
+ $value = trim(substr($value, 0, $pos));
+ }
+ else
+ {
+ $q = 1;
+ }
+ $values[$value] = $q;
+ }
+ arsort($values);
+ return array_keys($values);
+ }
+ public function getPathInfoArray()
+ {
+ if (!$this->pathInfoArray)
+ {
+ switch ($this->options['path_info_array'])
+ {
+ case 'SERVER':
+ $this->pathInfoArray =& $_SERVER;
+ break;
+ case 'ENV':
+ default:
+ $this->pathInfoArray =& $_ENV;
+ }
+ }
+ return $this->pathInfoArray;
+ }
+ public function getMimeType($format)
+ {
+ return isset($this->formats[$format]) ? $this->formats[$format][0] : null;
+ }
+ public function getFormat($mimeType)
+ {
+ foreach ($this->formats as $format => $mimeTypes)
+ {
+ if (in_array($mimeType, $mimeTypes))
+ {
+ return $format;
+ }
+ }
+ return null;
+ }
+ public function setFormat($format, $mimeTypes)
+ {
+ $this->formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes);
+ }
+ public function setRequestFormat($format)
+ {
+ $this->format = $format;
+ }
+ public function getRequestFormat()
+ {
+ if (is_null($this->format))
+ {
+ $this->setRequestFormat($this->getParameter('sf_format'));
+ }
+ return $this->format;
+ }
+ public function getFiles($key = null)
+ {
+ if (false === $this->fixedFileArray)
+ {
+ $this->fixedFileArray = self::convertFileInformation($_FILES);
+ }
+ return is_null($key) ? $this->fixedFileArray : (isset($this->fixedFileArray[$key]) ? $this->fixedFileArray[$key] : array());
+ }
+ static public function convertFileInformation(array $taintedFiles)
+ {
+ $files = array();
+ foreach ($taintedFiles as $key => $data)
+ {
+ $files[$key] = self::fixPhpFilesArray($data);
+ }
+ return $files;
+ }
+ static protected function fixPhpFilesArray($data)
+ {
+ $fileKeys = array('error', 'name', 'size', 'tmp_name', 'type');
+ $keys = array_keys($data);
+ sort($keys);
+ if ($fileKeys != $keys || !isset($data['name']) || !is_array($data['name']))
+ {
+ return $data;
+ }
+ $files = $data;
+ foreach ($fileKeys as $k)
+ {
+ unset($files[$k]);
+ }
+ foreach (array_keys($data['name']) as $key)
+ {
+ $files[$key] = self::fixPhpFilesArray(array(
+ 'error' => $data['error'][$key],
+ 'name' => $data['name'][$key],
+ 'type' => $data['type'][$key],
+ 'tmp_name' => $data['tmp_name'][$key],
+ 'size' => $data['size'][$key],
+ ));
+ }
+ return $files;
+ }
+ public function getGetParameter($name, $default = null)
+ {
+ if (isset($this->getParameters[$name]))
+ {
+ return $this->getParameters[$name];
+ }
+ else
+ {
+ return sfToolkit::getArrayValueForPath($this->getParameters, $name, $default);
+ }
+ }
+ public function getPostParameter($name, $default = null)
+ {
+ if (isset($this->postParameters[$name]))
+ {
+ return $this->postParameters[$name];
+ }
+ else
+ {
+ return sfToolkit::getArrayValueForPath($this->postParameters, $name, $default);
+ }
+ }
+ public function getUrlParameter($name, $default = null)
+ {
+ if (isset($this->requestParameters[$name]))
+ {
+ return $this->requestParameters[$name];
+ }
+ else
+ {
+ return sfToolkit::getArrayValueForPath($this->requestParameters, $name, $default);
+ }
+ }
+ public function getRemoteAddress()
+ {
+ $pathInfo = $this->getPathInfoArray();
+ return $pathInfo['REMOTE_ADDR'];
+ }
+ public function getForwardedFor()
+ {
+ $pathInfo = $this->getPathInfoArray();
+ if (empty($pathInfo['HTTP_X_FORWARDED_FOR']))
+ {
+ return null;
+ }
+ return explode(', ', $pathInfo['HTTP_X_FORWARDED_FOR']);
+ }
+ public function checkCSRFProtection()
+ {
+ $form = new sfForm();
+ $form->bind($form->isCSRFProtected() ? array($form->getCSRFFieldName() => $this->getParameter($form->getCSRFFieldName())) : array());
+ if (!$form->isValid())
+ {
+ throw $form->getErrorSchema();
+ }
+ }
+ protected function parseRequestParameters()
+ {
+ return $this->dispatcher->filter(new sfEvent($this, 'request.filter_parameters', $this->getRequestContext()), array())->getReturnValue();
+ }
+ public function getRequestContext()
+ {
+ return array(
+ 'path_info' => $this->getPathInfo(),
+ 'prefix' => $this->getPathInfoPrefix(),
+ 'method' => $this->getMethod(),
+ 'format' => $this->getRequestFormat(),
+ 'host' => $this->getHost(),
+ 'is_secure' => $this->isSecure(),
+ 'request_uri' => $this->getUri(),
+ );
+ }
+ protected function fixParameters()
+ {
+ foreach ($this->parameterHolder->getAll() as $key => $value)
+ {
+ if (0 === stripos($key, '_sf_'))
+ {
+ $this->parameterHolder->remove($key);
+ $this->setAttribute(substr($key, 1), $value);
+ }
+ }
+ }
+}
+
+
+class sfPatternRouting extends sfRouting
+{
+ protected
+ $currentRouteName = null,
+ $currentInternalUri = array(),
+ $routes = array(),
+ $cacheData = array(),
+ $cacheChanged = false,
+ $routesFullyLoaded = true;
+ public function initialize(sfEventDispatcher $dispatcher, sfCache $cache = null, $options = array())
+ {
+ $options = array_merge(array(
+ 'variable_prefixes' => array(':'),
+ 'segment_separators' => array('/', '.'),
+ 'variable_regex' => '[\w\d_]+',
+ 'load_configuration' => false,
+ 'suffix' => '',
+ 'generate_shortest_url' => true,
+ 'extra_parameters_as_query_string' => true,
+ 'lazy_routes_deserialize' => false,
+ 'lookup_cache_dedicated_keys' => false,
+ ), $options);
+ if ('.' == $options['suffix'])
+ {
+ $options['suffix'] = '';
+ }
+ parent::initialize($dispatcher, $cache, $options);
+ if (!is_null($this->cache) && !$options['lookup_cache_dedicated_keys'] && $cacheData = $this->cache->get('symfony.routing.data'))
+ {
+ $this->cacheData = unserialize($cacheData);
+ }
+ }
+ public function loadConfiguration()
+ {
+ if (!is_null($this->cache) && $routes = $this->cache->get('symfony.routing.configuration'))
+ {
+ $this->routes = unserialize($routes);
+ $this->routesFullyLoaded = false;
+ }
+ else
+ {
+ if ($this->options['load_configuration'] && $config = sfContext::getInstance()->getConfigCache()->checkConfig('config/routing.yml', true))
+ {
+ $this->setRoutes(include($config));
+ }
+ parent::loadConfiguration();
+ if (!is_null($this->cache))
+ {
+ if (!$this->options['lazy_routes_deserialize'])
+ {
+ $this->cache->set('symfony.routing.configuration', serialize($this->routes));
+ }
+ else
+ {
+ $lazyMap = array();
+ foreach ($this->routes as $name => $route)
+ {
+ if (is_string($route))
+ {
+ $route = $this->loadRoute($name);
+ }
+ $lazyMap[$name] = serialize($route);
+ }
+ $this->cache->set('symfony.routing.configuration', serialize($lazyMap));
+ }
+ }
+ }
+ }
+ protected function loadRoute($name)
+ {
+ if (is_string($route = $this->routes[$name]))
+ {
+ $this->routes[$name] = unserialize($route);
+ $this->routes[$name]->setDefaultParameters($this->defaultParameters);
+ return $this->routes[$name];
+ }
+ else
+ {
+ return $route;
+ }
+ }
+ protected function loadRoutes()
+ {
+ if ($this->routesFullyLoaded)
+ {
+ return;
+ }
+ foreach ($this->routes as $name => $route)
+ {
+ if (is_string($route))
+ {
+ $this->loadRoute($name);
+ }
+ }
+ $this->routesFullyLoaded = true;
+ }
+ public function getCurrentInternalUri($withRouteName = false)
+ {
+ return is_null($this->currentRouteName) ? null : $this->currentInternalUri[$withRouteName ? 0 : 1];
+ }
+ public function getCurrentRouteName()
+ {
+ return $this->currentRouteName;
+ }
+ public function getRoutes()
+ {
+ if (!$this->routesFullyLoaded)
+ {
+ $this->loadRoutes();
+ }
+ return $this->routes;
+ }
+ public function setRoutes($routes)
+ {
+ foreach ($routes as $name => $route)
+ {
+ $this->connect($name, $route);
+ }
+ if (!$this->routesFullyLoaded)
+ {
+ $this->loadRoutes();
+ }
+ return $this->routes;
+ }
+ public function hasRoutes()
+ {
+ return count($this->routes) ? true : false;
+ }
+ public function clearRoutes()
+ {
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array('Clear all current routes')));
+ }
+ $this->routes = array();
+ }
+ public function hasRouteName($name)
+ {
+ return isset($this->routes[$name]) ? true : false;
+ }
+ public function prependRoute($name, $route)
+ {
+ $routes = $this->routes;
+ $this->routes = array();
+ $newroutes = $this->connect($name, $route);
+ $this->routes = array_merge($newroutes, $routes);
+ if (!$this->routesFullyLoaded)
+ {
+ $this->loadRoutes();
+ }
+ return $this->routes;
+ }
+ public function appendRoute($name, $route)
+ {
+ return $this->connect($name, $route);
+ }
+ public function insertRouteBefore($pivot, $name, $route)
+ {
+ if (!isset($this->routes[$pivot]))
+ {
+ throw new sfConfigurationException(sprintf('Unable to insert route "%s" before inexistent route "%s".', $name, $pivot));
+ }
+ $routes = $this->routes;
+ $this->routes = array();
+ $newroutes = array();
+ foreach ($routes as $key => $value)
+ {
+ if ($key == $pivot)
+ {
+ $newroutes = array_merge($newroutes, $this->connect($name, $route));
+ }
+ $newroutes[$key] = $value;
+ }
+ $this->routes = $newroutes;
+ if (!$this->routesFullyLoaded)
+ {
+ $this->loadRoutes();
+ }
+ return $this->routes;
+ }
+ public function connect($name, $route)
+ {
+ $routes = $route instanceof sfRouteCollection ? $route : array($name => $route);
+ foreach (self::flattenRoutes($routes) as $name => $route)
+ {
+ $this->routes[$name] = $route;
+ $this->configureRoute($route);
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Connect %s "%s" (%s)', get_class($route), $name, $route->getPattern()))));
+ }
+ }
+ if (!$this->routesFullyLoaded)
+ {
+ $this->loadRoutes();
+ }
+ return $this->routes;
+ }
+ public function configureRoute(sfRoute $route)
+ {
+ $route->setDefaultParameters($this->defaultParameters);
+ $route->setDefaultOptions($this->options);
+ }
+ public function generate($name, $params = array(), $absolute = false)
+ {
+ if (!is_null($this->cache))
+ {
+ $cacheKey = 'generate_'.$name.'_'.md5(serialize(array_merge($this->defaultParameters, $params))).'_'.md5(serialize($this->options['context']));
+ if ($this->options['lookup_cache_dedicated_keys'] && $url = $this->cache->get('symfony.routing.data.'.$cacheKey))
+ {
+ return $this->fixGeneratedUrl($url, $absolute);
+ }
+ elseif (isset($this->cacheData[$cacheKey]))
+ {
+ return $this->fixGeneratedUrl($this->cacheData[$cacheKey], $absolute);
+ }
+ }
+ if ($name)
+ {
+ if (!isset($this->routes[$name]))
+ {
+ throw new sfConfigurationException(sprintf('The route "%s" does not exist.', $name));
+ }
+ $route = $this->routes[$name];
+ if (is_string($route))
+ {
+ $route = $this->loadRoute($name);
+ }
+ $route->setDefaultParameters($this->defaultParameters);
+ }
+ else
+ {
+ if (false === $route = $this->getRouteThatMatchesParameters($params, $this->options['context']))
+ {
+ throw new sfConfigurationException(sprintf('Unable to find a matching route to generate url for params "%s".', is_object($params) ? 'Object('.get_class($params).')' : str_replace("\n", '', var_export($params, true))));
+ }
+ }
+ $url = $route->generate($params, $this->options['context'], $absolute);
+ if (!is_null($this->cache))
+ {
+ if ($this->options['lookup_cache_dedicated_keys'])
+ {
+ $this->cache->set('symfony.routing.data.'.$cacheKey, $url);
+ }
+ else
+ {
+ $this->cacheChanged = true;
+ $this->cacheData[$cacheKey] = $url;
+ }
+ }
+ return $this->fixGeneratedUrl($url, $absolute);
+ }
+ public function parse($url)
+ {
+ if (false === $info = $this->findRoute($url))
+ {
+ $this->currentRouteName = null;
+ $this->currentInternalUri = array();
+ return false;
+ }
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Match route "%s" (%s) for %s with parameters %s', $info['name'], $info['pattern'], $url, str_replace("\n", '', var_export($info['parameters'], true))))));
+ }
+ $this->updateCurrentInternalUri($info['name'], $info['parameters']);
+ $route = $this->routes[$info['name']];
+ if (is_string($route))
+ {
+ $route = $this->loadRoute($info['name']);
+ }
+ $route->setDefaultParameters($this->defaultParameters);
+ $route->bind($this->options['context'], $info['parameters']);
+ $info['parameters']['_sf_route'] = $route;
+ return $info['parameters'];
+ }
+ protected function updateCurrentInternalUri($name, array $parameters)
+ {
+ $this->currentRouteName = $name;
+ $internalUri = array('@'.$this->currentRouteName, $parameters['module'].'/'.$parameters['action']);
+ unset($parameters['module'], $parameters['action']);
+ $params = array();
+ foreach ($parameters as $key => $value)
+ {
+ $params[] = $key.'='.$value;
+ }
+ sort($params);
+ $params = $params ? '?'.implode('&', $params) : '';
+ $this->currentInternalUri = array($internalUri[0].$params, $internalUri[1].$params);
+ }
+ public function findRoute($url)
+ {
+ $url = $this->normalizeUrl($url);
+ if (!is_null($this->cache))
+ {
+ $cacheKey = 'parse_'.$url.'_'.md5(serialize($this->options['context']));
+ if ($this->options['lookup_cache_dedicated_keys'] && $info = $this->cache->get('symfony.routing.data.'.$cacheKey))
+ {
+ return unserialize($info);
+ }
+ elseif (isset($this->cacheData[$cacheKey]))
+ {
+ return $this->cacheData[$cacheKey];
+ }
+ }
+ $info = $this->getRouteThatMatchesUrl($url);
+ if (!is_null($this->cache))
+ {
+ if ($this->options['lookup_cache_dedicated_keys'])
+ {
+ $this->cache->set('symfony.routing.data.'.$cacheKey, serialize($info));
+ }
+ else
+ {
+ $this->cacheChanged = true;
+ $this->cacheData[$cacheKey] = $info;
+ }
+ }
+ return $info;
+ }
+ static public function flattenRoutes($routes)
+ {
+ $flattenRoutes = array();
+ foreach ($routes as $name => $route)
+ {
+ if ($route instanceof sfRouteCollection)
+ {
+ $flattenRoutes = array_merge($flattenRoutes, self::flattenRoutes($route));
+ }
+ else
+ {
+ $flattenRoutes[$name] = $route;
+ }
+ }
+ return $flattenRoutes;
+ }
+ protected function getRouteThatMatchesUrl($url)
+ {
+ foreach ($this->routes as $name => $route)
+ {
+ if (is_string($route))
+ {
+ $route = $this->loadRoute($name);
+ }
+ $route->setDefaultParameters($this->defaultParameters);
+ if (false === $parameters = $route->matchesUrl($url, $this->options['context']))
+ {
+ continue;
+ }
+ return array('name' => $name, 'pattern' => $route->getPattern(), 'parameters' => $parameters);
+ }
+ return false;
+ }
+ protected function getRouteThatMatchesParameters($parameters)
+ {
+ foreach ($this->routes as $name => $route)
+ {
+ if (is_string($route))
+ {
+ $route = $this->loadRoute($name);
+ }
+ $route->setDefaultParameters($this->defaultParameters);
+ if ($route->matchesParameters($parameters, $this->options['context']))
+ {
+ return $route;
+ }
+ }
+ return false;
+ }
+ protected function normalizeUrl($url)
+ {
+ if ('/' != substr($url, 0, 1))
+ {
+ $url = '/'.$url;
+ }
+ if (false !== $pos = strpos($url, '?'))
+ {
+ $url = substr($url, 0, $pos);
+ }
+ $url = preg_replace('#/+#', '/', $url);
+ return $url;
+ }
+ public function shutdown()
+ {
+ if (!is_null($this->cache) && $this->cacheChanged)
+ {
+ $this->cacheChanged = false;
+ $this->cache->set('symfony.routing.data', serialize($this->cacheData));
+ }
+ }
+}
+
+
+class sfWebResponse extends sfResponse
+{
+ const
+ FIRST = 'first',
+ MIDDLE = '',
+ LAST = 'last',
+ ALL = 'ALL',
+ RAW = 'RAW';
+ protected
+ $cookies = array(),
+ $statusCode = 200,
+ $statusText = 'OK',
+ $headerOnly = false,
+ $headers = array(),
+ $metas = array(),
+ $httpMetas = array(),
+ $positions = array('first', '', 'last'),
+ $stylesheets = array(),
+ $javascripts = array(),
+ $slots = array();
+ static protected $statusTexts = array(
+ '100' => 'Continue',
+ '101' => 'Switching Protocols',
+ '200' => 'OK',
+ '201' => 'Created',
+ '202' => 'Accepted',
+ '203' => 'Non-Authoritative Information',
+ '204' => 'No Content',
+ '205' => 'Reset Content',
+ '206' => 'Partial Content',
+ '300' => 'Multiple Choices',
+ '301' => 'Moved Permanently',
+ '302' => 'Found',
+ '303' => 'See Other',
+ '304' => 'Not Modified',
+ '305' => 'Use Proxy',
+ '306' => '(Unused)',
+ '307' => 'Temporary Redirect',
+ '400' => 'Bad Request',
+ '401' => 'Unauthorized',
+ '402' => 'Payment Required',
+ '403' => 'Forbidden',
+ '404' => 'Not Found',
+ '405' => 'Method Not Allowed',
+ '406' => 'Not Acceptable',
+ '407' => 'Proxy Authentication Required',
+ '408' => 'Request Timeout',
+ '409' => 'Conflict',
+ '410' => 'Gone',
+ '411' => 'Length Required',
+ '412' => 'Precondition Failed',
+ '413' => 'Request Entity Too Large',
+ '414' => 'Request-URI Too Long',
+ '415' => 'Unsupported Media Type',
+ '416' => 'Requested Range Not Satisfiable',
+ '417' => 'Expectation Failed',
+ '500' => 'Internal Server Error',
+ '501' => 'Not Implemented',
+ '502' => 'Bad Gateway',
+ '503' => 'Service Unavailable',
+ '504' => 'Gateway Timeout',
+ '505' => 'HTTP Version Not Supported',
+ );
+ public function initialize(sfEventDispatcher $dispatcher, $options = array())
+ {
+ parent::initialize($dispatcher, $options);
+ $this->javascripts = array_combine($this->positions, array_fill(0, count($this->positions), array()));
+ $this->stylesheets = array_combine($this->positions, array_fill(0, count($this->positions), array()));
+ if (!isset($this->options['charset']))
+ {
+ $this->options['charset'] = 'utf-8';
+ }
+ if (!isset($this->options['send_http_headers']))
+ {
+ $this->options['send_http_headers'] = true;
+ }
+ if (!isset($this->options['http_protocol']))
+ {
+ $this->options['http_protocol'] = 'HTTP/1.0';
+ }
+ $this->options['content_type'] = $this->fixContentType(isset($this->options['content_type']) ? $this->options['content_type'] : 'text/html');
+ }
+ public function setHeaderOnly($value = true)
+ {
+ $this->headerOnly = (boolean) $value;
+ }
+ public function isHeaderOnly()
+ {
+ return $this->headerOnly;
+ }
+ public function setCookie($name, $value, $expire = null, $path = '/', $domain = '', $secure = false, $httpOnly = false)
+ {
+ if ($expire !== null)
+ {
+ if (is_numeric($expire))
+ {
+ $expire = (int) $expire;
+ }
+ else
+ {
+ $expire = strtotime($expire);
+ if ($expire === false || $expire == -1)
+ {
+ throw new sfException('Your expire parameter is not valid.');
+ }
+ }
+ }
+ $this->cookies[$name] = array(
+ 'name' => $name,
+ 'value' => $value,
+ 'expire' => $expire,
+ 'path' => $path,
+ 'domain' => $domain,
+ 'secure' => $secure ? true : false,
+ 'httpOnly' => $httpOnly,
+ );
+ }
+ public function setStatusCode($code, $name = null)
+ {
+ $this->statusCode = $code;
+ $this->statusText = null !== $name ? $name : self::$statusTexts[$code];
+ }
+ public function getStatusText()
+ {
+ return $this->statusText;
+ }
+ public function getStatusCode()
+ {
+ return $this->statusCode;
+ }
+ public function setHttpHeader($name, $value, $replace = true)
+ {
+ $name = $this->normalizeHeaderName($name);
+ if (is_null($value))
+ {
+ unset($this->headers[$name]);
+ return;
+ }
+ if ('Content-Type' == $name)
+ {
+ if ($replace || !$this->getHttpHeader('Content-Type', null))
+ {
+ $this->setContentType($value);
+ }
+ return;
+ }
+ if (!$replace)
+ {
+ $current = isset($this->headers[$name]) ? $this->headers[$name] : '';
+ $value = ($current ? $current.', ' : '').$value;
+ }
+ $this->headers[$name] = $value;
+ }
+ public function getHttpHeader($name, $default = null)
+ {
+ $name = $this->normalizeHeaderName($name);
+ return isset($this->headers[$name]) ? $this->headers[$name] : $default;
+ }
+ public function hasHttpHeader($name)
+ {
+ return array_key_exists($this->normalizeHeaderName($name), $this->headers);
+ }
+ public function setContentType($value)
+ {
+ $this->headers['Content-Type'] = $this->fixContentType($value);
+ }
+ public function getCharset()
+ {
+ return $this->options['charset'];
+ }
+ public function getContentType()
+ {
+ return $this->getHttpHeader('Content-Type', $this->options['content_type']);
+ }
+ public function sendHttpHeaders()
+ {
+ if (!$this->options['send_http_headers'])
+ {
+ return;
+ }
+ $status = $this->options['http_protocol'].' '.$this->statusCode.' '.$this->statusText;
+ header($status);
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Send status "%s"', $status))));
+ }
+ if (!$this->getHttpHeader('Content-Type'))
+ {
+ $this->setContentType($this->options['content_type']);
+ }
+ foreach ($this->headers as $name => $value)
+ {
+ header($name.': '.$value);
+ if ($value != '' && $this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Send header "%s: %s"', $name, $value))));
+ }
+ }
+ foreach ($this->cookies as $cookie)
+ {
+ setrawcookie($cookie['name'], $cookie['value'], $cookie['expire'], $cookie['path'], $cookie['domain'], $cookie['secure'], $cookie['httpOnly']);
+ if ($this->options['logging'])
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Send cookie "%s": "%s"', $cookie['name'], $cookie['value']))));
+ }
+ }
+ }
+ public function sendContent()
+ {
+ if (!$this->headerOnly)
+ {
+ parent::sendContent();
+ }
+ }
+ public function send()
+ {
+ $this->sendHttpHeaders();
+ $this->sendContent();
+ }
+ protected function normalizeHeaderName($name)
+ {
+ return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", strtr(ucfirst(strtolower($name)), '_', '-'));
+ }
+ static public function getDate($timestamp, $type = 'rfc1123')
+ {
+ $type = strtolower($type);
+ if ($type == 'rfc1123')
+ {
+ return substr(gmdate('r', $timestamp), 0, -5).'GMT';
+ }
+ else if ($type == 'rfc1036')
+ {
+ return gmdate('l, d-M-y H:i:s ', $timestamp).'GMT';
+ }
+ else if ($type == 'asctime')
+ {
+ return gmdate('D M j H:i:s', $timestamp);
+ }
+ else
+ {
+ throw new InvalidArgumentException('The second getDate() method parameter must be one of: rfc1123, rfc1036 or asctime.');
+ }
+ }
+ public function addVaryHttpHeader($header)
+ {
+ $vary = $this->getHttpHeader('Vary');
+ $currentHeaders = array();
+ if ($vary)
+ {
+ $currentHeaders = preg_split('/\s*,\s*/', $vary);
+ }
+ $header = $this->normalizeHeaderName($header);
+ if (!in_array($header, $currentHeaders))
+ {
+ $currentHeaders[] = $header;
+ $this->setHttpHeader('Vary', implode(', ', $currentHeaders));
+ }
+ }
+ public function addCacheControlHttpHeader($name, $value = null)
+ {
+ $cacheControl = $this->getHttpHeader('Cache-Control');
+ $currentHeaders = array();
+ if ($cacheControl)
+ {
+ foreach (preg_split('/\s*,\s*/', $cacheControl) as $tmp)
+ {
+ $tmp = explode('=', $tmp);
+ $currentHeaders[$tmp[0]] = isset($tmp[1]) ? $tmp[1] : null;
+ }
+ }
+ $currentHeaders[strtr(strtolower($name), '_', '-')] = $value;
+ $headers = array();
+ foreach ($currentHeaders as $key => $value)
+ {
+ $headers[] = $key.(null !== $value ? '='.$value : '');
+ }
+ $this->setHttpHeader('Cache-Control', implode(', ', $headers));
+ }
+ public function getHttpMetas()
+ {
+ return $this->httpMetas;
+ }
+ public function addHttpMeta($key, $value, $replace = true)
+ {
+ $key = $this->normalizeHeaderName($key);
+ $this->setHttpHeader($key, $value, $replace);
+ if (is_null($value))
+ {
+ unset($this->httpMetas[$key]);
+ return;
+ }
+ if ('Content-Type' == $key)
+ {
+ $value = $this->getContentType();
+ }
+ elseif (!$replace)
+ {
+ $current = isset($this->httpMetas[$key]) ? $this->httpMetas[$key] : '';
+ $value = ($current ? $current.', ' : '').$value;
+ }
+ $this->httpMetas[$key] = $value;
+ }
+ public function getMetas()
+ {
+ return $this->metas;
+ }
+ public function addMeta($key, $value, $replace = true, $escape = true)
+ {
+ $key = strtolower($key);
+ if (is_null($value))
+ {
+ unset($this->metas[$key]);
+ return;
+ }
+ if ($escape)
+ {
+ $value = htmlspecialchars($value, ENT_QUOTES, $this->options['charset']);
+ }
+ $current = isset($this->metas[$key]) ? $this->metas[$key] : null;
+ if ($replace || !$current)
+ {
+ $this->metas[$key] = $value;
+ }
+ }
+ public function getTitle()
+ {
+ return isset($this->metas['title']) ? $this->metas['title'] : '';
+ }
+ public function setTitle($title, $escape = true)
+ {
+ $this->addMeta('title', $title, true, $escape);
+ }
+ public function getPositions()
+ {
+ return $this->positions;
+ }
+ public function getStylesheets($position = self::ALL)
+ {
+ if (self::ALL === $position)
+ {
+ $stylesheets = array();
+ foreach ($this->getPositions() as $position)
+ {
+ foreach ($this->stylesheets[$position] as $file => $options)
+ {
+ $stylesheets[$file] = $options;
+ }
+ }
+ return $stylesheets;
+ }
+ else if (self::RAW === $position)
+ {
+ return $this->stylesheets;
+ }
+ $this->validatePosition($position);
+ return $this->stylesheets[$position];
+ }
+ public function addStylesheet($file, $position = '', $options = array())
+ {
+ $this->validatePosition($position);
+ $this->stylesheets[$position][$file] = $options;
+ }
+ public function removeStylesheet($file)
+ {
+ foreach ($this->getPositions() as $position)
+ {
+ unset($this->stylesheets[$position][$file]);
+ }
+ }
+ public function getJavascripts($position = self::ALL)
+ {
+ if (self::ALL === $position)
+ {
+ $javascripts = array();
+ foreach ($this->getPositions() as $position)
+ {
+ foreach ($this->javascripts[$position] as $file => $options)
+ {
+ $javascripts[$file] = $options;
+ }
+ }
+ return $javascripts;
+ }
+ else if (self::RAW === $position)
+ {
+ return $this->javascripts;
+ }
+ $this->validatePosition($position);
+ return $this->javascripts[$position];
+ }
+ public function addJavascript($file, $position = '', $options = array())
+ {
+ $this->validatePosition($position);
+ $this->javascripts[$position][$file] = $options;
+ }
+ public function removeJavascript($file)
+ {
+ foreach ($this->getPositions() as $position)
+ {
+ unset($this->javascripts[$position][$file]);
+ }
+ }
+ public function getSlots()
+ {
+ return $this->slots;
+ }
+ public function setSlot($name, $content)
+ {
+ $this->slots[$name] = $content;
+ }
+ public function getCookies()
+ {
+ return $this->cookies;
+ }
+ public function getHttpHeaders()
+ {
+ return $this->headers;
+ }
+ public function clearHttpHeaders()
+ {
+ $this->headers = array();
+ }
+ public function copyProperties(sfWebResponse $response)
+ {
+ $this->options = $response->getOptions();
+ $this->headers = $response->getHttpHeaders();
+ $this->metas = $response->getMetas();
+ $this->httpMetas = $response->getHttpMetas();
+ $this->stylesheets = $response->getStylesheets(self::RAW);
+ $this->javascripts = $response->getJavascripts(self::RAW);
+ $this->slots = $response->getSlots();
+ }
+ public function merge(sfWebResponse $response)
+ {
+ foreach ($this->getPositions() as $position)
+ {
+ $this->javascripts[$position] = array_merge($this->getJavascripts($position), $response->getJavascripts($position));
+ $this->stylesheets[$position] = array_merge($this->getStylesheets($position), $response->getStylesheets($position));
+ }
+ $this->slots = array_merge($this->getSlots(), $response->getSlots());
+ }
+ public function serialize()
+ {
+ return serialize(array($this->content, $this->statusCode, $this->statusText, $this->options, $this->cookies, $this->headerOnly, $this->headers, $this->metas, $this->httpMetas, $this->stylesheets, $this->javascripts, $this->slots));
+ }
+ public function unserialize($serialized)
+ {
+ list($this->content, $this->statusCode, $this->statusText, $this->options, $this->cookies, $this->headerOnly, $this->headers, $this->metas, $this->httpMetas, $this->stylesheets, $this->javascripts, $this->slots) = unserialize($serialized);
+ }
+ protected function validatePosition($position)
+ {
+ if (!in_array($position, $this->positions, true))
+ {
+ throw new InvalidArgumentException(sprintf('The position "%s" does not exist (available positions: %s).', $position, implode(', ', $this->positions)));
+ }
+ }
+ protected function fixContentType($contentType)
+ {
+ if (false === stripos($contentType, 'charset') && (0 === stripos($contentType, 'text/') || strlen($contentType) - 3 === strripos($contentType, 'xml')))
+ {
+ $contentType .= '; charset='.$this->options['charset'];
+ }
+ if (preg_match('/charset\s*=\s*(.+)\s*$/', $contentType, $match))
+ {
+ $this->options['charset'] = $match[1];
+ }
+ return $contentType;
+ }
+}
+
+
+class sfSessionStorage extends sfStorage
+{
+ static protected
+ $sessionIdRegenerated = false,
+ $sessionStarted = false;
+ public function initialize($options = null)
+ {
+ $cookieDefaults = session_get_cookie_params();
+ $options = array_merge(array(
+ 'session_name' => 'symfony',
+ 'session_id' => null,
+ 'auto_start' => true,
+ 'session_cookie_lifetime' => $cookieDefaults['lifetime'],
+ 'session_cookie_path' => $cookieDefaults['path'],
+ 'session_cookie_domain' => $cookieDefaults['domain'],
+ 'session_cookie_secure' => $cookieDefaults['secure'],
+ 'session_cookie_httponly' => isset($cookieDefaults['httponly']) ? $cookieDefaults['httponly'] : false,
+ 'session_cache_limiter' => 'none',
+ ), $options);
+ parent::initialize($options);
+ $sessionName = $this->options['session_name'];
+ session_name($sessionName);
+ if (!(boolean) ini_get('session.use_cookies') && $sessionId = $this->options['session_id'])
+ {
+ session_id($sessionId);
+ }
+ $lifetime = $this->options['session_cookie_lifetime'];
+ $path = $this->options['session_cookie_path'];
+ $domain = $this->options['session_cookie_domain'];
+ $secure = $this->options['session_cookie_secure'];
+ $httpOnly = $this->options['session_cookie_httponly'];
+ session_set_cookie_params($lifetime, $path, $domain, $secure, $httpOnly);
+ if (!is_null($this->options['session_cache_limiter']))
+ {
+ session_cache_limiter($this->options['session_cache_limiter']);
+ }
+ if ($this->options['auto_start'] && !self::$sessionStarted)
+ {
+ session_start();
+ self::$sessionStarted = true;
+ }
+ }
+ public function read($key)
+ {
+ $retval = null;
+ if (isset($_SESSION[$key]))
+ {
+ $retval = $_SESSION[$key];
+ }
+ return $retval;
+ }
+ public function remove($key)
+ {
+ $retval = null;
+ if (isset($_SESSION[$key]))
+ {
+ $retval = $_SESSION[$key];
+ unset($_SESSION[$key]);
+ }
+ return $retval;
+ }
+ public function write($key, $data)
+ {
+ $_SESSION[$key] = $data;
+ }
+ public function regenerate($destroy = false)
+ {
+ if (self::$sessionIdRegenerated)
+ {
+ return;
+ }
+ session_regenerate_id($destroy);
+ self::$sessionIdRegenerated = true;
+ }
+ public function shutdown()
+ {
+ session_write_close();
+ }
+}
+
+
+class sfPHPView extends sfView
+{
+ public function execute()
+ {
+ }
+ protected function loadCoreAndStandardHelpers()
+ {
+ static $coreHelpersLoaded = 0;
+ if ($coreHelpersLoaded)
+ {
+ return;
+ }
+ $coreHelpersLoaded = 1;
+ $helpers = array_unique(array_merge(array('Helper', 'Url', 'Asset', 'Tag', 'Escaping'), sfConfig::get('sf_standard_helpers')));
+ if (!sfConfig::get('sf_compat_10') && false !== $i = array_search('Form', $helpers))
+ {
+ unset($helpers[$i]);
+ }
+ $this->context->getConfiguration()->loadHelpers($helpers);
+ }
+ protected function renderFile($_sfFile)
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Render "%s"', $_sfFile))));
+ }
+ $this->loadCoreAndStandardHelpers();
+ extract($this->attributeHolder->toArray());
+ ob_start();
+ ob_implicit_flush(0);
+ require($_sfFile);
+ return ob_get_clean();
+ }
+ public function getEngine()
+ {
+ return null;
+ }
+ public function configure()
+ {
+ $this->context->set('view_instance', $this);
+ require($this->context->getConfigCache()->checkConfig('modules/'.$this->moduleName.'/config/view.yml'));
+ if (!$this->directory)
+ {
+ $this->setDirectory($this->context->getConfiguration()->getTemplateDir($this->moduleName, $this->getTemplate()));
+ }
+ }
+ protected function decorate($content)
+ {
+ if (sfConfig::get('sf_logging_enabled'))
+ {
+ $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Decorate content with "%s/%s"', $this->getDecoratorDirectory(), $this->getDecoratorTemplate()))));
+ }
+ $attributeHolder = $this->attributeHolder;
+ $this->attributeHolder = $this->initializeAttributeHolder(array('sf_content' => new sfOutputEscaperSafe($content)));
+ $this->attributeHolder->set('sf_type', 'layout');
+ $ret = $this->renderFile($this->getDecoratorDirectory().'/'.$this->getDecoratorTemplate());
+ $this->attributeHolder = $attributeHolder;
+ return $ret;
+ }
+ public function render()
+ {
+ $content = null;
+ if (sfConfig::get('sf_cache'))
+ {
+ $viewCache = $this->context->getViewCacheManager();
+ $uri = $this->context->getRouting()->getCurrentInternalUri();
+ if (!is_null($uri))
+ {
+ list($content, $decoratorTemplate) = $viewCache->getActionCache($uri);
+ if (!is_null($content))
+ {
+ $this->setDecoratorTemplate($decoratorTemplate);
+ }
+ }
+ }
+ if (is_null($content))
+ {
+ $this->preRenderCheck();
+ $this->attributeHolder->set('sf_type', 'action');
+ $content = $this->renderFile($this->getDirectory().'/'.$this->getTemplate());
+ if (sfConfig::get('sf_cache') && !is_null($uri))
+ {
+ $content = $viewCache->setActionCache($uri, $content, $this->isDecorator() ? $this->getDecoratorDirectory().'/'.$this->getDecoratorTemplate() : false);
+ }
+ }
+ if ($this->isDecorator())
+ {
+ $content = $this->decorate($content);
+ }
+ return $content;
+ }
+}
+
+
+class sfOutputEscaperSafe extends ArrayIterator
+{
+ protected
+ $value = null;
+ public function __construct($value)
+ {
+ $this->value = $value;
+ if (is_array($value) || is_object($value))
+ {
+ parent::__construct($value);
+ }
+ }
+ public function __toString()
+ {
+ return (string) $this->value;
+ }
+ public function __get($key)
+ {
+ return $this->value->$key;
+ }
+ public function __set($key, $value)
+ {
+ $this->value->$key = $value;
+ }
+ public function __call($method, $arguments)
+ {
+ return call_user_func_array(array($this->value, $method), $arguments);
+ }
+ public function __isset($key)
+ {
+ return isset($this->value->$key);
+ }
+ public function __unset($key)
+ {
+ unset($this->value->$key);
+ }
+ public function getValue()
+ {
+ return $this->value;
+ }
+}
+