public function execute($filterChain)
 {
     if ($this->isFirstCall() && $this->getContext()->getUser()->isAuthenticated()) {
         $profiles = $this->getContext()->getUser()->getGuardUser()->getPermissions();
         if (!count($profiles)) {
             $this->getContext()->getController()->forward('izarusAdvancedCustomize', 'forbidden');
             throw new sfStopException();
         }
         if (count($profiles) == 1) {
             AdvancedLayout::setCurrentProfile($profiles[0]->getId());
         }
         $profile = AdvancedLayout::getCurrentProfile();
         if (AdvancedLayout::isModuleAdvanced()) {
             $action = $this->getContext()->getActionName();
             if (!$profile && $action != 'selectProfile') {
                 $this->getContext()->getController()->forward('izarusAdvancedCustomize', 'selectProfile');
                 throw new sfStopException();
             } else {
                 $polymorfism = AdvancedLayout::modulePolymorfism();
                 if (!AdvancedLayout::userHasPermission()) {
                     $this->getContext()->getUser()->setAttribute('polymodule', false);
                     $this->getContext()->getController()->forward('izarusAdvancedCustomize', 'forbidden');
                     throw new sfStopException();
                 } else {
                     if ($polymorfism !== false) {
                         $this->getContext()->getUser()->setAttribute('polymodule', true);
                         $this->getContext()->getController()->forward($polymorfism['module'], $polymorfism['action']);
                         throw new sfStopException();
                     }
                 }
                 $this->getContext()->getUser()->setAttribute('polymodule', false);
             }
         }
     }
     $filterChain->execute();
 }
 public static function modulePolymorfism($route_ext = '')
 {
     if (empty($route_ext) && !AdvancedLayout::isModuleAdvanced()) {
         return false;
     }
     if (empty($route_ext)) {
         $module = sfContext::getInstance()->getModuleName();
         $action = sfContext::getInstance()->getActionName();
     } else {
         $route_ext = explode('/', $route_ext);
         if (count($route_ext) < 2) {
             return false;
         }
         $module = $route_ext[0];
         $action = $route_ext[1];
     }
     sfContext::getInstance()->getUser()->setAttribute('original_module', $module);
     sfContext::getInstance()->getUser()->setAttribute('original_action', $action);
     $layout_info = sfContext::getInstance()->getModuleDirectory() . DIRECTORY_SEPARATOR . 'config/layout.yml';
     if (file_exists($layout_info)) {
         $yaml = sfYaml::load($layout_info);
         if (!isset($yaml[$action]) && isset($yaml['index'])) {
             $action = 'index';
         }
     }
     $route = $module . '/' . $action;
     $modules_polymorfism = AdvancedLayout::getModules('', true, true);
     if (!isset($modules_polymorfism[$route])) {
         return false;
     }
     $mp = ModulesPolymorphismTable::getInstance()->findOneBySfGuardPermissionIdAndSource(AdvancedLayout::getCurrentProfile(), $route);
     if ($mp) {
         $mp_array = explode('/', $mp->getDestination());
         if ($mp->getUseDestinationTitle()) {
             sfContext::getInstance()->getUser()->setAttribute('original_action', $mp_array[1]);
         }
         if ($mp->getDestination() == $route) {
             return false;
         }
         return array('module' => $mp_array[0], 'action' => $mp_array[1], 'use_title' => $mp->getUseDestinationTitle());
     } else {
         if (isset($modules_polymorfism[$route]['polymorphism']['default'])) {
             if (isset($modules_polymorfism[$route]['polymorphism']['global']) && $modules_polymorfism[$route]['polymorphism']['global'] == 'true') {
                 $global = explode('/', $modules_polymorfism[$route]['polymorphism']['default']);
                 return array('module' => $global[0], 'action' => $global[1], 'use_title' => false);
             }
             return array('module' => $module, 'action' => $modules_polymorfism[$route]['polymorphism']['default'], 'use_title' => false);
         }
     }
     return false;
 }