source: cpc/trunk/project/cache/frontend/prod/config/config_core_compile.yml.php @ 2

Last change on this file since 2 was 2, checked in by teymour, 12 years ago

Permier commit

File size: 117.5 KB
Line 
1<?php
2// auto-generated by sfCompileConfigHandler
3// date: 2009/07/01 13:11:08
4
5
6class sfAutoload
7{
8  static protected
9    $freshCache = false,
10    $instance   = null;
11  protected
12    $overriden = array(),
13    $classes   = array();
14  protected function __construct()
15  {
16  }
17  static public function getInstance()
18  {
19    if (!isset(self::$instance))
20    {
21      self::$instance = new sfAutoload();
22    }
23    return self::$instance;
24  }
25  static public function register()
26  {
27    ini_set('unserialize_callback_func', 'spl_autoload_call');
28    if (false === spl_autoload_register(array(self::getInstance(), 'autoload')))
29    {
30      throw new sfException(sprintf('Unable to register %s::autoload as an autoloading method.', get_class(self::getInstance())));
31    }
32  }
33  static public function unregister()
34  {
35    spl_autoload_unregister(array(self::getInstance(), 'autoload'));
36  }
37  public function setClassPath($class, $path)
38  {
39    $this->overriden[$class] = $path;
40    $this->classes[$class] = $path;
41  }
42  public function getClassPath($class)
43  {
44    return isset($this->classes[$class]) ? $this->classes[$class] : null;
45  }
46  public function reloadClasses($force = false)
47  {
48        if (self::$freshCache)
49    {
50      return;
51    }
52    $configuration = sfProjectConfiguration::getActive();
53    if (!$configuration || !$configuration instanceof sfApplicationConfiguration)
54    {
55      return;
56    }
57    self::$freshCache = true;
58    if (file_exists($configuration->getConfigCache()->getCacheName('config/autoload.yml')))
59    {
60      self::$freshCache = false;
61      if ($force)
62      {
63        unlink($configuration->getConfigCache()->getCacheName('config/autoload.yml'));
64      }
65    }
66    $file = $configuration->getConfigCache()->checkConfig('config/autoload.yml');
67    $this->classes = include($file);
68    foreach ($this->overriden as $class => $path)
69    {
70      $this->classes[$class] = $path;
71    }
72  }
73  public function autoload($class)
74  {
75        if (!$this->classes)
76    {
77      self::reloadClasses();
78    }
79    return self::loadClass($class);
80  }
81  public function autoloadAgain($class)
82  {
83    self::reloadClasses(true);
84    return self::loadClass($class);
85  }
86  public function loadClass($class)
87  {
88        if (class_exists($class, false) || interface_exists($class, false))
89    {
90      return true;
91    }
92        if (isset($this->classes[$class]))
93    {
94      require($this->classes[$class]);
95      return true;
96    }
97            if (sfContext::hasInstance() && ($module = sfContext::getInstance()->getModuleName()) && isset($this->classes[$module.'/'.$class]))
98    {
99      require($this->classes[$module.'/'.$class]);
100      return true;
101    }
102    return false;
103  }
104}
105
106
107abstract class sfComponent
108{
109  protected
110    $moduleName             = '',
111    $actionName             = '',
112    $context                = null,
113    $dispatcher             = null,
114    $request                = null,
115    $response               = null,
116    $varHolder              = null,
117    $requestParameterHolder = null;
118  public function __construct($context, $moduleName, $actionName)
119  {
120    $this->initialize($context, $moduleName, $actionName);
121  }
122  public function initialize($context, $moduleName, $actionName)
123  {
124    $this->moduleName             = $moduleName;
125    $this->actionName             = $actionName;
126    $this->context                = $context;
127    $this->dispatcher             = $context->getEventDispatcher();
128    $this->varHolder              = new sfParameterHolder();
129    $this->request                = $context->getRequest();
130    $this->response               = $context->getResponse();
131    $this->requestParameterHolder = $this->request->getParameterHolder();
132  }
133  abstract function execute($request);
134  public function getModuleName()
135  {
136    return $this->moduleName;
137  }
138  public function getActionName()
139  {
140    return $this->actionName;
141  }
142  public final function getContext()
143  {
144    return $this->context;
145  }
146  public final function getLogger()
147  {
148    return $this->context->getLogger();
149  }
150  public function logMessage($message, $priority = 'info')
151  {
152    if (sfConfig::get('sf_logging_enabled'))
153    {
154      $this->dispatcher->notify(new sfEvent($this, 'application.log', array($message, 'priority' => constant('sfLogger::'.strtoupper($priority)))));
155    }
156  }
157  public function debugMessage($message)
158  {
159    if (sfConfig::get('sf_web_debug') && sfConfig::get('sf_logging_enabled'))
160    {
161      $this->dispatcher->notify(new sfEvent(null, 'application.log', array('This feature is deprecated in favor of the log_message helper.', 'priority' => sfLogger::ERR)));
162    }
163  }
164  public function getRequestParameter($name, $default = null)
165  {
166    return $this->requestParameterHolder->get($name, $default);
167  }
168  public function hasRequestParameter($name)
169  {
170    return $this->requestParameterHolder->has($name);
171  }
172  public function getRequest()
173  {
174    return $this->request;
175  }
176  public function getResponse()
177  {
178    return $this->response;
179  }
180  public function getController()
181  {
182    return $this->context->getController();
183  }
184  public function generateUrl($route, $params = array(), $absolute = false)
185  {
186    return $this->context->getRouting()->generate($route, $params, $absolute);
187  }
188  public function getUser()
189  {
190    return $this->context->getUser();
191  }
192  public function setVar($name, $value, $safe = false)
193  {
194    $this->varHolder->set($name, $safe ? new sfOutputEscaperSafe($value) : $value);
195  }
196  public function getVar($name)
197  {
198    return $this->varHolder->get($name);
199  }
200  public function getVarHolder()
201  {
202    return $this->varHolder;
203  }
204  public function __set($key, $value)
205  {
206    return $this->varHolder->setByRef($key, $value);
207  }
208  public function & __get($key)
209  {
210    return $this->varHolder->get($key);
211  }
212  public function __isset($name)
213  {
214    return $this->varHolder->has($name);
215  }
216  public function __unset($name)
217  {
218    $this->varHolder->remove($name);
219  }
220  public function __call($method, $arguments)
221  {
222    $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'component.method_not_found', array('method' => $method, 'arguments' => $arguments)));
223    if (!$event->isProcessed())
224    {
225      throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
226    }
227    return $event->getReturnValue();
228  }
229}
230
231
232abstract class sfAction extends sfComponent
233{
234  protected
235    $security = array();
236  public function initialize($context, $moduleName, $actionName)
237  {
238    parent::initialize($context, $moduleName, $actionName);
239        if ($file = $context->getConfigCache()->checkConfig('modules/'.$this->getModuleName().'/config/security.yml', true))
240    {
241      require($file);
242    }
243  }
244  public function preExecute()
245  {
246  }
247  public function postExecute()
248  {
249  }
250  public function forward404($message = null)
251  {
252    throw new sfError404Exception($this->get404Message($message));
253  }
254  public function forward404Unless($condition, $message = null)
255  {
256    if (!$condition)
257    {
258      throw new sfError404Exception($this->get404Message($message));
259    }
260  }
261  public function forward404If($condition, $message = null)
262  {
263    if ($condition)
264    {
265      throw new sfError404Exception($this->get404Message($message));
266    }
267  }
268  public function redirect404()
269  {
270    return $this->redirect('/'.sfConfig::get('sf_error_404_module').'/'.sfConfig::get('sf_error_404_action'));
271  }
272  public function forward($module, $action)
273  {
274    if (sfConfig::get('sf_logging_enabled'))
275    {
276      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Forward to action "%s/%s"', $module, $action))));
277    }
278    $this->getController()->forward($module, $action);
279    throw new sfStopException();
280  }
281  public function forwardIf($condition, $module, $action)
282  {
283    if ($condition)
284    {
285      $this->forward($module, $action);
286    }
287  }
288  public function forwardUnless($condition, $module, $action)
289  {
290    if (!$condition)
291    {
292      $this->forward($module, $action);
293    }
294  }
295  public function redirect($url, $statusCode = 302)
296  {
297    $this->getController()->redirect($url, 0, $statusCode);
298    throw new sfStopException();
299  }
300  public function redirectIf($condition, $url, $statusCode = 302)
301  {
302    if ($condition)
303    {
304      $this->redirect($url, $statusCode);
305    }
306  }
307  public function redirectUnless($condition, $url, $statusCode = 302)
308  {
309    if (!$condition)
310    {
311      $this->redirect($url, $statusCode);
312    }
313  }
314  public function renderText($text)
315  {
316    $this->getResponse()->setContent($this->getResponse()->getContent().$text);
317    return sfView::NONE;
318  }
319  public function getPartial($templateName, $vars = null)
320  {
321    $this->getContext()->getConfiguration()->loadHelpers('Partial');
322    $vars = !is_null($vars) ? $vars : $this->varHolder->getAll();
323    return get_partial($templateName, $vars);
324  }
325  public function renderPartial($templateName, $vars = null)
326  {
327    return $this->renderText($this->getPartial($templateName, $vars));
328  }
329  public function getComponent($moduleName, $componentName, $vars = null)
330  {
331    $this->getContext()->getConfiguration()->loadHelpers('Partial');
332    $vars = !is_null($vars) ? $vars : $this->varHolder->getAll();
333    return get_component($moduleName, $componentName, $vars);
334  }
335  public function renderComponent($moduleName, $componentName, $vars = null)
336  {
337    return $this->renderText($this->getComponent($moduleName, $componentName, $vars));
338  }
339  public function getDefaultView()
340  {
341    if (!sfConfig::get('sf_compat_10'))
342    {
343      throw new sfConfigurationException('You must set "compat_10" to true if you want to use this method which is deprecated.');
344    }
345    return sfView::INPUT;
346  }
347  public function handleError()
348  {
349    if (!sfConfig::get('sf_compat_10'))
350    {
351      throw new sfConfigurationException('You must set "compat_10" to true if you want to use this method which is deprecated.');
352    }
353    return sfView::ERROR;
354  }
355  public function validate()
356  {
357    if (!sfConfig::get('sf_compat_10'))
358    {
359      throw new sfConfigurationException('You must set "compat_10" to true if you want to use this method which is deprecated.');
360    }
361    return true;
362  }
363  public function getSecurityConfiguration()
364  {
365    return $this->security;
366  }
367  public function setSecurityConfiguration($security)
368  {
369    $this->security = $security;
370  }
371  public function isSecure()
372  {
373    $actionName = strtolower($this->getActionName());
374    if (isset($this->security[$actionName]['is_secure']))
375    {
376      return $this->security[$actionName]['is_secure'];
377    }
378    if (isset($this->security['all']['is_secure']))
379    {
380      return $this->security['all']['is_secure'];
381    }
382    return false;
383  }
384  public function getCredential()
385  {
386    $actionName = strtolower($this->getActionName());
387    if (isset($this->security[$actionName]['credentials']))
388    {
389      $credentials = $this->security[$actionName]['credentials'];
390    }
391    else if (isset($this->security['all']['credentials']))
392    {
393      $credentials = $this->security['all']['credentials'];
394    }
395    else
396    {
397      $credentials = null;
398    }
399    return $credentials;
400  }
401  public function setTemplate($name, $module = null)
402  {
403    if (sfConfig::get('sf_logging_enabled'))
404    {
405      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Change template to "%s/%s"', is_null($module) ? 'CURRENT' : $module, $name))));
406    }
407    if (!is_null($module))
408    {
409      $name = sfConfig::get('sf_app_dir').'/modules/'.$module.'/templates/'.$name;
410    }
411    sfConfig::set('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_template', $name);
412  }
413  public function getTemplate()
414  {
415    return sfConfig::get('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_template');
416  }
417  public function setLayout($name)
418  {
419    if (sfConfig::get('sf_logging_enabled'))
420    {
421      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Change layout to "%s"', $name))));
422    }
423    sfConfig::set('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_layout', $name);
424  }
425  public function getLayout()
426  {
427    return sfConfig::get('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_layout');
428  }
429  public function setViewClass($class)
430  {
431    sfConfig::set('mod_'.strtolower($this->getModuleName()).'_view_class', $class);
432  }
433  public function getRoute()
434  {
435    return $this->getRequest()->getAttribute('sf_route');
436  }
437  protected function get404Message($message = null)
438  {
439    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;
440  }
441}
442
443
444abstract class sfActions extends sfAction
445{
446  public function execute($request)
447  {
448        $actionToRun = 'execute'.ucfirst($this->getActionName());
449    if (!is_callable(array($this, $actionToRun)))
450    {
451            throw new sfInitializationException(sprintf('sfAction initialization failed for module "%s", action "%s". You must create a "%s" method.', $this->getModuleName(), $this->getActionName(), $actionToRun));
452    }
453    if (sfConfig::get('sf_logging_enabled'))
454    {
455      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Call "%s->%s()"', get_class($this), $actionToRun))));
456    }
457        return $this->$actionToRun($request);
458  }
459}
460
461
462class sfActionStack
463{
464  protected
465    $stack = array();
466  public function addEntry($moduleName, $actionName, $actionInstance)
467  {
468        $actionEntry = new sfActionStackEntry($moduleName, $actionName, $actionInstance);
469    $this->stack[] = $actionEntry;
470    return $actionEntry;
471  }
472  public function getEntry($index)
473  {
474    $retval = null;
475    if ($index > -1 && $index < count($this->stack))
476    {
477      $retval = $this->stack[$index];
478    }
479    return $retval;
480  }
481  public function popEntry()
482  {
483    return array_pop($this->stack);
484  }
485  public function getFirstEntry()
486  {
487    $retval = null;
488    if (isset($this->stack[0]))
489    {
490      $retval = $this->stack[0];
491    }
492    return $retval;
493  }
494  public function getLastEntry()
495  {
496    $count  = count($this->stack);
497    $retval = null;
498    if (isset($this->stack[0]))
499    {
500      $retval = $this->stack[$count - 1];
501    }
502    return $retval;
503  }
504  public function getSize()
505  {
506    return count($this->stack);
507  }
508}
509
510
511class sfActionStackEntry
512{
513  protected
514    $actionInstance = null,
515    $actionName     = null,
516    $moduleName     = null,
517    $presentation   = null;
518  public function __construct($moduleName, $actionName, $actionInstance)
519  {
520    $this->actionName     = $actionName;
521    $this->actionInstance = $actionInstance;
522    $this->moduleName     = $moduleName;
523  }
524  public function getActionName()
525  {
526    return $this->actionName;
527  }
528  public function getActionInstance()
529  {
530    return $this->actionInstance;
531  }
532  public function getModuleName()
533  {
534    return $this->moduleName;
535  }
536  public function & getPresentation()
537  {
538    return $this->presentation;
539  }
540  public function setPresentation(&$presentation)
541  {
542    $this->presentation =& $presentation;
543  }
544}
545
546
547class sfLoader
548{
549  static public function getHelperDirs($moduleName = '')
550  {
551    $configuration = sfProjectConfiguration::getActive();
552    $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)));
553    return $configuration->getHelperDirs($moduleName);
554  }
555  static public function loadHelpers($helpers, $moduleName = '')
556  {
557    $configuration = sfProjectConfiguration::getActive();
558    $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)));
559    return $configuration->loadHelpers($helpers, $moduleName);
560  }
561}
562
563
564abstract class sfController
565{
566  protected
567    $context           = null,
568    $dispatcher        = null,
569    $controllerClasses = array(),
570    $maxForwards       = 5,
571    $renderMode        = sfView::RENDER_CLIENT;
572  public function __construct($context)
573  {
574    $this->initialize($context);
575  }
576  public function initialize($context)
577  {
578    $this->context    = $context;
579    $this->dispatcher = $context->getEventDispatcher();
580        $this->maxForwards = sfConfig::get('sf_max_forwards');
581  }
582  public function componentExists($moduleName, $componentName)
583  {
584    return $this->controllerExists($moduleName, $componentName, 'component', false);
585  }
586  public function actionExists($moduleName, $actionName)
587  {
588    return $this->controllerExists($moduleName, $actionName, 'action', false);
589  }
590  protected function controllerExists($moduleName, $controllerName, $extension, $throwExceptions)
591  {
592    $dirs = $this->context->getConfiguration()->getControllerDirs($moduleName);
593    foreach ($dirs as $dir => $checkEnabled)
594    {
595            if ($checkEnabled && !in_array($moduleName, sfConfig::get('sf_enabled_modules')) && is_readable($dir))
596      {
597        throw new sfConfigurationException(sprintf('The module "%s" is not enabled.', $moduleName));
598      }
599            $classFile   = strtolower($extension);
600      $classSuffix = ucfirst(strtolower($extension));
601      $file        = $dir.'/'.$controllerName.$classSuffix.'.class.php';
602      if (is_readable($file))
603      {
604                require_once($file);
605        $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix] = $controllerName.$classSuffix;
606        return true;
607      }
608      $module_file = $dir.'/'.$classFile.'s.class.php';
609      if (is_readable($module_file))
610      {
611                require_once($module_file);
612        if (!class_exists($moduleName.$classSuffix.'s', false))
613        {
614          if ($throwExceptions)
615          {
616            throw new sfControllerException(sprintf('There is no "%s" class in your action file "%s".', $moduleName.$classSuffix.'s', $module_file));
617          }
618          return false;
619        }
620                if (!in_array('execute'.ucfirst($controllerName), get_class_methods($moduleName.$classSuffix.'s')))
621        {
622          if ($throwExceptions)
623          {
624            throw new sfControllerException(sprintf('There is no "%s" method in your action class "%s".', 'execute'.ucfirst($controllerName), $moduleName.$classSuffix.'s'));
625          }
626          return false;
627        }
628        $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix] = $moduleName.$classSuffix.'s';
629        return true;
630      }
631    }
632        if ($throwExceptions && sfConfig::get('sf_debug'))
633    {
634      $dirs = array_keys($dirs);
635            foreach ($dirs as &$dir)
636      {
637        $dir = str_replace(sfConfig::get('sf_root_dir'), '%SF_ROOT_DIR%', $dir);
638      }
639      throw new sfControllerException(sprintf('Controller "%s/%s" does not exist in: %s.', $moduleName, $controllerName, implode(', ', $dirs)));
640    }
641    return false;
642  }
643  public function forward($moduleName, $actionName)
644  {
645        $moduleName = preg_replace('/[^a-z0-9_]+/i', '', $moduleName);
646    $actionName = preg_replace('/[^a-z0-9_]+/i', '', $actionName);
647    if ($this->getActionStack()->getSize() >= $this->maxForwards)
648    {
649            throw new sfForwardException(sprintf('Too many forwards have been detected for this request (> %d).', $this->maxForwards));
650    }
651        $this->context->getConfigCache()->import('modules/'.$moduleName.'/config/generator.yml', false, true);
652    if (!$this->actionExists($moduleName, $actionName))
653    {
654            if (sfConfig::get('sf_logging_enabled'))
655      {
656        $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Action "%s/%s" does not exist', $moduleName, $actionName))));
657      }
658      throw new sfError404Exception(sprintf('Action "%s/%s" does not exist.', $moduleName, $actionName));
659    }
660        $actionInstance = $this->getAction($moduleName, $actionName);
661        $this->getActionStack()->addEntry($moduleName, $actionName, $actionInstance);
662        require($this->context->getConfigCache()->checkConfig('modules/'.$moduleName.'/config/module.yml'));
663        if ($this->getActionStack()->getSize() == 1 && sfConfig::get('mod_'.strtolower($moduleName).'_is_internal') && !sfConfig::get('sf_test'))
664    {
665      throw new sfConfigurationException(sprintf('Action "%s" from module "%s" cannot be called directly.', $actionName, $moduleName));
666    }
667        if (sfConfig::get('mod_'.strtolower($moduleName).'_enabled'))
668    {
669            $moduleConfig = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/config/config.php';
670      if (is_readable($moduleConfig))
671      {
672        require_once($moduleConfig);
673      }
674            $filterChain = new sfFilterChain();
675      $filterChain->loadConfiguration($actionInstance);
676      $this->context->getEventDispatcher()->notify(new sfEvent($this, 'controller.change_action', array('module' => $moduleName, 'action' => $actionName)));
677      if ($moduleName == sfConfig::get('sf_error_404_module') && $actionName == sfConfig::get('sf_error_404_action'))
678      {
679        $this->context->getResponse()->setStatusCode(404);
680        $this->context->getResponse()->setHttpHeader('Status', '404 Not Found');
681        $this->dispatcher->notify(new sfEvent($this, 'controller.page_not_found', array('module' => $moduleName, 'action' => $actionName)));
682      }
683            $filterChain->execute();
684    }
685    else
686    {
687      $moduleName = sfConfig::get('sf_module_disabled_module');
688      $actionName = sfConfig::get('sf_module_disabled_action');
689      if (!$this->actionExists($moduleName, $actionName))
690      {
691                throw new sfConfigurationException(sprintf('Invalid configuration settings: [sf_module_disabled_module] "%s", [sf_module_disabled_action] "%s".', $moduleName, $actionName));
692      }
693      $this->forward($moduleName, $actionName);
694    }
695  }
696  public function getAction($moduleName, $actionName)
697  {
698    return $this->getController($moduleName, $actionName, 'action');
699  }
700  public function getComponent($moduleName, $componentName)
701  {
702    return $this->getController($moduleName, $componentName, 'component');
703  }
704  protected function getController($moduleName, $controllerName, $extension)
705  {
706    $classSuffix = ucfirst(strtolower($extension));
707    if (!isset($this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix]))
708    {
709      $this->controllerExists($moduleName, $controllerName, $extension, true);
710    }
711    $class = $this->controllerClasses[$moduleName.'_'.$controllerName.'_'.$classSuffix];
712        $moduleClass = $moduleName.'_'.$class;
713    if (class_exists($moduleClass, false))
714    {
715      $class = $moduleClass;
716    }
717    return new $class($this->context, $moduleName, $controllerName);
718  }
719  public function getActionStack()
720  {
721    return $this->context->getActionStack();
722  }
723  public function getRenderMode()
724  {
725    return $this->renderMode;
726  }
727  public function getView($moduleName, $actionName, $viewName)
728  {
729        $file = sfConfig::get('sf_app_module_dir').'/'.$moduleName.'/view/'.$actionName.$viewName.'View.class.php';
730    if (is_readable($file))
731    {
732      require_once($file);
733      $class = $actionName.$viewName.'View';
734            $moduleClass = $moduleName.'_'.$class;
735      if (class_exists($moduleClass, false))
736      {
737        $class = $moduleClass;
738      }
739    }
740    else
741    {
742            $class = sfConfig::get('mod_'.strtolower($moduleName).'_view_class', 'sfPHP').'View';
743    }
744    return new $class($this->context, $moduleName, $actionName, $viewName);
745  }
746  public function sendEmail($module, $action)
747  {
748    if (sfConfig::get('sf_logging_enabled'))
749    {
750      $this->dispatcher->notify(new sfEvent($this, 'application.log', array('sendEmail method is deprecated', 'priority' => sfLogger::ERR)));
751    }
752    return $this->getPresentationFor($module, $action, 'sfMail');
753  }
754  public function getPresentationFor($module, $action, $viewName = null)
755  {
756    if (sfConfig::get('sf_logging_enabled'))
757    {
758      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Get presentation for action "%s/%s" (view class: "%s")', $module, $action, $viewName))));
759    }
760        $renderMode = $this->getRenderMode();
761        $this->setRenderMode(sfView::RENDER_VAR);
762        $actionStack = $this->getActionStack();
763        $index = $actionStack->getSize();
764        if ($viewName)
765    {
766      $currentViewName = sfConfig::get('mod_'.strtolower($module).'_view_class');
767      sfConfig::set('mod_'.strtolower($module).'_view_class', $viewName);
768    }
769    try
770    {
771            $this->forward($module, $action);
772    }
773    catch (Exception $e)
774    {
775            $this->setRenderMode($renderMode);
776            if ($viewName)
777      {
778        sfConfig::set('mod_'.strtolower($module).'_view_class', $currentViewName);
779      }
780      throw $e;
781    }
782        $actionEntry = $actionStack->getEntry($index);
783        $presentation =& $actionEntry->getPresentation();
784        $this->setRenderMode($renderMode);
785        $nb = $actionStack->getSize() - $index;
786    while ($nb-- > 0)
787    {
788      $actionEntry = $actionStack->popEntry();
789      if ($actionEntry->getModuleName() == sfConfig::get('sf_login_module') && $actionEntry->getActionName() == sfConfig::get('sf_login_action'))
790      {
791        throw new sfException('Your action is secured, but the user is not authenticated.');
792      }
793      else if ($actionEntry->getModuleName() == sfConfig::get('sf_secure_module') && $actionEntry->getActionName() == sfConfig::get('sf_secure_action'))
794      {
795        throw new sfException('Your action is secured, but the user does not have access.');
796      }
797    }
798        if ($viewName)
799    {
800      sfConfig::set('mod_'.strtolower($module).'_view_class', $currentViewName);
801    }
802    return $presentation;
803  }
804  public function setRenderMode($mode)
805  {
806    if ($mode == sfView::RENDER_CLIENT || $mode == sfView::RENDER_VAR || $mode == sfView::RENDER_NONE)
807    {
808      $this->renderMode = $mode;
809      return;
810    }
811        throw new sfRenderException(sprintf('Invalid rendering mode: %s.', $mode));
812  }
813  public function inCLI()
814  {
815    return 0 == strncasecmp(PHP_SAPI, 'cli', 3);
816  }
817  public function __call($method, $arguments)
818  {
819    $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'controller.method_not_found', array('method' => $method, 'arguments' => $arguments)));
820    if (!$event->isProcessed())
821    {
822      throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
823    }
824    return $event->getReturnValue();
825  }
826}
827
828
829class sfDatabaseManager
830{
831  protected
832    $configuration = null,
833    $databases     = array();
834  public function __construct(sfProjectConfiguration $configuration, $options = array())
835  {
836    $this->initialize($configuration);
837    if (!isset($options['auto_shutdown']) || $options['auto_shutdown'])
838    {
839      register_shutdown_function(array($this, 'shutdown'));
840    }
841  }
842  public function initialize(sfProjectConfiguration $configuration)
843  {
844    $this->configuration = $configuration;
845    $this->loadConfiguration();
846  }
847  public function loadConfiguration()
848  {
849    if ($this->configuration instanceof sfApplicationConfiguration)
850    {
851      $databases = include($this->configuration->getConfigCache()->checkConfig('config/databases.yml'));
852    }
853    else
854    {
855      $configHandler = new sfDatabaseConfigHandler();
856      $databases = $configHandler->evaluate(array($this->configuration->getRootDir().'/config/databases.yml'));
857    }
858    foreach ($databases as $name => $database)
859    {
860      $this->setDatabase($name, $database);
861    }
862  }
863  public function setDatabase($name, sfDatabase $database)
864  {
865    $this->databases[$name] = $database;
866  }
867  public function getDatabase($name = 'default')
868  {
869    if (isset($this->databases[$name]))
870    {
871      return $this->databases[$name];
872    }
873        throw new sfDatabaseException(sprintf('Database "%s" does not exist.', $name));
874  }
875  public function getNames()
876  {
877    return array_keys($this->databases);
878  }
879  public function shutdown()
880  {
881        foreach ($this->databases as $database)
882    {
883      $database->shutdown();
884    }
885  }
886}
887
888
889class sfEvent implements ArrayAccess
890{
891  protected
892    $value      = null,
893    $processed  = false,
894    $subject    = null,
895    $name       = '',
896    $parameters = null;
897  public function __construct($subject, $name, $parameters = array())
898  {
899    $this->subject = $subject;
900    $this->name = $name;
901    $this->parameters = $parameters;
902  }
903  public function getSubject()
904  {
905    return $this->subject;
906  }
907  public function getName()
908  {
909    return $this->name;
910  }
911  public function setReturnValue($value)
912  {
913    $this->value = $value;
914  }
915  public function getReturnValue()
916  {
917    return $this->value;
918  }
919  public function setProcessed($processed)
920  {
921    $this->processed = (boolean) $processed;
922  }
923  public function isProcessed()
924  {
925    return $this->processed;
926  }
927  public function getParameters()
928  {
929    return $this->parameters;
930  }
931  public function offsetExists($name)
932  {
933    return array_key_exists($name, $this->parameters);
934  }
935  public function offsetGet($name)
936  {
937    if (!array_key_exists($name, $this->parameters))
938    {
939      throw new InvalidArgumentException(sprintf('The event "%s" has no "%s" parameter.', $this->name, $name));
940    }
941    return $this->parameters[$name];
942  }
943  public function offsetSet($name, $value)
944  {
945    $this->parameters[$name] = $value;
946  }
947  public function offsetUnset($name)
948  {
949    unset($this->parameters[$name]);
950  }
951}
952
953
954abstract class sfFilter
955{
956  protected
957    $parameterHolder = null,
958    $context         = null;
959  public static
960    $filterCalled    = array();
961  public function __construct($context, $parameters = array())
962  {
963    $this->initialize($context, $parameters);
964  }
965  public function initialize($context, $parameters = array())
966  {
967    $this->context = $context;
968    $this->parameterHolder = new sfParameterHolder();
969    $this->parameterHolder->add($parameters);
970    return true;
971  }
972  protected function isFirstCall()
973  {
974    $class = get_class($this);
975    if (isset(self::$filterCalled[$class]))
976    {
977      return false;
978    }
979    else
980    {
981      self::$filterCalled[$class] = true;
982      return true;
983    }
984  }
985  public final function getContext()
986  {
987    return $this->context;
988  }
989  public function getParameterHolder()
990  {
991    return $this->parameterHolder;
992  }
993  public function getParameter($name, $default = null)
994  {
995    return $this->parameterHolder->get($name, $default);
996  }
997  public function hasParameter($name)
998  {
999    return $this->parameterHolder->has($name);
1000  }
1001  public function setParameter($name, $value)
1002  {
1003    return $this->parameterHolder->set($name, $value);
1004  }
1005}
1006
1007
1008class sfCommonFilter extends sfFilter
1009{
1010  public function execute($filterChain)
1011  {
1012        $filterChain->execute();
1013        $response = $this->context->getResponse();
1014        $content = $response->getContent();
1015    if (false !== ($pos = strpos($content, '</head>')))
1016    {
1017      $this->context->getConfiguration()->loadHelpers(array('Tag', 'Asset'));
1018      $html = '';
1019      if (!sfConfig::get('symfony.asset.javascripts_included', false))
1020      {
1021        $html .= get_javascripts($response);
1022      }
1023      if (!sfConfig::get('symfony.asset.stylesheets_included', false))
1024      {
1025        $html .= get_stylesheets($response);
1026      }
1027      if ($html)
1028      {
1029        $response->setContent(substr($content, 0, $pos).$html.substr($content, $pos));
1030      }
1031    }
1032    sfConfig::set('symfony.asset.javascripts_included', false);
1033    sfConfig::set('symfony.asset.stylesheets_included', false);
1034  }
1035}
1036
1037
1038class sfExecutionFilter extends sfFilter
1039{
1040  public function execute($filterChain)
1041  {
1042        $actionInstance = $this->context->getController()->getActionStack()->getLastEntry()->getActionInstance();
1043        if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
1044    {
1045      $timer = sfTimerManager::getTimer(sprintf('Action "%s/%s"', $actionInstance->getModuleName(), $actionInstance->getActionName()));
1046      $viewName = $this->handleAction($filterChain, $actionInstance);
1047      $timer->addTime();
1048      $timer = sfTimerManager::getTimer(sprintf('View "%s" for "%s/%s"', $viewName, $actionInstance->getModuleName(), $actionInstance->getActionName()));
1049      $this->handleView($filterChain, $actionInstance, $viewName);
1050      $timer->addTime();
1051    }
1052    else
1053    {
1054      $viewName = $this->handleAction($filterChain, $actionInstance);
1055      $this->handleView($filterChain, $actionInstance, $viewName);
1056    }
1057  }
1058  protected function handleAction($filterChain, $actionInstance)
1059  {
1060    $uri = $this->context->getRouting()->getCurrentInternalUri();
1061    if (sfConfig::get('sf_cache') && !is_null($uri) && $this->context->getViewCacheManager()->hasActionCache($uri))
1062    {
1063            return sfView::SUCCESS;
1064    }
1065    return $this->executeAction($actionInstance);
1066  }
1067  protected function executeAction($actionInstance)
1068  {
1069        $actionInstance->preExecute();
1070    $viewName = $actionInstance->execute($this->context->getRequest());
1071    $actionInstance->postExecute();
1072    return is_null($viewName) ? sfView::SUCCESS : $viewName;
1073  }
1074  protected function handleView($filterChain, $actionInstance, $viewName)
1075  {
1076    switch ($viewName)
1077    {
1078      case sfView::HEADER_ONLY:
1079        $this->context->getResponse()->setHeaderOnly(true);
1080        return;
1081      case sfView::NONE:
1082        return;
1083    }
1084    $this->executeView($actionInstance->getModuleName(), $actionInstance->getActionName(), $viewName, $actionInstance->getVarHolder()->getAll());
1085  }
1086  protected function executeView($moduleName, $actionName, $viewName, $viewAttributes)
1087  {
1088    $controller = $this->context->getController();
1089        $view = $controller->getView($moduleName, $actionName, $viewName);
1090        $view->execute();
1091        $view->getAttributeHolder()->add($viewAttributes);
1092        switch ($controller->getRenderMode())
1093    {
1094      case sfView::RENDER_NONE:
1095        break;
1096      case sfView::RENDER_CLIENT:
1097        $viewData = $view->render();
1098        $this->context->getResponse()->setContent($viewData);
1099        break;
1100      case sfView::RENDER_VAR:
1101        $viewData = $view->render();
1102        $controller->getActionStack()->getLastEntry()->setPresentation($viewData);
1103        break;
1104    }
1105  }
1106}
1107
1108
1109class sfRenderingFilter extends sfFilter
1110{
1111  public function execute($filterChain)
1112  {
1113        $filterChain->execute();
1114        $response = $this->context->getResponse();
1115        if (sfForm::hasToStringException())
1116    {
1117      throw sfForm::getToStringException();
1118    }
1119    else if (sfFormField::hasToStringException())
1120    {
1121      throw sfFormField::getToStringException();
1122    }
1123        $response->send();
1124  }
1125}
1126
1127
1128class sfFilterChain
1129{
1130  protected
1131    $chain = array(),
1132    $index = -1;
1133  public function loadConfiguration($actionInstance)
1134  {
1135    require(sfContext::getInstance()->getConfigCache()->checkConfig('modules/'.$actionInstance->getModuleName().'/config/filters.yml'));
1136  }
1137  public function execute()
1138  {
1139        ++$this->index;
1140    if ($this->index < count($this->chain))
1141    {
1142      if (sfConfig::get('sf_logging_enabled'))
1143      {
1144        sfContext::getInstance()->getEventDispatcher()->notify(new sfEvent($this, 'application.log', array(sprintf('Executing filter "%s"', get_class($this->chain[$this->index])))));
1145      }
1146            $this->chain[$this->index]->execute($this);
1147    }
1148  }
1149  public function hasFilter($class)
1150  {
1151    foreach ($this->chain as $filter)
1152    {
1153      if ($filter instanceof $class)
1154      {
1155        return true;
1156      }
1157    }
1158    return false;
1159  }
1160  public function register($filter)
1161  {
1162    $this->chain[] = $filter;
1163  }
1164}
1165
1166
1167abstract class sfLogger
1168{
1169  const EMERG   = 0;   const ALERT   = 1;   const CRIT    = 2;   const ERR     = 3;   const WARNING = 4;   const NOTICE  = 5;   const INFO    = 6;   const DEBUG   = 7;
1170  protected
1171    $level = self::INFO;
1172  public function __construct(sfEventDispatcher $dispatcher, $options = array())
1173  {
1174    $this->initialize($dispatcher, $options);
1175    if (!isset($options['auto_shutdown']) || $options['auto_shutdown'])
1176    {
1177      register_shutdown_function(array($this, 'shutdown'));
1178    }
1179  }
1180  public function initialize(sfEventDispatcher $dispatcher, $options = array())
1181  {
1182    if (isset($options['level']))
1183    {
1184      $this->setLogLevel($options['level']);
1185    }
1186    $dispatcher->connect('application.log', array($this, 'listenToLogEvent'));
1187  }
1188  public function getLogLevel()
1189  {
1190    return $this->level;
1191  }
1192  public function setLogLevel($level)
1193  {
1194    if (!is_int($level))
1195    {
1196      $level = constant('sfLogger::'.strtoupper($level));
1197    }
1198    $this->level = $level;
1199  }
1200  public function log($message, $priority = self::INFO)
1201  {
1202    if ($this->getLogLevel() < $priority)
1203    {
1204      return false;
1205    }
1206    return $this->doLog($message, $priority);
1207  }
1208  abstract protected function doLog($message, $priority);
1209  public function emerg($message)
1210  {
1211    $this->log($message, self::EMERG);
1212  }
1213  public function alert($message)
1214  {
1215    $this->log($message, self::ALERT);
1216  }
1217  public function crit($message)
1218  {
1219    $this->log($message, self::CRIT);
1220  }
1221  public function err($message)
1222  {
1223    $this->log($message, self::ERR);
1224  }
1225  public function warning($message)
1226  {
1227    $this->log($message, self::WARNING);
1228  }
1229  public function notice($message)
1230  {
1231    $this->log($message, self::NOTICE);
1232  }
1233  public function info($message)
1234  {
1235    $this->log($message, self::INFO);
1236  }
1237  public function debug($message)
1238  {
1239    $this->log($message, self::DEBUG);
1240  }
1241  public function listenToLogEvent(sfEvent $event)
1242  {
1243    $priority = isset($event['priority']) ? $event['priority'] : self::INFO;
1244    $subject  = $event->getSubject();
1245    $subject  = is_object($subject) ? get_class($subject) : (is_string($subject) ? $subject : 'main');
1246    foreach ($event->getParameters() as $key => $message)
1247    {
1248      if ('priority' === $key)
1249      {
1250        continue;
1251      }
1252      $this->log(sprintf('{%s} %s', $subject, $message), $priority);
1253    }
1254  }
1255  public function shutdown()
1256  {
1257  }
1258  static public function getPriorityName($priority)
1259  {
1260    static $levels  = array(
1261      self::EMERG   => 'emerg',
1262      self::ALERT   => 'alert',
1263      self::CRIT    => 'crit',
1264      self::ERR     => 'err',
1265      self::WARNING => 'warning',
1266      self::NOTICE  => 'notice',
1267      self::INFO    => 'info',
1268      self::DEBUG   => 'debug',
1269    );
1270    if (!isset($levels[$priority]))
1271    {
1272      throw new sfException(sprintf('The priority level "%s" does not exist.', $priority));
1273    }
1274    return $levels[$priority];
1275  }
1276}
1277
1278
1279class sfNoLogger extends sfLogger
1280{
1281  public function initialize(sfEventDispatcher $dispatcher, $options = array())
1282  {
1283  }
1284  protected function doLog($message, $priority)
1285  {
1286  }
1287}
1288
1289
1290abstract class sfRequest
1291{
1292  const GET    = 'GET';
1293  const POST   = 'POST';
1294  const PUT    = 'PUT';
1295  const DELETE = 'DELETE';
1296  const HEAD   = 'HEAD';
1297  protected
1298    $dispatcher      = null,
1299    $method          = null,
1300    $options         = array(),
1301    $parameterHolder = null,
1302    $attributeHolder = null;
1303  public function __construct(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array())
1304  {
1305    $this->initialize($dispatcher, $parameters, $attributes, $options);
1306  }
1307  public function initialize(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array())
1308  {
1309    $this->dispatcher = $dispatcher;
1310    $this->options = $options;
1311    if (!isset($this->options['logging']))
1312    {
1313      $this->options['logging'] = false;
1314    }
1315        $this->parameterHolder = new sfParameterHolder();
1316    $this->attributeHolder = new sfParameterHolder();
1317    $this->parameterHolder->add($parameters);
1318    $this->attributeHolder->add($attributes);
1319  }
1320  public function extractParameters($names)
1321  {
1322    $array = array();
1323    $parameters = $this->parameterHolder->getAll();
1324    foreach ($parameters as $key => $value)
1325    {
1326      if (in_array($key, $names))
1327      {
1328        $array[$key] = $value;
1329      }
1330    }
1331    return $array;
1332  }
1333  public function getMethod()
1334  {
1335    return $this->method;
1336  }
1337  public function setMethod($method)
1338  {
1339    if (!in_array(strtoupper($method), array(self::GET, self::POST, self::PUT, self::DELETE, self::HEAD)))
1340    {
1341      throw new sfException(sprintf('Invalid request method: %s.', $method));
1342    }
1343    $this->method = strtoupper($method);
1344  }
1345  public function getParameterHolder()
1346  {
1347    return $this->parameterHolder;
1348  }
1349  public function getAttributeHolder()
1350  {
1351    return $this->attributeHolder;
1352  }
1353  public function getAttribute($name, $default = null)
1354  {
1355    return $this->attributeHolder->get($name, $default);
1356  }
1357  public function hasAttribute($name)
1358  {
1359    return $this->attributeHolder->has($name);
1360  }
1361  public function setAttribute($name, $value)
1362  {
1363    $this->attributeHolder->set($name, $value);
1364  }
1365  public function getParameter($name, $default = null)
1366  {
1367    return $this->parameterHolder->get($name, $default);
1368  }
1369  public function hasParameter($name)
1370  {
1371    return $this->parameterHolder->has($name);
1372  }
1373  public function setParameter($name, $value)
1374  {
1375    $this->parameterHolder->set($name, $value);
1376  }
1377  public function __call($method, $arguments)
1378  {
1379    $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'request.method_not_found', array('method' => $method, 'arguments' => $arguments)));
1380    if (!$event->isProcessed())
1381    {
1382      throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
1383    }
1384    return $event->getReturnValue();
1385  }
1386  public function __clone()
1387  {
1388    $this->parameterHolder = clone $this->parameterHolder;
1389    $this->attributeHolder = clone $this->attributeHolder;
1390  }
1391}
1392
1393
1394abstract class sfResponse implements Serializable
1395{
1396  protected
1397    $options    = array(),
1398    $dispatcher = null,
1399    $content    = '';
1400  public function __construct(sfEventDispatcher $dispatcher, $options = array())
1401  {
1402    $this->initialize($dispatcher, $options);
1403  }
1404  public function initialize(sfEventDispatcher $dispatcher, $options = array())
1405  {
1406    $this->dispatcher = $dispatcher;
1407    $this->options = $options;
1408    if (!isset($this->options['logging']))
1409    {
1410      $this->options['logging'] = false;
1411    }
1412  }
1413  public function setEventDispatcher(sfEventDispatcher $dispatcher)
1414  {
1415    $this->dispatcher = $dispatcher;
1416  }
1417  public function setContent($content)
1418  {
1419    $this->content = $content;
1420  }
1421  public function getContent()
1422  {
1423    return $this->content;
1424  }
1425  public function sendContent()
1426  {
1427    $event = $this->dispatcher->filter(new sfEvent($this, 'response.filter_content'), $this->getContent());
1428    $content = $event->getReturnValue();
1429    if ($this->options['logging'])
1430    {
1431      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Send content (%s o)', strlen($content)))));
1432    }
1433    echo $content;
1434  }
1435  public function send()
1436  {
1437    $this->sendContent();
1438  }
1439  public function getOptions()
1440  {
1441    return $this->options;
1442  }
1443  public function __call($method, $arguments)
1444  {
1445    $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'response.method_not_found', array('method' => $method, 'arguments' => $arguments)));
1446    if (!$event->isProcessed())
1447    {
1448      throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
1449    }
1450    return $event->getReturnValue();
1451  }
1452  public function serialize()
1453  {
1454    return serialize($this->content);
1455  }
1456  public function unserialize($serialized)
1457  {
1458    $this->content = unserialize($serialized);
1459  }
1460}
1461
1462
1463abstract class sfRouting
1464{
1465  protected
1466    $dispatcher        = null,
1467    $cache             = null,
1468    $defaultParameters = array(),
1469    $options           = array();
1470  public function __construct(sfEventDispatcher $dispatcher, sfCache $cache = null, $options = array())
1471  {
1472    $this->initialize($dispatcher, $cache, $options);
1473    if (!isset($this->options['auto_shutdown']) || $this->options['auto_shutdown'])
1474    {
1475      register_shutdown_function(array($this, 'shutdown'));
1476    }
1477  }
1478  public function getCache()
1479  {
1480    return $this->cache;
1481  }
1482  public function initialize(sfEventDispatcher $dispatcher, sfCache $cache = null, $options = array())
1483  {
1484    $this->dispatcher = $dispatcher;
1485    $options['debug'] = isset($options['debug']) ? (boolean) $options['debug'] : false;
1486        $this->cache = $options['debug'] ? null : $cache;
1487    $this->setDefaultParameter('module', isset($options['default_module']) ? $options['default_module'] : 'default');
1488    $this->setDefaultParameter('action', isset($options['default_action']) ? $options['default_action'] : 'index');
1489    if (!isset($options['logging']))
1490    {
1491      $options['logging'] = false;
1492    }
1493    if (!isset($options['context']))
1494    {
1495      $options['context'] = array();
1496    }
1497    $this->options = $options;
1498    $this->dispatcher->connect('user.change_culture', array($this, 'listenToChangeCultureEvent'));
1499    $this->dispatcher->connect('request.filter_parameters', array($this, 'filterParametersEvent'));
1500    $this->loadConfiguration();
1501  }
1502  public function getOptions()
1503  {
1504    return $this->options;
1505  }
1506  public function loadConfiguration()
1507  {
1508    $this->dispatcher->notify(new sfEvent($this, 'routing.load_configuration'));
1509  }
1510  abstract public function getCurrentInternalUri($with_route_name = false);
1511  abstract public function getRoutes();
1512  abstract public function setRoutes($routes);
1513  abstract public function hasRoutes();
1514  abstract public function clearRoutes();
1515  abstract public function generate($name, $params = array(), $absolute = false);
1516  abstract public function parse($url);
1517  public function getDefaultParameters()
1518  {
1519    return $this->defaultParameters;
1520  }
1521  public function getDefaultParameter($key)
1522  {
1523    return isset($this->defaultParameters[$key]) ? $this->defaultParameters[$key] : null;
1524  }
1525  public function setDefaultParameter($key, $value)
1526  {
1527    $this->defaultParameters[$key] = $value;
1528  }
1529  public function setDefaultParameters($parameters)
1530  {
1531    $this->defaultParameters = $parameters;
1532  }
1533  protected function mergeArrays($arr1, $arr2)
1534  {
1535    foreach ($arr2 as $key => $value)
1536    {
1537      $arr1[$key] = $value;
1538    }
1539    return $arr1;
1540  }
1541  public function listenToChangeCultureEvent(sfEvent $event)
1542  {
1543        $this->setDefaultParameter('sf_culture', $event['culture']);
1544  }
1545  public function filterParametersEvent(sfEvent $event, $parameters)
1546  {
1547    $context = $event->getParameters();
1548    $this->options['context'] = $context;
1549    if (false === $params = $this->parse($event['path_info']))
1550    {
1551      return $parameters;
1552    }
1553    return array_merge($parameters, $params);
1554  }
1555  protected function fixGeneratedUrl($url, $absolute = false)
1556  {
1557    if (isset($this->options['context']['prefix']))
1558    {
1559      if (0 === strpos($url, 'http'))
1560      {
1561        $url = preg_replace('#https?\://[^/]+#', '$0'.$this->options['context']['prefix'], $url);
1562      }
1563      else
1564      {
1565        $url = $this->options['context']['prefix'].$url;
1566      }
1567    }
1568    if ($absolute && isset($this->options['context']['host']) && 0 !== strpos($url, 'http'))
1569    {
1570      $url = 'http'.(isset($this->options['context']['is_secure']) && $this->options['context']['is_secure'] ? 's' : '').'://'.$this->options['context']['host'].$url;
1571    }
1572    return $url;
1573  }
1574  public function shutdown()
1575  {
1576  }
1577}
1578
1579
1580abstract class sfStorage
1581{
1582  protected
1583    $options = array();
1584  public function __construct($options = array())
1585  {
1586    $this->initialize($options);
1587    if ($this->options['auto_shutdown'])
1588    {
1589      register_shutdown_function(array($this, 'shutdown'));
1590    }
1591  }
1592  public function initialize($options = array())
1593  {
1594    $this->options = array_merge(array(
1595      'auto_shutdown' => true,
1596    ), $options);
1597  }
1598  public function getOptions()
1599  {
1600    return $this->options;
1601  }
1602  abstract public function read($key);
1603  abstract public function regenerate($destroy = false);
1604  abstract public function remove($key);
1605  abstract public function shutdown();
1606  abstract public function write($key, $data);
1607}
1608
1609
1610class sfUser
1611{
1612  const ATTRIBUTE_NAMESPACE = 'symfony/user/sfUser/attributes';
1613  const CULTURE_NAMESPACE = 'symfony/user/sfUser/culture';
1614  protected
1615    $options         = array(),
1616    $attributeHolder = null,
1617    $culture         = null,
1618    $storage         = null,
1619    $dispatcher      = null;
1620  public function __construct(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
1621  {
1622    $this->initialize($dispatcher, $storage, $options);
1623    if ($this->options['auto_shutdown'])
1624    {
1625      register_shutdown_function(array($this, 'shutdown'));
1626    }
1627  }
1628  public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
1629  {
1630    $this->dispatcher = $dispatcher;
1631    $this->storage    = $storage;
1632    $this->options = array_merge(array(
1633      'auto_shutdown'   => true,
1634      'culture'         => null,
1635      'default_culture' => 'en',
1636      'use_flash'       => false,
1637      'logging'         => false,
1638    ), $options);
1639    $this->attributeHolder = new sfNamespacedParameterHolder(self::ATTRIBUTE_NAMESPACE);
1640        $attributes = $storage->read(self::ATTRIBUTE_NAMESPACE);
1641    if (is_array($attributes))
1642    {
1643      foreach ($attributes as $namespace => $values)
1644      {
1645        $this->attributeHolder->add($values, $namespace);
1646      }
1647    }
1648                    $currentCulture = $storage->read(self::CULTURE_NAMESPACE);
1649    $this->setCulture(!is_null($this->options['culture']) ? $this->options['culture'] : (!is_null($currentCulture) ? $currentCulture : $this->options['default_culture']));
1650        if ($this->options['use_flash'] && $names = $this->attributeHolder->getNames('symfony/user/sfUser/flash'))
1651    {
1652      if ($this->options['logging'])
1653      {
1654        $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Flag old flash messages ("%s")', implode('", "', $names)))));
1655      }
1656      foreach ($names as $name)
1657      {
1658        $this->attributeHolder->set($name, true, 'symfony/user/sfUser/flash/remove');
1659      }
1660    }
1661  }
1662  public function getOptions()
1663  {
1664    return $this->options;
1665  }
1666  public function setCulture($culture)
1667  {
1668    if ($this->culture != $culture)
1669    {
1670      $this->culture = $culture;
1671      $this->dispatcher->notify(new sfEvent($this, 'user.change_culture', array('culture' => $culture)));
1672    }
1673  }
1674  public function setFlash($name, $value, $persist = true)
1675  {
1676    if (!$this->options['use_flash'])
1677    {
1678      return;
1679    }
1680    $this->setAttribute($name, $value, 'symfony/user/sfUser/flash');
1681    if ($persist)
1682    {
1683            $this->attributeHolder->remove($name, null, 'symfony/user/sfUser/flash/remove');
1684    }
1685    else
1686    {
1687      $this->setAttribute($name, true, 'symfony/user/sfUser/flash/remove');
1688    }
1689  }
1690  public function getFlash($name, $default = null)
1691  {
1692    if (!$this->options['use_flash'])
1693    {
1694      return $default;
1695    }
1696    return $this->getAttribute($name, $default, 'symfony/user/sfUser/flash');
1697  }
1698  public function hasFlash($name)
1699  {
1700    if (!$this->options['use_flash'])
1701    {
1702      return false;
1703    }
1704    return $this->hasAttribute($name, 'symfony/user/sfUser/flash');
1705  }
1706  public function getCulture()
1707  {
1708    return $this->culture;
1709  }
1710  public function getAttributeHolder()
1711  {
1712    return $this->attributeHolder;
1713  }
1714  public function getAttribute($name, $default = null, $ns = null)
1715  {
1716    return $this->attributeHolder->get($name, $default, $ns);
1717  }
1718  public function hasAttribute($name, $ns = null)
1719  {
1720    return $this->attributeHolder->has($name, $ns);
1721  }
1722  public function setAttribute($name, $value, $ns = null)
1723  {
1724    return $this->attributeHolder->set($name, $value, $ns);
1725  }
1726  public function shutdown()
1727  {
1728        if ($this->options['use_flash'] && $names = $this->attributeHolder->getNames('symfony/user/sfUser/flash/remove'))
1729    {
1730      if ($this->options['logging'])
1731      {
1732        $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Remove old flash messages ("%s")', implode('", "', $names)))));
1733      }
1734      foreach ($names as $name)
1735      {
1736        $this->attributeHolder->remove($name, null, 'symfony/user/sfUser/flash');
1737        $this->attributeHolder->remove($name, null, 'symfony/user/sfUser/flash/remove');
1738      }
1739    }
1740    $attributes = array();
1741    foreach ($this->attributeHolder->getNamespaces() as $namespace)
1742    {
1743      $attributes[$namespace] = $this->attributeHolder->getAll($namespace);
1744    }
1745        $this->storage->write(self::ATTRIBUTE_NAMESPACE, $attributes);
1746        $this->storage->write(self::CULTURE_NAMESPACE, $this->culture);
1747  }
1748  public function __call($method, $arguments)
1749  {
1750    $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'user.method_not_found', array('method' => $method, 'arguments' => $arguments)));
1751    if (!$event->isProcessed())
1752    {
1753      throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
1754    }
1755    return $event->getReturnValue();
1756  }
1757}
1758
1759
1760class sfNamespacedParameterHolder extends sfParameterHolder
1761{
1762  protected $default_namespace = null;
1763  protected $parameters = array();
1764  public function __construct($namespace = 'symfony/default')
1765  {
1766    $this->default_namespace = $namespace;
1767  }
1768  public function setDefaultNamespace($namespace, $move = true)
1769  {
1770    if ($move)
1771    {
1772      $values = $this->removeNamespace();
1773      $this->addByRef($values, $namespace);
1774    }
1775    $this->default_namespace = $namespace;
1776  }
1777  public function getDefaultNamespace()
1778  {
1779    return $this->default_namespace;
1780  }
1781  public function clear()
1782  {
1783    $this->parameters = null;
1784    $this->parameters = array();
1785  }
1786  public function & get($name, $default = null, $ns = null)
1787  {
1788    if (!$ns)
1789    {
1790      $ns = $this->default_namespace;
1791    }
1792    if (isset($this->parameters[$ns][$name]))
1793    {
1794      $value = & $this->parameters[$ns][$name];
1795    }
1796    else if (isset($this->parameters[$ns]))
1797    {
1798      $value = sfToolkit::getArrayValueForPath($this->parameters[$ns], $name, $default);
1799    }
1800    else
1801    {
1802      $value = $default;
1803    }
1804    return $value;
1805  }
1806  public function getNames($ns = null)
1807  {
1808    if (!$ns)
1809    {
1810      $ns = $this->default_namespace;
1811    }
1812    if (isset($this->parameters[$ns]))
1813    {
1814      return array_keys($this->parameters[$ns]);
1815    }
1816    return array();
1817  }
1818  public function getNamespaces()
1819  {
1820    return array_keys($this->parameters);
1821  }
1822  public function & getAll($ns = null)
1823  {
1824    if (!$ns)
1825    {
1826      $ns = $this->default_namespace;
1827    }
1828    $parameters = array();
1829    if (isset($this->parameters[$ns]))
1830    {
1831      $parameters = $this->parameters[$ns];
1832    }
1833    return $parameters;
1834  }
1835  public function has($name, $ns = null)
1836  {
1837    if (!$ns)
1838    {
1839      $ns = $this->default_namespace;
1840    }
1841    if (isset($this->parameters[$ns][$name]))
1842    {
1843      return true;
1844    }
1845    else if (isset($this->parameters[$ns]))
1846    {
1847      return sfToolkit::hasArrayValueForPath($this->parameters[$ns], $name);
1848    }
1849    return false;
1850  }
1851  public function hasNamespace($ns)
1852  {
1853    return isset($this->parameters[$ns]);
1854  }
1855  public function remove($name, $default = null, $ns = null)
1856  {
1857    if (!$ns)
1858    {
1859      $ns = $this->default_namespace;
1860    }
1861    $retval = $default;
1862    if (isset($this->parameters[$ns]) && array_key_exists($name, $this->parameters[$ns]))
1863    {
1864      $retval = $this->parameters[$ns][$name];
1865      unset($this->parameters[$ns][$name]);
1866    }
1867    else
1868    {
1869      $retval = sfToolkit::removeArrayValueForPath($this->parameters[$ns], $name, $default);
1870    }
1871    return $retval;
1872  }
1873  public function & removeNamespace($ns = null)
1874  {
1875    if (!$ns)
1876    {
1877      $ns = $this->default_namespace;
1878    }
1879    $retval = null;
1880    if (isset($this->parameters[$ns]))
1881    {
1882      $retval =& $this->parameters[$ns];
1883      unset($this->parameters[$ns]);
1884    }
1885    return $retval;
1886  }
1887  public function set($name, $value, $ns = null)
1888  {
1889    if (!$ns)
1890    {
1891      $ns = $this->default_namespace;
1892    }
1893    if (!isset($this->parameters[$ns]))
1894    {
1895      $this->parameters[$ns] = array();
1896    }
1897    $this->parameters[$ns][$name] = $value;
1898  }
1899  public function setByRef($name, & $value, $ns = null)
1900  {
1901    if (!$ns)
1902    {
1903      $ns = $this->default_namespace;
1904    }
1905    if (!isset($this->parameters[$ns]))
1906    {
1907      $this->parameters[$ns] = array();
1908    }
1909    $this->parameters[$ns][$name] =& $value;
1910  }
1911  public function add($parameters, $ns = null)
1912  {
1913    if ($parameters === null) return;
1914    if (!$ns)
1915    {
1916      $ns = $this->default_namespace;
1917    }
1918    if (!isset($this->parameters[$ns]))
1919    {
1920      $this->parameters[$ns] = array();
1921    }
1922    foreach ($parameters as $key => $value)
1923    {
1924      $this->parameters[$ns][$key] = $value;
1925    }
1926  }
1927  public function addByRef(& $parameters, $ns = null)
1928  {
1929    if (!$ns)
1930    {
1931      $ns = $this->default_namespace;
1932    }
1933    if (!isset($this->parameters[$ns]))
1934    {
1935      $this->parameters[$ns] = array();
1936    }
1937    foreach ($parameters as $key => &$value)
1938    {
1939      $this->parameters[$ns][$key] =& $value;
1940    }
1941  }
1942  public function serialize()
1943  {
1944    return serialize(array($this->default_namespace, $this->parameters));
1945  }
1946  public function unserialize($serialized)
1947  {
1948    $data = unserialize($serialized);
1949    $this->default_namespace = $data[0];
1950    $this->parameters = $data[1];
1951  }
1952}
1953
1954
1955abstract class sfView
1956{
1957  const ALERT = 'Alert';
1958  const ERROR = 'Error';
1959  const INPUT = 'Input';
1960  const NONE = 'None';
1961  const SUCCESS = 'Success';
1962  const RENDER_NONE = 1;
1963  const RENDER_CLIENT = 2;
1964  const RENDER_VAR = 4;
1965  const HEADER_ONLY = 8;
1966  protected
1967    $context            = null,
1968    $dispatcher         = null,
1969    $decorator          = false,
1970    $decoratorDirectory = null,
1971    $decoratorTemplate  = null,
1972    $directory          = null,
1973    $componentSlots     = array(),
1974    $template           = null,
1975    $attributeHolder    = null,
1976    $parameterHolder    = null,
1977    $moduleName         = '',
1978    $actionName         = '',
1979    $viewName           = '',
1980    $extension          = '.php';
1981  public function __construct($context, $moduleName, $actionName, $viewName)
1982  {
1983    $this->initialize($context, $moduleName, $actionName, $viewName);
1984  }
1985  public function initialize($context, $moduleName, $actionName, $viewName)
1986  {
1987    $this->moduleName = $moduleName;
1988    $this->actionName = $actionName;
1989    $this->viewName   = $viewName;
1990    $this->context    = $context;
1991    $this->dispatcher = $context->getEventDispatcher();
1992    sfOutputEscaper::markClassesAsSafe(array('sfForm', 'sfModelGeneratorHelper'));
1993    $this->attributeHolder = $this->initializeAttributeHolder();
1994    $this->parameterHolder = new sfParameterHolder();
1995    $this->parameterHolder->add(sfConfig::get('mod_'.strtolower($moduleName).'_view_param', array()));
1996    $request = $context->getRequest();
1997    if (!is_null($format = $request->getRequestFormat()))
1998    {
1999      if ('html' != $format)
2000      {
2001        $this->setExtension('.'.$format.$this->getExtension());
2002      }
2003      if ($mimeType = $request->getMimeType($format))
2004      {
2005        $this->context->getResponse()->setContentType($mimeType);
2006        if ('html' != $format)
2007        {
2008          $this->setDecorator(false);
2009        }
2010      }
2011      $this->dispatcher->notify(new sfEvent($this, 'view.configure_format', array('format' => $format, 'response' => $context->getResponse(), 'request' => $context->getRequest())));
2012    }
2013        $this->configure();
2014    return true;
2015  }
2016  protected function initializeAttributeHolder($attributes = array())
2017  {
2018    if ('both' === sfConfig::get('sf_escaping_strategy'))
2019    {
2020      $this->dispatcher->notify(new sfEvent($this, 'application.log', array('Escaping strategy "both" is deprecated, please use "on".', 'priority' => sfLogger::ERR)));
2021      sfConfig::set('sf_escaping_strategy', 'on');
2022    }
2023    else if ('bc' === sfConfig::get('sf_escaping_strategy'))
2024    {
2025      $this->dispatcher->notify(new sfEvent($this, 'application.log', array('Escaping strategy "bc" is deprecated, please use "off".', 'priority' => sfLogger::ERR)));
2026      sfConfig::set('sf_escaping_strategy', 'off');
2027    }
2028    $attributeHolder = new sfViewParameterHolder($this->dispatcher, $attributes, array(
2029      'escaping_method'   => sfConfig::get('sf_escaping_method'),
2030      'escaping_strategy' => sfConfig::get('sf_escaping_strategy'),
2031    ));
2032    return $attributeHolder;
2033  }
2034  abstract function execute();
2035  abstract function configure();
2036  public function getDecoratorDirectory()
2037  {
2038    return $this->decoratorDirectory;
2039  }
2040  public function getDecoratorTemplate()
2041  {
2042    return $this->decoratorTemplate;
2043  }
2044  public function getDirectory()
2045  {
2046    return $this->directory;
2047  }
2048  abstract function getEngine();
2049  public function getTemplate()
2050  {
2051    return $this->template;
2052  }
2053  public function getAttributeHolder()
2054  {
2055    return $this->attributeHolder;
2056  }
2057  public function getAttribute($name, $default = null)
2058  {
2059    return $this->attributeHolder->get($name, $default);
2060  }
2061  public function hasAttribute($name)
2062  {
2063    return $this->attributeHolder->has($name);
2064  }
2065  public function setAttribute($name, $value)
2066  {
2067    $this->attributeHolder->set($name, $value);
2068  }
2069  public function getParameterHolder()
2070  {
2071    return $this->parameterHolder;
2072  }
2073  public function getParameter($name, $default = null)
2074  {
2075    return $this->parameterHolder->get($name, $default);
2076  }
2077  public function hasParameter($name)
2078  {
2079    return $this->parameterHolder->has($name);
2080  }
2081  public function setParameter($name, $value)
2082  {
2083    $this->parameterHolder->set($name, $value);
2084  }
2085  public function isDecorator()
2086  {
2087    return $this->decorator;
2088  }
2089  public function setDecorator($boolean)
2090  {
2091    $this->decorator = (boolean) $boolean;
2092    if (false === $boolean)
2093    {
2094      $this->decoratorTemplate = false;
2095    }
2096  }
2097  protected function preRenderCheck()
2098  {
2099    if (is_null($this->template))
2100    {
2101            throw new sfRenderException('A template has not been set.');
2102    }
2103    if (!is_readable($this->directory.'/'.$this->template))
2104    {
2105            if ('404' == $this->context->getResponse()->getStatusCode())
2106      {
2107                $this->template = sfException::getTemplatePathForError($this->context->getRequest()->getRequestFormat(), false);
2108        $this->directory = dirname($this->template);
2109        $this->template = basename($this->template);
2110        $this->setAttribute('code', '404');
2111        $this->setAttribute('text', 'Not Found');
2112      }
2113      else
2114      {
2115        throw new sfRenderException(sprintf('The template "%s" does not exist or is unreadable in "%s".', $this->template, $this->directory));
2116      }
2117    }
2118        if ($this->decorator && !is_readable($this->decoratorDirectory.'/'.$this->decoratorTemplate))
2119    {
2120      throw new sfRenderException(sprintf('The decorator template "%s" does not exist or is unreadable in "%s".', $this->decoratorTemplate, $this->decoratorDirectory));
2121    }
2122  }
2123  abstract function render();
2124  public function setDecoratorDirectory($directory)
2125  {
2126    $this->decoratorDirectory = $directory;
2127  }
2128  public function setDecoratorTemplate($template)
2129  {
2130    if (false === $template)
2131    {
2132      $this->setDecorator(false);
2133      return;
2134    }
2135    else if (is_null($template))
2136    {
2137      return;
2138    }
2139    if (!strpos($template, '.'))
2140    {
2141      $template .= $this->getExtension();
2142    }
2143    if (sfToolkit::isPathAbsolute($template))
2144    {
2145      $this->decoratorDirectory = dirname($template);
2146      $this->decoratorTemplate  = basename($template);
2147    }
2148    else
2149    {
2150      $this->decoratorDirectory = $this->context->getConfiguration()->getDecoratorDir($template);
2151      $this->decoratorTemplate = $template;
2152    }
2153        $this->decorator = true;
2154  }
2155  public function setDirectory($directory)
2156  {
2157    $this->directory = $directory;
2158  }
2159  public function setComponentSlot($attributeName, $moduleName, $componentName)
2160  {
2161    $this->componentSlots[$attributeName]                   = array();
2162    $this->componentSlots[$attributeName]['module_name']    = $moduleName;
2163    $this->componentSlots[$attributeName]['component_name'] = $componentName;
2164  }
2165  public function hasComponentSlot($name)
2166  {
2167    return isset($this->componentSlots[$name]);
2168  }
2169  public function getComponentSlot($name)
2170  {
2171    if (isset($this->componentSlots[$name]) && $this->componentSlots[$name]['module_name'] && $this->componentSlots[$name]['component_name'])
2172    {
2173      return array($this->componentSlots[$name]['module_name'], $this->componentSlots[$name]['component_name']);
2174    }
2175    return null;
2176  }
2177  public function setTemplate($template)
2178  {
2179    if (sfToolkit::isPathAbsolute($template))
2180    {
2181      $this->directory = dirname($template);
2182      $this->template  = basename($template);
2183    }
2184    else
2185    {
2186      $this->directory = $this->context->getConfiguration()->getTemplateDir($this->moduleName, $template);
2187      $this->template = $template;
2188    }
2189  }
2190  public function getExtension()
2191  {
2192    return $this->extension;
2193  }
2194  public function setExtension($extension)
2195  {
2196    $this->extension = $extension;
2197  }
2198  public function getModuleName()
2199  {
2200    return $this->moduleName;
2201  }
2202  public function getActionName()
2203  {
2204    return $this->actionName;
2205  }
2206  public function getViewName()
2207  {
2208    return $this->viewName;
2209  }
2210  public function __call($method, $arguments)
2211  {
2212    $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'view.method_not_found', array('method' => $method, 'arguments' => $arguments)));
2213    if (!$event->isProcessed())
2214    {
2215      throw new sfException(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
2216    }
2217    return $event->getReturnValue();
2218  }
2219}
2220
2221
2222class sfViewParameterHolder extends sfParameterHolder
2223{
2224  protected
2225    $dispatcher     = null,
2226    $escaping       = null,
2227    $escapingMethod = null;
2228  public function __construct(sfEventDispatcher $dispatcher, $parameters = array(), $options = array())
2229  {
2230    $this->initialize($dispatcher, $parameters, $options);
2231  }
2232  public function initialize(sfEventDispatcher $dispatcher, $parameters = array(), $options = array())
2233  {
2234    $this->dispatcher = $dispatcher;
2235    $this->add($parameters);
2236    $this->setEscaping(isset($options['escaping_strategy']) ? $options['escaping_strategy'] : false);
2237    $this->setEscapingMethod(isset($options['escaping_method']) ? $options['escaping_method'] : 'ESC_SPECIALCHARS');
2238  }
2239  public function isEscaped()
2240  {
2241    return in_array($this->getEscaping(), array('on', true), true);
2242  }
2243  public function toArray()
2244  {
2245    $event = $this->dispatcher->filter(new sfEvent($this, 'template.filter_parameters'), $this->getAll());
2246    $parameters = $event->getReturnValue();
2247    $attributes = array();
2248    if ($this->isEscaped())
2249    {
2250      $attributes['sf_data'] = sfOutputEscaper::escape($this->getEscapingMethod(), $parameters);
2251      foreach ($attributes['sf_data'] as $key => $value)
2252      {
2253        $attributes[$key] = $value;
2254      }
2255    }
2256    else if (in_array($this->getEscaping(), array('off', false), true))
2257    {
2258      $attributes = $parameters;
2259      $attributes['sf_data'] = sfOutputEscaper::escape(ESC_RAW, $parameters);
2260    }
2261    else
2262    {
2263      throw new InvalidArgumentException(sprintf('Unknown strategy "%s".', $this->getEscaping()));
2264    }
2265    return $attributes;
2266  }
2267  public function getEscaping()
2268  {
2269    return $this->escaping;
2270  }
2271  public function setEscaping($escaping)
2272  {
2273    $this->escaping = $escaping;
2274  }
2275  public function getEscapingMethod()
2276  {
2277    if (empty($this->escapingMethod))
2278    {
2279      return $this->escapingMethod;
2280    }
2281    if (!defined($this->escapingMethod))
2282    {
2283      throw new InvalidArgumentException(sprintf('The escaping method "%s" is not available.', $this->escapingMethod));
2284    }
2285    return constant($this->escapingMethod);
2286  }
2287  public function setEscapingMethod($method)
2288  {
2289    $this->escapingMethod = $method;
2290  }
2291  public function serialize()
2292  {
2293    return serialize(array($this->getAll(), $this->escapingMethod, $this->escaping));
2294  }
2295  public function unserialize($serialized)
2296  {
2297    list($this->parameters, $escapingMethod, $escaping) = unserialize($serialized);
2298    $this->initialize(sfContext::hasInstance() ? sfContext::getInstance()->getEventDispatcher() : new sfEventDispatcher());
2299    $this->setEscapingMethod($escapingMethod);
2300    $this->setEscaping($escaping);
2301  }
2302}
2303
2304
2305abstract class sfWebController extends sfController
2306{
2307  public function genUrl($parameters = array(), $absolute = false)
2308  {
2309        if (is_string($parameters) && preg_match('#^[a-z][a-z0-9\+.\-]*\://#i', $parameters))
2310    {
2311      return $parameters;
2312    }
2313        if (is_string($parameters) && 0 === strpos($parameters, '/'))
2314    {
2315      return $parameters;
2316    }
2317    if (is_string($parameters) && $parameters == '#')
2318    {
2319      return $parameters;
2320    }
2321    $route = '';
2322    $fragment = '';
2323    if (is_string($parameters))
2324    {
2325            if (false !== ($pos = strpos($parameters, '#')))
2326      {
2327        $fragment = substr($parameters, $pos + 1);
2328        $parameters = substr($parameters, 0, $pos);
2329      }
2330      list($route, $parameters) = $this->convertUrlStringToParameters($parameters);
2331    }
2332    else if (is_array($parameters))
2333    {
2334      if (isset($parameters['sf_route']))
2335      {
2336        $route = $parameters['sf_route'];
2337        unset($parameters['sf_route']);
2338      }
2339    }
2340        $url = $this->context->getRouting()->generate($route, $parameters, $absolute);
2341    if ($fragment)
2342    {
2343      $url .= '#'.$fragment;
2344    }
2345    return $url;
2346  }
2347  public function convertUrlStringToParameters($url)
2348  {
2349    $givenUrl = $url;
2350    $params = array();
2351    $queryString = '';
2352    $route = '';
2353        if (!$url)
2354    {
2355      $url = '/';
2356    }
2357        if ($pos = strpos($url, '?'))
2358    {
2359      $queryString = substr($url, $pos + 1);
2360      $url = substr($url, 0, $pos);
2361    }
2362        if ($url[0] == '/')
2363    {
2364      $url = substr($url, 1);
2365    }
2366        if ($url[0] == '@')
2367    {
2368      $route = substr($url, 1);
2369    }
2370    else if (false !== strpos($url, '/'))
2371    {
2372      list($params['module'], $params['action']) = explode('/', $url);
2373    }
2374    else if (!$queryString)
2375    {
2376      $route = $givenUrl;
2377    }
2378    else
2379    {
2380      throw new InvalidArgumentException(sprintf('An internal URI must contain a module and an action (module/action) ("%s" given).', $givenUrl));
2381    }
2382        if ($queryString)
2383    {
2384      $matched = preg_match_all('/
2385        ([^&=]+)            # key
2386        =                   # =
2387        (.*?)               # value
2388        (?:
2389          (?=&[^&=]+=) | $  # followed by another key= or the end of the string
2390        )
2391      /x', $queryString, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
2392      foreach ($matches as $match)
2393      {
2394        $params[urldecode($match[1][0])] = urldecode($match[2][0]);
2395      }
2396            if (!$matched)
2397      {
2398        throw new sfParseException(sprintf('Unable to parse query string "%s".', $queryString));
2399      }
2400    }
2401    return array($route, $params);
2402  }
2403  public function redirect($url, $delay = 0, $statusCode = 302)
2404  {
2405    $url = $this->genUrl($url, true);
2406    if (sfConfig::get('sf_logging_enabled'))
2407    {
2408      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Redirect to "%s"', $url))));
2409    }
2410        $response = $this->context->getResponse();
2411    $response->clearHttpHeaders();
2412    $response->setStatusCode($statusCode);
2413    $response->setHttpHeader('Location', $url);
2414    $response->setContent(sprintf('<html><head><meta http-equiv="refresh" content="%d;url=%s"/></head></html>', $delay, htmlspecialchars($url, ENT_QUOTES, sfConfig::get('sf_charset'))));
2415    $response->send();
2416  }
2417}
2418
2419
2420class sfFrontWebController extends sfWebController
2421{
2422  public function dispatch()
2423  {
2424    try
2425    {
2426            sfFilter::$filterCalled = array();
2427            $request    = $this->context->getRequest();
2428      $moduleName = $request->getParameter('module');
2429      $actionName = $request->getParameter('action');
2430      if (empty($moduleName) || empty($actionName))
2431      {
2432        throw new sfError404Exception(sprintf('Empty module and/or action after parsing the URL "%s" (%s/%s).', $request->getPathInfo(), $moduleName, $actionName));
2433      }
2434            $this->forward($moduleName, $actionName);
2435    }
2436    catch (sfException $e)
2437    {
2438      $e->printStackTrace();
2439    }
2440    catch (Exception $e)
2441    {
2442      sfException::createFromException($e)->printStackTrace();
2443    }
2444  }
2445}
2446
2447
2448class sfWebRequest extends sfRequest
2449{
2450  protected
2451    $languages              = null,
2452    $charsets               = null,
2453    $acceptableContentTypes = null,
2454    $pathInfoArray          = null,
2455    $relativeUrlRoot        = null,
2456    $getParameters          = null,
2457    $postParameters         = null,
2458    $requestParameters      = null,
2459    $formats                = array(),
2460    $format                 = null,
2461    $fileArrayFixed         = false;
2462  public function initialize(sfEventDispatcher $dispatcher, $parameters = array(), $attributes = array(), $options = array())
2463  {
2464    parent::initialize($dispatcher, $parameters, $attributes, $options);
2465        $this->getParameters = get_magic_quotes_gpc() ? sfToolkit::stripslashesDeep($_GET) : $_GET;
2466    $this->parameterHolder->add($this->getParameters);
2467        $this->postParameters = get_magic_quotes_gpc() ? sfToolkit::stripslashesDeep($_POST) : $_POST;
2468    $this->parameterHolder->add($this->postParameters);
2469    if (isset($_SERVER['REQUEST_METHOD']))
2470    {
2471      switch ($_SERVER['REQUEST_METHOD'])
2472      {
2473        case 'GET':
2474          $this->setMethod(self::GET);
2475          break;
2476        case 'POST':
2477          $this->setMethod(strtoupper($this->getParameter('sf_method', 'POST')));
2478          $this->parameterHolder->remove('sf_method');
2479          break;
2480        case 'PUT':
2481          $this->setMethod(self::PUT);
2482          break;
2483        case 'DELETE':
2484          $this->setMethod(self::DELETE);
2485          break;
2486        case 'HEAD':
2487          $this->setMethod(self::HEAD);
2488          break;
2489        default:
2490          $this->setMethod(self::GET);
2491      }
2492    }
2493    else
2494    {
2495            $this->setMethod(self::GET);
2496    }
2497    if (isset($this->options['formats']))
2498    {
2499      foreach ($this->options['formats'] as $format => $mimeTypes)
2500      {
2501        $this->setFormat($format, $mimeTypes);
2502      }
2503    }
2504    if (!isset($this->options['path_info_key']))
2505    {
2506      $this->options['path_info_key'] = 'PATH_INFO';
2507    }
2508    if (!isset($this->options['path_info_array']))
2509    {
2510      $this->options['path_info_array'] = 'SERVER';
2511    }
2512        $this->requestParameters = $this->parseRequestParameters();
2513    $this->parameterHolder->add($this->requestParameters);
2514    $this->fixParameters();
2515  }
2516  public function getUri()
2517  {
2518    $pathArray = $this->getPathInfoArray();
2519        if ('HTTP_X_REWRITE_URL' == $this->options['path_info_key'])
2520    {
2521      $uri = isset($pathArray['HTTP_X_REWRITE_URL']) ? $pathArray['HTTP_X_REWRITE_URL'] : '';
2522    }
2523    else
2524    {
2525      $uri = isset($pathArray['REQUEST_URI']) ? $pathArray['REQUEST_URI'] : '';
2526    }
2527    return $this->isAbsUri() ? $uri : $this->getUriPrefix().$uri;
2528  }
2529  public function isAbsUri()
2530  {
2531    $pathArray = $this->getPathInfoArray();
2532    return isset($pathArray['REQUEST_URI']) ? preg_match('/^http/', $pathArray['REQUEST_URI']) : false;
2533  }
2534  public function getUriPrefix()
2535  {
2536    $pathArray = $this->getPathInfoArray();
2537    if ($this->isSecure())
2538    {
2539      $standardPort = '443';
2540      $protocol = 'https';
2541    }
2542    else
2543    {
2544      $standardPort = '80';
2545      $protocol = 'http';
2546    }
2547    $host = explode(":", $this->getHost());
2548    if (count($host) == 1)
2549    {
2550      $host[] = isset($pathArray['SERVER_PORT']) ? $pathArray['SERVER_PORT'] : '';
2551    }
2552    if ($host[1] == $standardPort || empty($host[1]))
2553    {
2554      unset($host[1]);
2555    }
2556    return $protocol.'://'.implode(':', $host);;
2557  }
2558  public function getPathInfo()
2559  {
2560    $pathInfo = '';
2561    $pathArray = $this->getPathInfoArray();
2562        $sf_path_info_key = $this->options['path_info_key'];
2563    if (!isset($pathArray[$sf_path_info_key]) || !$pathArray[$sf_path_info_key])
2564    {
2565      if (isset($pathArray['REQUEST_URI']))
2566      {
2567        $script_name = $this->getScriptName();
2568        $uri_prefix = $this->isAbsUri() ? $this->getUriPrefix() : '';
2569        $pathInfo = preg_replace('/^'.preg_quote($uri_prefix, '/').'/','',$pathArray['REQUEST_URI']);
2570        $pathInfo = preg_replace('/^'.preg_quote($script_name, '/').'/', '', $pathInfo);
2571        $prefix_name = preg_replace('#/[^/]+$#', '', $script_name);
2572        $pathInfo = preg_replace('/^'.preg_quote($prefix_name, '/').'/', '', $pathInfo);
2573        $pathInfo = preg_replace('/\??'.preg_quote($pathArray['QUERY_STRING'], '/').'$/', '', $pathInfo);
2574      }
2575    }
2576    else
2577    {
2578      $pathInfo = $pathArray[$sf_path_info_key];
2579      if ($relativeUrlRoot = $this->getRelativeUrlRoot())
2580      {
2581        $pathInfo = preg_replace('/^'.str_replace('/', '\\/', $relativeUrlRoot).'\//', '', $pathInfo);
2582      }
2583    }
2584        if (isset($_SERVER['SERVER_SOFTWARE']) && false !== stripos($_SERVER['SERVER_SOFTWARE'], 'iis') && $pos = stripos($pathInfo, '.php'))
2585    {
2586      $pathInfo = substr($pathInfo, $pos + 4);
2587    }
2588    if (!$pathInfo)
2589    {
2590      $pathInfo = '/';
2591    }
2592    return $pathInfo;
2593  }
2594  public function getPathInfoPrefix()
2595  {
2596    $prefix = $this->getRelativeUrlRoot();
2597    if (!isset($this->options['no_script_name']) || !$this->options['no_script_name'])
2598    {
2599      $scriptName = $this->getScriptName();
2600      $prefix = is_null($prefix) ? $scriptName : $prefix.'/'.basename($scriptName);
2601    }
2602    return $prefix;
2603  }
2604  public function getGetParameters()
2605  {
2606    return $this->getParameters;
2607  }
2608  public function getPostParameters()
2609  {
2610    return $this->postParameters;
2611  }
2612  public function getRequestParameters()
2613  {
2614    return $this->requestParameters;
2615  }
2616  public function addRequestParameters($parameters)
2617  {
2618    $this->requestParameters = array_merge($this->requestParameters, $parameters);
2619    $this->getParameterHolder()->add($parameters);
2620    $this->fixParameters();
2621  }
2622  public function getReferer()
2623  {
2624    $pathArray = $this->getPathInfoArray();
2625    return isset($pathArray['HTTP_REFERER']) ? $pathArray['HTTP_REFERER'] : '';
2626  }
2627  public function getHost()
2628  {
2629    $pathArray = $this->getPathInfoArray();
2630    return isset($pathArray['HTTP_X_FORWARDED_HOST']) ? $pathArray['HTTP_X_FORWARDED_HOST'] : (isset($pathArray['HTTP_HOST']) ? $pathArray['HTTP_HOST'] : '');
2631  }
2632  public function getScriptName()
2633  {
2634    $pathArray = $this->getPathInfoArray();
2635    return isset($pathArray['SCRIPT_NAME']) ? $pathArray['SCRIPT_NAME'] : (isset($pathArray['ORIG_SCRIPT_NAME']) ? $pathArray['ORIG_SCRIPT_NAME'] : '');
2636  }
2637  public function isMethod($method)
2638  {
2639    return strtoupper($method) == $this->getMethod();
2640  }
2641  public function getMethodName()
2642  {
2643    if ($this->options['logging'])
2644    {
2645      $this->dispatcher->notify(new sfEvent($this, 'application.log', array('The "sfWebRequest::getMethodName()" method is deprecated, please use "getMethod()" instead.', 'priority' => sfLogger::WARNING)));
2646    }
2647    return $this->getMethod();
2648  }
2649  public function getPreferredCulture(array $cultures = null)
2650  {
2651    $preferredCultures = $this->getLanguages();
2652    if (is_null($cultures))
2653    {
2654      return isset($preferredCultures[0]) ? $preferredCultures[0] : null;
2655    }
2656    if (!$preferredCultures)
2657    {
2658      return $cultures[0];
2659    }
2660    $preferredCultures = array_values(array_intersect($preferredCultures, $cultures));
2661    return isset($preferredCultures[0]) ? $preferredCultures[0] : $cultures[0];
2662  }
2663  public function getLanguages()
2664  {
2665    if ($this->languages)
2666    {
2667      return $this->languages;
2668    }
2669    if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
2670    {
2671      return array();
2672    }
2673    $languages = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT_LANGUAGE']);
2674    foreach ($languages as $lang)
2675    {
2676      if (strstr($lang, '-'))
2677      {
2678        $codes = explode('-', $lang);
2679        if ($codes[0] == 'i')
2680        {
2681                                        if (count($codes) > 1)
2682          {
2683            $lang = $codes[1];
2684          }
2685        }
2686        else
2687        {
2688          for ($i = 0, $max = count($codes); $i < $max; $i++)
2689          {
2690            if ($i == 0)
2691            {
2692              $lang = strtolower($codes[0]);
2693            }
2694            else
2695            {
2696              $lang .= '_'.strtoupper($codes[$i]);
2697            }
2698          }
2699        }
2700      }
2701      $this->languages[] = $lang;
2702    }
2703    return $this->languages;
2704  }
2705  public function getCharsets()
2706  {
2707    if ($this->charsets)
2708    {
2709      return $this->charsets;
2710    }
2711    if (!isset($_SERVER['HTTP_ACCEPT_CHARSET']))
2712    {
2713      return array();
2714    }
2715    $this->charsets = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT_CHARSET']);
2716    return $this->charsets;
2717  }
2718  public function getAcceptableContentTypes()
2719  {
2720    if ($this->acceptableContentTypes)
2721    {
2722      return $this->acceptableContentTypes;
2723    }
2724    if (!isset($_SERVER['HTTP_ACCEPT']))
2725    {
2726      return array();
2727    }
2728    $this->acceptableContentTypes = $this->splitHttpAcceptHeader($_SERVER['HTTP_ACCEPT']);
2729    return $this->acceptableContentTypes;
2730  }
2731  public function isXmlHttpRequest()
2732  {
2733    return ($this->getHttpHeader('X_REQUESTED_WITH') == 'XMLHttpRequest');
2734  }
2735  public function getHttpHeader($name, $prefix = 'http')
2736  {
2737    if ($prefix)
2738    {
2739      $prefix = strtoupper($prefix).'_';
2740    }
2741    $name = $prefix.strtoupper(strtr($name, '-', '_'));
2742    $pathArray = $this->getPathInfoArray();
2743    return isset($pathArray[$name]) ? sfToolkit::stripslashesDeep($pathArray[$name]) : null;
2744  }
2745  public function getCookie($name, $defaultValue = null)
2746  {
2747    $retval = $defaultValue;
2748    if (isset($_COOKIE[$name]))
2749    {
2750      $retval = get_magic_quotes_gpc() ? sfToolkit::stripslashesDeep($_COOKIE[$name]) : $_COOKIE[$name];
2751    }
2752    return $retval;
2753  }
2754  public function isSecure()
2755  {
2756    $pathArray = $this->getPathInfoArray();
2757    return (
2758      (isset($pathArray['HTTPS']) && (strtolower($pathArray['HTTPS']) == 'on' || $pathArray['HTTPS'] == 1))
2759      ||
2760      (isset($pathArray['HTTP_SSL_HTTPS']) && (strtolower($pathArray['HTTP_SSL_HTTPS']) == 'on' || $pathArray['HTTP_SSL_HTTPS'] == 1))
2761      ||
2762      (isset($pathArray['HTTP_X_FORWARDED_PROTO']) && strtolower($pathArray['HTTP_X_FORWARDED_PROTO']) == 'https')
2763    );
2764  }
2765  public function getRelativeUrlRoot()
2766  {
2767    if (is_null($this->relativeUrlRoot))
2768    {
2769      if (!isset($this->options['relative_url_root']))
2770      {
2771        $this->relativeUrlRoot = preg_replace('#/[^/]+\.php5?$#', '', $this->getScriptName());
2772      }
2773      else
2774      {
2775        $this->relativeUrlRoot = $this->options['relative_url_root'];
2776      }
2777    }
2778    return $this->relativeUrlRoot;
2779  }
2780  public function setRelativeUrlRoot($value)
2781  {
2782    $this->relativeUrlRoot = $value;
2783  }
2784  public function splitHttpAcceptHeader($header)
2785  {
2786    $values = array();
2787    foreach (array_filter(explode(',', $header)) as $value)
2788    {
2789            if ($pos = strpos($value, ';'))
2790      {
2791        $q     = (float) trim(substr($value, $pos + 3));
2792        $value = trim(substr($value, 0, $pos));
2793      }
2794      else
2795      {
2796        $q = 1;
2797      }
2798      $values[$value] = $q;
2799    }
2800    arsort($values);
2801    return array_keys($values);
2802  }
2803  public function getPathInfoArray()
2804  {
2805    if (!$this->pathInfoArray)
2806    {
2807            switch ($this->options['path_info_array'])
2808      {
2809        case 'SERVER':
2810          $this->pathInfoArray =& $_SERVER;
2811          break;
2812        case 'ENV':
2813        default:
2814          $this->pathInfoArray =& $_ENV;
2815      }
2816    }
2817    return $this->pathInfoArray;
2818  }
2819  public function getMimeType($format)
2820  {
2821    return isset($this->formats[$format]) ? $this->formats[$format][0] : null;
2822  }
2823  public function getFormat($mimeType)
2824  {
2825    foreach ($this->formats as $format => $mimeTypes)
2826    {
2827      if (in_array($mimeType, $mimeTypes))
2828      {
2829        return $format;
2830      }
2831    }
2832    return null;
2833  }
2834  public function setFormat($format, $mimeTypes)
2835  {
2836    $this->formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes);
2837  }
2838  public function setRequestFormat($format)
2839  {
2840    $this->format = $format;
2841  }
2842  public function getRequestFormat()
2843  {
2844    if (is_null($this->format))
2845    {
2846      $this->setRequestFormat($this->getParameter('sf_format'));
2847    }
2848    return $this->format;
2849  }
2850  public function getFiles($key = null)
2851  {
2852    if (false === $this->fileArrayFixed)
2853    {
2854      $files = self::convertFileInformation($_FILES);
2855      $this->fileArrayFixed = true;
2856    }
2857    return is_null($key) ? $files : (isset($files[$key]) ? $files[$key] : array());
2858  }
2859  static public function convertFileInformation(array $taintedFiles)
2860  {
2861    $files = array();
2862    foreach ($taintedFiles as $key => $data)
2863    {
2864      $files[$key] = self::fixPhpFilesArray($data);
2865    }
2866    return $files;
2867  }
2868  static protected function fixPhpFilesArray($data)
2869  {
2870    $fileKeys = array('error', 'name', 'size', 'tmp_name', 'type');
2871    $keys = array_keys($data);
2872    sort($keys);
2873    if ($fileKeys != $keys || !isset($data['name']) || !is_array($data['name']))
2874    {
2875      return $data;
2876    }
2877    $files = $data;
2878    foreach ($fileKeys as $k)
2879    {
2880      unset($files[$k]);
2881    }
2882    foreach (array_keys($data['name']) as $key)
2883    {
2884      $files[$key] = self::fixPhpFilesArray(array(
2885        'error'    => $data['error'][$key],
2886        'name'     => $data['name'][$key],
2887        'type'     => $data['type'][$key],
2888        'tmp_name' => $data['tmp_name'][$key],
2889        'size'     => $data['size'][$key],
2890      ));
2891    }
2892    return $files;
2893  }
2894  public function getGetParameter($name, $default = null)
2895  {
2896    if (isset($this->getParameters[$name]))
2897    {
2898      return $this->getParameters[$name];
2899    }
2900    else
2901    {
2902      return sfToolkit::getArrayValueForPath($this->getParameters, $name, $default);
2903    }
2904  }
2905  public function getPostParameter($name, $default = null)
2906  {
2907    if (isset($this->postParameters[$name]))
2908    {
2909      return $this->postParameters[$name];
2910    }
2911    else
2912    {
2913      return sfToolkit::getArrayValueForPath($this->postParameters, $name, $default);
2914    }
2915  }
2916  public function getUrlParameter($name, $default = null)
2917  {
2918    if (isset($this->requestParameters[$name]))
2919    {
2920      return $this->requestParameters[$name];
2921    }
2922    else
2923    {
2924      return sfToolkit::getArrayValueForPath($this->requestParameters, $name, $default);
2925    }
2926  }
2927  public function getRemoteAddress()
2928  {
2929    $pathInfo = $this->getPathInfoArray();
2930    return $pathInfo['REMOTE_ADDR'];
2931  }
2932  public function getForwardedFor()
2933  {
2934    $pathInfo = $this->getPathInfoArray();
2935    if (empty($pathInfo['HTTP_X_FORWARDED_FOR']))
2936    {
2937      return null;
2938    }
2939    return explode(', ', $pathInfo['HTTP_X_FORWARDED_FOR']);
2940  }
2941  public function checkCSRFProtection()
2942  {
2943    $form = new sfForm();
2944    $form->bind($form->isCSRFProtected() ? array($form->getCSRFFieldName() => $this->getParameter($form->getCSRFFieldName())) : array());
2945    if (!$form->isValid())
2946    {
2947      throw $form->getErrorSchema();
2948    }
2949  }
2950  protected function parseRequestParameters()
2951  {
2952    return $this->dispatcher->filter(new sfEvent($this, 'request.filter_parameters', $this->getRequestContext()), array())->getReturnValue();
2953  }
2954  public function getRequestContext()
2955  {
2956    return array(
2957      'path_info'   => $this->getPathInfo(),
2958      'prefix'      => $this->getPathInfoPrefix(),
2959      'method'      => $this->getMethod(),
2960      'format'      => $this->getRequestFormat(),
2961      'host'        => $this->getHost(),
2962      'is_secure'   => $this->isSecure(),
2963      'request_uri' => $this->getUri(),
2964    );
2965  }
2966  protected function fixParameters()
2967  {
2968        foreach ($this->parameterHolder->getAll() as $key => $value)
2969    {
2970      if (0 === stripos($key, '_sf_'))
2971      {
2972        $this->parameterHolder->remove($key);
2973        $this->setAttribute(substr($key, 1), $value);
2974      }
2975    }
2976  }
2977}
2978
2979
2980class sfPatternRouting extends sfRouting
2981{
2982  protected
2983    $currentRouteName   = null,
2984    $currentInternalUri = array(),
2985    $routes             = array(),
2986    $cacheData          = array(),
2987    $cacheChanged       = false,
2988    $routesFullyLoaded  = true;
2989  public function initialize(sfEventDispatcher $dispatcher, sfCache $cache = null, $options = array())
2990  {
2991    $options = array_merge(array(
2992      'variable_prefixes'                => array(':'),
2993      'segment_separators'               => array('/', '.'),
2994      'variable_regex'                   => '[\w\d_]+',
2995      'load_configuration'               => false,
2996      'suffix'                           => '',
2997      'generate_shortest_url'            => true,
2998      'extra_parameters_as_query_string' => true,
2999      'lazy_routes_deserialize'          => false,
3000      'lookup_cache_dedicated_keys'      => false,
3001    ), $options);
3002        if ('.' == $options['suffix'])
3003    {
3004      $options['suffix'] = '';
3005    }
3006    parent::initialize($dispatcher, $cache, $options);
3007    if (!is_null($this->cache) && !$options['lookup_cache_dedicated_keys'] && $cacheData = $this->cache->get('symfony.routing.data'))
3008    {
3009      $this->cacheData = unserialize($cacheData);
3010    }
3011  }
3012  public function loadConfiguration()
3013  {
3014    if (!is_null($this->cache) && $routes = $this->cache->get('symfony.routing.configuration'))
3015    {
3016      $this->routes = unserialize($routes);
3017      $this->routesFullyLoaded = false;
3018    }
3019    else
3020    {
3021      if ($this->options['load_configuration'] && $config = sfContext::getInstance()->getConfigCache()->checkConfig('config/routing.yml', true))
3022      {
3023        $this->setRoutes(include($config));
3024      }
3025      parent::loadConfiguration();
3026      if (!is_null($this->cache))
3027      {
3028        if (!$this->options['lazy_routes_deserialize'])
3029        {
3030          $this->cache->set('symfony.routing.configuration', serialize($this->routes));
3031        }
3032        else
3033        {
3034          $lazyMap = array();
3035          foreach ($this->routes as $name => $route)
3036          {
3037            if (is_string($route))
3038            {
3039              $route = $this->loadRoute($name);
3040            }
3041            $lazyMap[$name] = serialize($route);
3042          }
3043          $this->cache->set('symfony.routing.configuration', serialize($lazyMap));
3044        }
3045      }
3046    }
3047  }
3048  protected function loadRoute($name)
3049  {
3050    if (is_string($route = $this->routes[$name]))
3051    {
3052      $this->routes[$name] = unserialize($route);
3053      $this->routes[$name]->setDefaultParameters($this->defaultParameters);
3054      return $this->routes[$name];
3055    }
3056    else
3057    {
3058      return $route;
3059    }
3060  }
3061  protected function loadRoutes()
3062  {
3063    if ($this->routesFullyLoaded)
3064    {
3065      return;
3066    }
3067    foreach ($this->routes as $name => $route)
3068    {
3069      if (is_string($route))
3070      {
3071        $this->loadRoute($name);
3072      }
3073    }
3074    $this->routesFullyLoaded = true;
3075  }
3076  public function getCurrentInternalUri($withRouteName = false)
3077  {
3078    return is_null($this->currentRouteName) ? null : $this->currentInternalUri[$withRouteName ? 0 : 1];
3079  }
3080  public function getCurrentRouteName()
3081  {
3082    return $this->currentRouteName;
3083  }
3084  public function getRoutes()
3085  {
3086    if (!$this->routesFullyLoaded)
3087    {
3088      $this->loadRoutes();
3089    }
3090    return $this->routes;
3091  }
3092  public function setRoutes($routes)
3093  {
3094    foreach ($routes as $name => $route)
3095    {
3096      $this->connect($name, $route);
3097    }
3098    if (!$this->routesFullyLoaded)
3099    {
3100      $this->loadRoutes();
3101    }
3102    return $this->routes;
3103  }
3104  public function hasRoutes()
3105  {
3106    return count($this->routes) ? true : false;
3107  }
3108  public function clearRoutes()
3109  {
3110    if ($this->options['logging'])
3111    {
3112      $this->dispatcher->notify(new sfEvent($this, 'application.log', array('Clear all current routes')));
3113    }
3114    $this->routes = array();
3115  }
3116  public function hasRouteName($name)
3117  {
3118    return isset($this->routes[$name]) ? true : false;
3119  }
3120  public function prependRoute($name, $route)
3121  {
3122    $routes = $this->routes;
3123    $this->routes = array();
3124    $newroutes = $this->connect($name, $route);
3125    $this->routes = array_merge($newroutes, $routes);
3126    if (!$this->routesFullyLoaded)
3127    {
3128      $this->loadRoutes();
3129    }
3130    return $this->routes;
3131  }
3132  public function appendRoute($name, $route)
3133  {
3134    return $this->connect($name, $route);
3135  }
3136  public function insertRouteBefore($pivot, $name, $route)
3137  {
3138    if (!isset($this->routes[$pivot]))
3139    {
3140      throw new sfConfigurationException(sprintf('Unable to insert route "%s" before inexistent route "%s".', $name, $pivot));
3141    }
3142    $routes = $this->routes;
3143    $this->routes = array();
3144    $newroutes = array();
3145    foreach ($routes as $key => $value)
3146    {
3147      if ($key == $pivot)
3148      {
3149        $newroutes = array_merge($newroutes, $this->connect($name, $route));
3150      }
3151      $newroutes[$key] = $value;
3152    }
3153    $this->routes = $newroutes;
3154    if (!$this->routesFullyLoaded)
3155    {
3156      $this->loadRoutes();
3157    }
3158    return $this->routes;
3159  }
3160  public function connect($name, $route)
3161  {
3162    $routes = $route instanceof sfRouteCollection ? $route : array($name => $route);
3163    foreach (self::flattenRoutes($routes) as $name => $route)
3164    {
3165      $this->routes[$name] = $route;
3166      $this->configureRoute($route);
3167      if ($this->options['logging'])
3168      {
3169        $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Connect %s "%s" (%s)', get_class($route), $name, $route->getPattern()))));
3170      }
3171    }
3172    if (!$this->routesFullyLoaded)
3173    {
3174      $this->loadRoutes();
3175    }
3176    return $this->routes;
3177  }
3178  public function configureRoute(sfRoute $route)
3179  {
3180    $route->setDefaultParameters($this->defaultParameters);
3181    $route->setDefaultOptions($this->options);
3182  }
3183  public function generate($name, $params = array(), $absolute = false)
3184  {
3185        if (!is_null($this->cache))
3186    {
3187      $cacheKey = 'generate_'.$name.'_'.md5(serialize(array_merge($this->defaultParameters, $params))).'_'.md5(serialize($this->options['context']));
3188      if ($this->options['lookup_cache_dedicated_keys'] && $url = $this->cache->get('symfony.routing.data.'.$cacheKey))
3189      {
3190        return $this->fixGeneratedUrl($url, $absolute);
3191      }
3192      elseif (isset($this->cacheData[$cacheKey]))
3193      {
3194        return $this->fixGeneratedUrl($this->cacheData[$cacheKey], $absolute);
3195      }
3196    }
3197    if ($name)
3198    {
3199            if (!isset($this->routes[$name]))
3200      {
3201        throw new sfConfigurationException(sprintf('The route "%s" does not exist.', $name));
3202      }
3203      $route = $this->routes[$name];
3204      if (is_string($route))
3205      {
3206        $route = $this->loadRoute($name);
3207      }
3208      $route->setDefaultParameters($this->defaultParameters);
3209    }
3210    else
3211    {
3212            if (false === $route = $this->getRouteThatMatchesParameters($params, $this->options['context']))
3213      {
3214        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))));
3215      }
3216    }
3217    $url = $route->generate($params, $this->options['context'], $absolute);
3218        if (!is_null($this->cache))
3219    {
3220      if ($this->options['lookup_cache_dedicated_keys'])
3221      {
3222        $this->cache->set('symfony.routing.data.'.$cacheKey, $url);
3223      }
3224      else
3225      {
3226        $this->cacheChanged = true;
3227        $this->cacheData[$cacheKey] = $url;
3228      }
3229    }
3230    return $this->fixGeneratedUrl($url, $absolute);
3231  }
3232  public function parse($url)
3233  {
3234    if (false === $info = $this->findRoute($url))
3235    {
3236      $this->currentRouteName = null;
3237      $this->currentInternalUri = array();
3238      return false;
3239    }
3240    if ($this->options['logging'])
3241    {
3242      $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))))));
3243    }
3244        $this->updateCurrentInternalUri($info['name'], $info['parameters']);
3245    $route = $this->routes[$info['name']];
3246    if (is_string($route))
3247    {
3248      $route = $this->loadRoute($info['name']);
3249    }
3250    $route->setDefaultParameters($this->defaultParameters);
3251    $route->bind($this->options['context'], $info['parameters']);
3252    $info['parameters']['_sf_route'] = $route;
3253    return $info['parameters'];
3254  }
3255  protected function updateCurrentInternalUri($name, array $parameters)
3256  {
3257        $this->currentRouteName = $name;
3258    $internalUri = array('@'.$this->currentRouteName, $parameters['module'].'/'.$parameters['action']);
3259    unset($parameters['module'], $parameters['action']);
3260    $params = array();
3261    foreach ($parameters as $key => $value)
3262    {
3263      $params[] = $key.'='.$value;
3264    }
3265        sort($params);
3266    $params = $params ? '?'.implode('&', $params) : '';
3267    $this->currentInternalUri = array($internalUri[0].$params, $internalUri[1].$params);
3268  }
3269  public function findRoute($url)
3270  {
3271    $url = $this->normalizeUrl($url);
3272        if (!is_null($this->cache))
3273    {
3274      $cacheKey = 'parse_'.$url.'_'.md5(serialize($this->options['context']));
3275      if ($this->options['lookup_cache_dedicated_keys'] && $info = $this->cache->get('symfony.routing.data.'.$cacheKey))
3276      {
3277        return unserialize($info);
3278      }
3279      elseif (isset($this->cacheData[$cacheKey]))
3280      {
3281        return $this->cacheData[$cacheKey];
3282      }
3283    }
3284    $info = $this->getRouteThatMatchesUrl($url);
3285        if (!is_null($this->cache))
3286    {
3287      if ($this->options['lookup_cache_dedicated_keys'])
3288      {
3289        $this->cache->set('symfony.routing.data.'.$cacheKey, serialize($info));
3290      }
3291      else
3292      {
3293        $this->cacheChanged = true;
3294        $this->cacheData[$cacheKey] = $info;
3295      }
3296    }
3297    return $info;
3298  }
3299  static public function flattenRoutes($routes)
3300  {
3301    $flattenRoutes = array();
3302    foreach ($routes as $name => $route)
3303    {
3304      if ($route instanceof sfRouteCollection)
3305      {
3306        $flattenRoutes = array_merge($flattenRoutes, self::flattenRoutes($route));
3307      }
3308      else
3309      {
3310        $flattenRoutes[$name] = $route;
3311      }
3312    }
3313    return $flattenRoutes;
3314  }
3315  protected function getRouteThatMatchesUrl($url)
3316  {
3317    foreach ($this->routes as $name => $route)
3318    {
3319      if (is_string($route))
3320      {
3321        $route = $this->loadRoute($name);
3322      }
3323      $route->setDefaultParameters($this->defaultParameters);
3324      if (false === $parameters = $route->matchesUrl($url, $this->options['context']))
3325      {
3326        continue;
3327      }
3328      return array('name' => $name, 'pattern' => $route->getPattern(), 'parameters' => $parameters);
3329    }
3330    return false;
3331  }
3332  protected function getRouteThatMatchesParameters($parameters)
3333  {
3334    foreach ($this->routes as $name => $route)
3335    {
3336      if (is_string($route))
3337      {
3338        $route = $this->loadRoute($name);
3339      }
3340      $route->setDefaultParameters($this->defaultParameters);
3341      if ($route->matchesParameters($parameters, $this->options['context']))
3342      {
3343        return $route;
3344      }
3345    }
3346    return false;
3347  }
3348  protected function normalizeUrl($url)
3349  {
3350        if ('/' != substr($url, 0, 1))
3351    {
3352      $url = '/'.$url;
3353    }
3354        if (false !== $pos = strpos($url, '?'))
3355    {
3356      $url = substr($url, 0, $pos);
3357    }
3358        $url = preg_replace('#/+#', '/', $url);
3359    return $url;
3360  }
3361  public function shutdown()
3362  {
3363    if (!is_null($this->cache) && $this->cacheChanged)
3364    {
3365      $this->cacheChanged = false;
3366      $this->cache->set('symfony.routing.data', serialize($this->cacheData));
3367    }
3368  }
3369}
3370
3371
3372class sfWebResponse extends sfResponse
3373{
3374  const
3375    FIRST  = 'first',
3376    MIDDLE = '',
3377    LAST   = 'last',
3378    ALL    = 'ALL',
3379    RAW    = 'RAW';
3380  protected
3381    $cookies     = array(),
3382    $statusCode  = 200,
3383    $statusText  = 'OK',
3384    $headerOnly  = false,
3385    $headers     = array(),
3386    $metas       = array(),
3387    $httpMetas   = array(),
3388    $positions   = array('first', '', 'last'),
3389    $stylesheets = array(),
3390    $javascripts = array(),
3391    $slots       = array();
3392  static protected $statusTexts = array(
3393    '100' => 'Continue',
3394    '101' => 'Switching Protocols',
3395    '200' => 'OK',
3396    '201' => 'Created',
3397    '202' => 'Accepted',
3398    '203' => 'Non-Authoritative Information',
3399    '204' => 'No Content',
3400    '205' => 'Reset Content',
3401    '206' => 'Partial Content',
3402    '300' => 'Multiple Choices',
3403    '301' => 'Moved Permanently',
3404    '302' => 'Found',
3405    '303' => 'See Other',
3406    '304' => 'Not Modified',
3407    '305' => 'Use Proxy',
3408    '306' => '(Unused)',
3409    '307' => 'Temporary Redirect',
3410    '400' => 'Bad Request',
3411    '401' => 'Unauthorized',
3412    '402' => 'Payment Required',
3413    '403' => 'Forbidden',
3414    '404' => 'Not Found',
3415    '405' => 'Method Not Allowed',
3416    '406' => 'Not Acceptable',
3417    '407' => 'Proxy Authentication Required',
3418    '408' => 'Request Timeout',
3419    '409' => 'Conflict',
3420    '410' => 'Gone',
3421    '411' => 'Length Required',
3422    '412' => 'Precondition Failed',
3423    '413' => 'Request Entity Too Large',
3424    '414' => 'Request-URI Too Long',
3425    '415' => 'Unsupported Media Type',
3426    '416' => 'Requested Range Not Satisfiable',
3427    '417' => 'Expectation Failed',
3428    '500' => 'Internal Server Error',
3429    '501' => 'Not Implemented',
3430    '502' => 'Bad Gateway',
3431    '503' => 'Service Unavailable',
3432    '504' => 'Gateway Timeout',
3433    '505' => 'HTTP Version Not Supported',
3434  );
3435  public function initialize(sfEventDispatcher $dispatcher, $options = array())
3436  {
3437    parent::initialize($dispatcher, $options);
3438    $this->javascripts = array_combine($this->positions, array_fill(0, count($this->positions), array()));
3439    $this->stylesheets = array_combine($this->positions, array_fill(0, count($this->positions), array()));
3440    if (!isset($this->options['charset']))
3441    {
3442      $this->options['charset'] = 'utf-8';
3443    }
3444    if (!isset($this->options['send_http_headers']))
3445    {
3446      $this->options['send_http_headers'] = true;
3447    }
3448    if (!isset($this->options['http_protocol']))
3449    {
3450      $this->options['http_protocol'] = 'HTTP/1.0';
3451    }
3452    $this->options['content_type'] = $this->fixContentType(isset($this->options['content_type']) ? $this->options['content_type'] : 'text/html');
3453  }
3454  public function setHeaderOnly($value = true)
3455  {
3456    $this->headerOnly = (boolean) $value;
3457  }
3458  public function isHeaderOnly()
3459  {
3460    return $this->headerOnly;
3461  }
3462  public function setCookie($name, $value, $expire = null, $path = '/', $domain = '', $secure = false, $httpOnly = false)
3463  {
3464    if ($expire !== null)
3465    {
3466      if (is_numeric($expire))
3467      {
3468        $expire = (int) $expire;
3469      }
3470      else
3471      {
3472        $expire = strtotime($expire);
3473        if ($expire === false || $expire == -1)
3474        {
3475          throw new sfException('Your expire parameter is not valid.');
3476        }
3477      }
3478    }
3479    $this->cookies[$name] = array(
3480      'name'     => $name,
3481      'value'    => $value,
3482      'expire'   => $expire,
3483      'path'     => $path,
3484      'domain'   => $domain,
3485      'secure'   => $secure ? true : false,
3486      'httpOnly' => $httpOnly,
3487    );
3488  }
3489  public function setStatusCode($code, $name = null)
3490  {
3491    $this->statusCode = $code;
3492    $this->statusText = null !== $name ? $name : self::$statusTexts[$code];
3493  }
3494  public function getStatusText()
3495  {
3496    return $this->statusText;
3497  }
3498  public function getStatusCode()
3499  {
3500    return $this->statusCode;
3501  }
3502  public function setHttpHeader($name, $value, $replace = true)
3503  {
3504    $name = $this->normalizeHeaderName($name);
3505    if (is_null($value))
3506    {
3507      unset($this->headers[$name]);
3508      return;
3509    }
3510    if ('Content-Type' == $name)
3511    {
3512      if ($replace || !$this->getHttpHeader('Content-Type', null))
3513      {
3514        $this->setContentType($value);
3515      }
3516      return;
3517    }
3518    if (!$replace)
3519    {
3520      $current = isset($this->headers[$name]) ? $this->headers[$name] : '';
3521      $value = ($current ? $current.', ' : '').$value;
3522    }
3523    $this->headers[$name] = $value;
3524  }
3525  public function getHttpHeader($name, $default = null)
3526  {
3527    $name = $this->normalizeHeaderName($name);
3528    return isset($this->headers[$name]) ? $this->headers[$name] : $default;
3529  }
3530  public function hasHttpHeader($name)
3531  {
3532    return array_key_exists($this->normalizeHeaderName($name), $this->headers);
3533  }
3534  public function setContentType($value)
3535  {
3536    $this->headers['Content-Type'] = $this->fixContentType($value);
3537  }
3538  public function getCharset()
3539  {
3540    return $this->options['charset'];
3541  }
3542  public function getContentType()
3543  {
3544    return $this->getHttpHeader('Content-Type', $this->options['content_type']);
3545  }
3546  public function sendHttpHeaders()
3547  {
3548    if (!$this->options['send_http_headers'])
3549    {
3550      return;
3551    }
3552        $status = $this->options['http_protocol'].' '.$this->statusCode.' '.$this->statusText;
3553    header($status);
3554    if ($this->options['logging'])
3555    {
3556      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Send status "%s"', $status))));
3557    }
3558        if (!$this->getHttpHeader('Content-Type'))
3559    {
3560      $this->setContentType($this->options['content_type']);
3561    }
3562    foreach ($this->headers as $name => $value)
3563    {
3564      header($name.': '.$value);
3565      if ($value != '' && $this->options['logging'])
3566      {
3567        $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Send header "%s: %s"', $name, $value))));
3568      }
3569    }
3570        foreach ($this->cookies as $cookie)
3571    {
3572      setrawcookie($cookie['name'], $cookie['value'], $cookie['expire'], $cookie['path'], $cookie['domain'], $cookie['secure'], $cookie['httpOnly']);
3573      if ($this->options['logging'])
3574      {
3575        $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Send cookie "%s": "%s"', $cookie['name'], $cookie['value']))));
3576      }
3577    }
3578  }
3579  public function sendContent()
3580  {
3581    if (!$this->headerOnly)
3582    {
3583      parent::sendContent();
3584    }
3585  }
3586  public function send()
3587  {
3588    $this->sendHttpHeaders();
3589    $this->sendContent();
3590  }
3591  protected function normalizeHeaderName($name)
3592  {
3593    return preg_replace('/\-(.)/e', "'-'.strtoupper('\\1')", strtr(ucfirst(strtolower($name)), '_', '-'));
3594  }
3595  static public function getDate($timestamp, $type = 'rfc1123')
3596  {
3597    $type = strtolower($type);
3598    if ($type == 'rfc1123')
3599    {
3600      return substr(gmdate('r', $timestamp), 0, -5).'GMT';
3601    }
3602    else if ($type == 'rfc1036')
3603    {
3604      return gmdate('l, d-M-y H:i:s ', $timestamp).'GMT';
3605    }
3606    else if ($type == 'asctime')
3607    {
3608      return gmdate('D M j H:i:s', $timestamp);
3609    }
3610    else
3611    {
3612      throw new InvalidArgumentException('The second getDate() method parameter must be one of: rfc1123, rfc1036 or asctime.');
3613    }
3614  }
3615  public function addVaryHttpHeader($header)
3616  {
3617    $vary = $this->getHttpHeader('Vary');
3618    $currentHeaders = array();
3619    if ($vary)
3620    {
3621      $currentHeaders = preg_split('/\s*,\s*/', $vary);
3622    }
3623    $header = $this->normalizeHeaderName($header);
3624    if (!in_array($header, $currentHeaders))
3625    {
3626      $currentHeaders[] = $header;
3627      $this->setHttpHeader('Vary', implode(', ', $currentHeaders));
3628    }
3629  }
3630  public function addCacheControlHttpHeader($name, $value = null)
3631  {
3632    $cacheControl = $this->getHttpHeader('Cache-Control');
3633    $currentHeaders = array();
3634    if ($cacheControl)
3635    {
3636      foreach (preg_split('/\s*,\s*/', $cacheControl) as $tmp)
3637      {
3638        $tmp = explode('=', $tmp);
3639        $currentHeaders[$tmp[0]] = isset($tmp[1]) ? $tmp[1] : null;
3640      }
3641    }
3642    $currentHeaders[strtr(strtolower($name), '_', '-')] = $value;
3643    $headers = array();
3644    foreach ($currentHeaders as $key => $value)
3645    {
3646      $headers[] = $key.(null !== $value ? '='.$value : '');
3647    }
3648    $this->setHttpHeader('Cache-Control', implode(', ', $headers));
3649  }
3650  public function getHttpMetas()
3651  {
3652    return $this->httpMetas;
3653  }
3654  public function addHttpMeta($key, $value, $replace = true)
3655  {
3656    $key = $this->normalizeHeaderName($key);
3657        $this->setHttpHeader($key, $value, $replace);
3658    if (is_null($value))
3659    {
3660      unset($this->httpMetas[$key]);
3661      return;
3662    }
3663    if ('Content-Type' == $key)
3664    {
3665      $value = $this->getContentType();
3666    }
3667    elseif (!$replace)
3668    {
3669      $current = isset($this->httpMetas[$key]) ? $this->httpMetas[$key] : '';
3670      $value = ($current ? $current.', ' : '').$value;
3671    }
3672    $this->httpMetas[$key] = $value;
3673  }
3674  public function getMetas()
3675  {
3676    return $this->metas;
3677  }
3678  public function addMeta($key, $value, $replace = true, $escape = true)
3679  {
3680    $key = strtolower($key);
3681    if (is_null($value))
3682    {
3683      unset($this->metas[$key]);
3684      return;
3685    }
3686            if ($escape)
3687    {
3688      $value = htmlspecialchars($value, ENT_QUOTES, $this->options['charset']);
3689    }
3690    $current = isset($this->metas[$key]) ? $this->metas[$key] : null;
3691    if ($replace || !$current)
3692    {
3693      $this->metas[$key] = $value;
3694    }
3695  }
3696  public function getTitle()
3697  {
3698    return isset($this->metas['title']) ? $this->metas['title'] : '';
3699  }
3700  public function setTitle($title, $escape = true)
3701  {
3702    $this->addMeta('title', $title, true, $escape);
3703  }
3704  public function getPositions()
3705  {
3706    return $this->positions;
3707  }
3708  public function getStylesheets($position = self::ALL)
3709  {
3710    if (self::ALL === $position)
3711    {
3712      $stylesheets = array();
3713      foreach ($this->getPositions() as $position)
3714      {
3715        foreach ($this->stylesheets[$position] as $file => $options)
3716        {
3717          $stylesheets[$file] = $options;
3718        }
3719      }
3720      return $stylesheets;
3721    }
3722    else if (self::RAW === $position)
3723    {
3724      return $this->stylesheets;
3725    }
3726    $this->validatePosition($position);
3727    return $this->stylesheets[$position];
3728  }
3729  public function addStylesheet($file, $position = '', $options = array())
3730  {
3731    $this->validatePosition($position);
3732    $this->stylesheets[$position][$file] = $options;
3733  }
3734  public function removeStylesheet($file)
3735  {
3736    foreach ($this->getPositions() as $position)
3737    {
3738      unset($this->stylesheets[$position][$file]);
3739    }
3740  }
3741  public function getJavascripts($position = self::ALL)
3742  {
3743    if (self::ALL === $position)
3744    {
3745      $javascripts = array();
3746      foreach ($this->getPositions() as $position)
3747      {
3748        foreach ($this->javascripts[$position] as $file => $options)
3749        {
3750          $javascripts[$file] = $options;
3751        }
3752      }
3753      return $javascripts;
3754    }
3755    else if (self::RAW === $position)
3756    {
3757      return $this->javascripts;
3758    }
3759    $this->validatePosition($position);
3760    return $this->javascripts[$position];
3761  }
3762  public function addJavascript($file, $position = '', $options = array())
3763  {
3764    $this->validatePosition($position);
3765    $this->javascripts[$position][$file] = $options;
3766  }
3767  public function removeJavascript($file)
3768  {
3769    foreach ($this->getPositions() as $position)
3770    {
3771      unset($this->javascripts[$position][$file]);
3772    }
3773  }
3774  public function getSlots()
3775  {
3776    return $this->slots;
3777  }
3778  public function setSlot($name, $content)
3779  {
3780    $this->slots[$name] = $content;
3781  }
3782  public function getCookies()
3783  {
3784    return $this->cookies;
3785  }
3786  public function getHttpHeaders()
3787  {
3788    return $this->headers;
3789  }
3790  public function clearHttpHeaders()
3791  {
3792    $this->headers = array();
3793  }
3794  public function copyProperties(sfWebResponse $response)
3795  {
3796    $this->options     = $response->getOptions();
3797    $this->headers     = $response->getHttpHeaders();
3798    $this->metas       = $response->getMetas();
3799    $this->httpMetas   = $response->getHttpMetas();
3800    $this->stylesheets = $response->getStylesheets(self::RAW);
3801    $this->javascripts = $response->getJavascripts(self::RAW);
3802    $this->slots       = $response->getSlots();
3803  }
3804  public function merge(sfWebResponse $response)
3805  {
3806    foreach ($this->getPositions() as $position)
3807    {
3808      $this->javascripts[$position] = array_merge($this->getJavascripts($position), $response->getJavascripts($position));
3809      $this->stylesheets[$position] = array_merge($this->getStylesheets($position), $response->getStylesheets($position));
3810    }
3811    $this->slots = array_merge($this->getSlots(), $response->getSlots());
3812  }
3813  public function serialize()
3814  {
3815    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));
3816  }
3817  public function unserialize($serialized)
3818  {
3819    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);
3820  }
3821  protected function validatePosition($position)
3822  {
3823    if (!in_array($position, $this->positions, true))
3824    {
3825      throw new InvalidArgumentException(sprintf('The position "%s" does not exist (available positions: %s).', $position, implode(', ', $this->positions)));
3826    }
3827  }
3828  protected function fixContentType($contentType)
3829  {
3830        if (false === stripos($contentType, 'charset') && (0 === stripos($contentType, 'text/') || strlen($contentType) - 3 === strripos($contentType, 'xml')))
3831    {
3832      $contentType .= '; charset='.$this->options['charset'];
3833    }
3834        if (preg_match('/charset\s*=\s*(.+)\s*$/', $contentType, $match))
3835    {
3836      $this->options['charset'] = $match[1];
3837    }
3838    return $contentType;
3839  }
3840}
3841
3842
3843class sfSessionStorage extends sfStorage
3844{
3845  static protected
3846    $sessionIdRegenerated = false,
3847    $sessionStarted       = false;
3848  public function initialize($options = null)
3849  {
3850    $cookieDefaults = session_get_cookie_params();
3851    $options = array_merge(array(
3852      'session_name'            => 'symfony',
3853      'session_id'              => null,
3854      'auto_start'              => true,
3855      'session_cookie_lifetime' => $cookieDefaults['lifetime'],
3856      'session_cookie_path'     => $cookieDefaults['path'],
3857      'session_cookie_domain'   => $cookieDefaults['domain'],
3858      'session_cookie_secure'   => $cookieDefaults['secure'],
3859      'session_cookie_httponly' => isset($cookieDefaults['httponly']) ? $cookieDefaults['httponly'] : false,
3860      'session_cache_limiter'   => 'none',
3861    ), $options);
3862        parent::initialize($options);
3863        $sessionName = $this->options['session_name'];
3864    session_name($sessionName);
3865    if (!(boolean) ini_get('session.use_cookies') && $sessionId = $this->options['session_id'])
3866    {
3867      session_id($sessionId);
3868    }
3869    $lifetime = $this->options['session_cookie_lifetime'];
3870    $path     = $this->options['session_cookie_path'];
3871    $domain   = $this->options['session_cookie_domain'];
3872    $secure   = $this->options['session_cookie_secure'];
3873    $httpOnly = $this->options['session_cookie_httponly'];
3874    session_set_cookie_params($lifetime, $path, $domain, $secure, $httpOnly);
3875    if (!is_null($this->options['session_cache_limiter']))
3876    {
3877      session_cache_limiter($this->options['session_cache_limiter']);
3878    }
3879    if ($this->options['auto_start'] && !self::$sessionStarted)
3880    {
3881      session_start();
3882      self::$sessionStarted = true;
3883    }
3884  }
3885  public function read($key)
3886  {
3887    $retval = null;
3888    if (isset($_SESSION[$key]))
3889    {
3890      $retval = $_SESSION[$key];
3891    }
3892    return $retval;
3893  }
3894  public function remove($key)
3895  {
3896    $retval = null;
3897    if (isset($_SESSION[$key]))
3898    {
3899      $retval = $_SESSION[$key];
3900      unset($_SESSION[$key]);
3901    }
3902    return $retval;
3903  }
3904  public function write($key, $data)
3905  {
3906    $_SESSION[$key] = $data;
3907  }
3908  public function regenerate($destroy = false)
3909  {
3910    if (self::$sessionIdRegenerated)
3911    {
3912      return;
3913    }
3914        session_regenerate_id($destroy);
3915    self::$sessionIdRegenerated = true;
3916  }
3917  public function shutdown()
3918  {
3919        session_write_close();
3920  }
3921}
3922
3923
3924class sfPHPView extends sfView
3925{
3926  public function execute()
3927  {
3928  }
3929  protected function loadCoreAndStandardHelpers()
3930  {
3931    static $coreHelpersLoaded = 0;
3932    if ($coreHelpersLoaded)
3933    {
3934      return;
3935    }
3936    $coreHelpersLoaded = 1;
3937    $helpers = array_unique(array_merge(array('Helper', 'Url', 'Asset', 'Tag', 'Escaping'), sfConfig::get('sf_standard_helpers')));
3938        if (!sfConfig::get('sf_compat_10') && false !== $i = array_search('Form', $helpers))
3939    {
3940      unset($helpers[$i]);
3941    }
3942    $this->context->getConfiguration()->loadHelpers($helpers);
3943  }
3944  protected function renderFile($_sfFile)
3945  {
3946    if (sfConfig::get('sf_logging_enabled'))
3947    {
3948      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Render "%s"', $_sfFile))));
3949    }
3950    $this->loadCoreAndStandardHelpers();
3951        extract($this->attributeHolder->toArray());
3952        ob_start();
3953    ob_implicit_flush(0);
3954    require($_sfFile);
3955    return ob_get_clean();
3956  }
3957  public function getEngine()
3958  {
3959    return null;
3960  }
3961  public function configure()
3962  {
3963        $this->context->set('view_instance', $this);
3964        require($this->context->getConfigCache()->checkConfig('modules/'.$this->moduleName.'/config/view.yml'));
3965        if (!$this->directory)
3966    {
3967      $this->setDirectory($this->context->getConfiguration()->getTemplateDir($this->moduleName, $this->getTemplate()));
3968    }
3969  }
3970  protected function decorate($content)
3971  {
3972    if (sfConfig::get('sf_logging_enabled'))
3973    {
3974      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Decorate content with "%s/%s"', $this->getDecoratorDirectory(), $this->getDecoratorTemplate()))));
3975    }
3976        $attributeHolder = $this->attributeHolder;
3977    $this->attributeHolder = $this->initializeAttributeHolder(array('sf_content' => new sfOutputEscaperSafe($content)));
3978    $this->attributeHolder->set('sf_type', 'layout');
3979        $ret = $this->renderFile($this->getDecoratorDirectory().'/'.$this->getDecoratorTemplate());
3980    $this->attributeHolder = $attributeHolder;
3981    return $ret;
3982  }
3983  public function render()
3984  {
3985    $content = null;
3986    if (sfConfig::get('sf_cache'))
3987    {
3988      $viewCache = $this->context->getViewCacheManager();
3989      $uri = $this->context->getRouting()->getCurrentInternalUri();
3990      if (!is_null($uri))
3991      {
3992        list($content, $decoratorTemplate) = $viewCache->getActionCache($uri);
3993        if (!is_null($content))
3994        {
3995          $this->setDecoratorTemplate($decoratorTemplate);
3996        }
3997      }
3998    }
3999        if (is_null($content))
4000    {
4001            $this->preRenderCheck();
4002      $this->attributeHolder->set('sf_type', 'action');
4003            $content = $this->renderFile($this->getDirectory().'/'.$this->getTemplate());
4004      if (sfConfig::get('sf_cache') && !is_null($uri))
4005      {
4006        $content = $viewCache->setActionCache($uri, $content, $this->isDecorator() ? $this->getDecoratorDirectory().'/'.$this->getDecoratorTemplate() : false);
4007      }
4008    }
4009        if ($this->isDecorator())
4010    {
4011      $content = $this->decorate($content);
4012    }
4013    return $content;
4014  }
4015}
4016
4017
4018class sfOutputEscaperSafe extends ArrayIterator
4019{
4020  protected
4021    $value = null;
4022  public function __construct($value)
4023  {
4024    $this->value = $value;
4025    if (is_array($value) || is_object($value))
4026    {
4027      parent::__construct($value);
4028    }
4029  }
4030  public function __toString()
4031  {
4032    return (string) $this->value;
4033  }
4034  public function __get($key)
4035  {
4036    return $this->value->$key;
4037  }
4038  public function __set($key, $value)
4039  {
4040    $this->value->$key = $value;
4041  }
4042  public function __call($method, $arguments)
4043  {
4044    return call_user_func_array(array($this->value, $method), $arguments);
4045  }
4046  public function __isset($key)
4047  {
4048    return isset($this->value->$key);
4049  }
4050  public function __unset($key)
4051  {
4052    unset($this->value->$key);
4053  }
4054  public function getValue()
4055  {
4056    return $this->value;
4057  }
4058}
4059
Note: See TracBrowser for help on using the repository browser.