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; }