. */ /* */ /*************************************************************************************/ namespace Thelia\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\DependencyInjection\ContainerAware; use Thelia\Core\Security\SecurityContext; use Thelia\Tools\URL; use Thelia\Tools\Redirect; use Thelia\Core\Template\ParserContext; use Thelia\Core\Event\ActionEvent; use Symfony\Component\EventDispatcher\EventDispatcher; use Thelia\Core\Factory\ActionEventFactory; use Thelia\Form\BaseForm; use Thelia\Form\Exception\FormValidationException; use Symfony\Component\EventDispatcher\Event; use Thelia\Core\Event\DefaultActionEvent; /** * * The defaut administration controller. Basically, display the login form if * user is not yet logged in, or back-office home page if the user is logged in. * * @author Franck Allimant * @author Manuel Raynaud */ class BaseController extends ContainerAware { /** * Return an empty response (after an ajax request, for example) */ protected function nullResponse() { return new Response(); } /** * Dispatch a Thelia event * * @param string $eventName a TheliaEvent name, as defined in TheliaEvents class * @param Event $event the action event, or null (a DefaultActionEvent will be dispatched) */ protected function dispatch($eventName, ActionEvent $event = null) { if ($event == null) $event = new DefaultActionEvent(); $this->getDispatcher()->dispatch($eventName, $event); } /** * Return the event dispatcher, * * @return \Symfony\Component\EventDispatcher\EventDispatcher */ public function getDispatcher() { return $this->container->get('event_dispatcher'); } /** * Return the parser context, * * @return ParserContext */ protected function getParserContext() { return $this->container->get('thelia.parser.context'); } /** * Return the security context, by default in admin mode. * * @return \Thelia\Core\Security\SecurityContext */ protected function getSecurityContext() { return $this->container->get('thelia.securityContext'); } /** * @return \Symfony\Component\HttpFoundation\Request */ protected function getRequest() { return $this->container->get('request'); } /** * Returns the session from the current request * * @return \Symfony\Component\HttpFoundation\Session\SessionInterface */ protected function getSession() { $request = $this->getRequest(); return $request->getSession(); } /** * Get all errors that occured in a form * * @param \Symfony\Component\Form\Form $form * @return string the error string */ private function getErrorMessages(\Symfony\Component\Form\Form $form) { $errors = ''; foreach ($form->getErrors() as $key => $error) { $errors .= $error->getMessage() . ', '; } foreach ($form->all() as $child) { if (!$child->isValid()) { $errors .= $this->getErrorMessages($child) . ', '; } } return rtrim($errors, ', '); } /** * Validate a BaseForm * * @param BaseForm $aBaseForm the form * @param string $expectedMethod the expected method, POST or GET, or null for any of them * @throws FormValidationException is the form contains error, or the method is not the right one * @return \Symfony\Component\Form\Form Form the symfony form object */ protected function validateForm(BaseForm $aBaseForm, $expectedMethod = null) { $form = $aBaseForm->getForm(); if ($expectedMethod == null || $aBaseForm->getRequest()->isMethod($expectedMethod)) { $form->bind($aBaseForm->getRequest()); if ($form->isValid()) { return $form; } else { throw new FormValidationException(sprintf("Missing or invalid data: %s", $this->getErrorMessages($form))); } } else { throw new FormValidationException(sprintf("Wrong form method, %s expected.", $expectedMethod)); } } /** * * redirect request to the specified url * * @param string $url */ public function redirect($url) { Redirect::exec($url); } /** * If success_url param is present in request or in the provided form, redirect to this URL. * * @param BaseForm $form a base form, which may contains the success URL */ protected function redirectSuccess(BaseForm $form = null) { if ($form != null) { $url = $form->getSuccessUrl(); } else { $url = $this->getRequest()->get("success_url"); } echo "url=$url"; if (null !== $url) $this->redirect($url); } }