/** * Предиспетчер * * @return void */ public function preDispatch() { /** * Инициализируем класс материалов сайта и определяем текущий модуль */ $this->Resource = new Phorm_Resource(null); if (isset($this->_params['moduleid'])) { $this->Resource->setModuleid($this->_params['moduleid']); } if (isset($this->_params['resourceid']) && ($this->ResourceInfo = $this->Resource->getResourceInfo($this->_params['resourceid']))) { $this->Resource->setModuleid($this->ResourceInfo['moduleid']); } /** * Проверяем существование MVC-ресурса (проще всего это сделать через ACl-таблицу пользователя) * Если запись есть, то делаем перенаправление на соответствующий Action */ if (isset($this->_usersession->UserData['acl']['mvc']['control'][$this->Resource->getModuleid()][$this->_params['action']])) { return $this->_forward($this->_params['action'], $this->Resource->getModuleid(), null, array('controller' => $this->Resource->getModuleid(), 'action' => $this->_params['action'], 'isfwd' => true)); /** * В противном случае работаем с текущим контроллером */ } else { if ($this->ModuleInfo = $this->Resource->getModuleInfo($this->Resource->getModuleid())) { $this->view->assign('ModuleInfo', $this->ModuleInfo); } elseif (!in_array($this->_params['action'], array('index', 'generate'))) { return $this->composeErrorMessage('Материал с указанным Id не найден'); } } }
/** * Matches a user submitted path with parts defined by a map. Assigns and * returns an array of variables on a successful match. * * @param string $path Path used to match against this routing map * @return array|false An array of assigned values or a false on a mismatch */ public function match($path, $partial = false) { $params = array(); $Mvc = new Phorm_Mvc(); // Проверяем существование идентификатора материала в пути // @todo Сделать возможность конфигурирования паттернов урлов материалов if (preg_match("#^(/.*?)(/([а-яa-z0-9_-]+)\\.html)?\$#iu", $path, $pathinfo)) { // Если мы получили идентификатор материала, то устанавливаем CategoriesController if (isset($pathinfo[3])) { $params["module"] = "default"; $params["controller"] = "categories"; $params["action"] = "index"; $params["resourceid"] = $pathinfo[3]; $params["categorypath"] = $pathinfo[1] == "/" ? "/" : $pathinfo[1] . "/"; $params["categorypath"] = $pathinfo[1] == "/" ? "/" : $pathinfo[1] . "/"; // Иначе получаем модуль, контроллер и действие из родительского math } else { $params = parent::match($path, $partial); // Проверяем существование MVC-ресурса в базе if ($params['mvcinfo'] = $Mvc->getMvcInfo($params)) { $params['WidgetSetId'] = $params['mvcinfo']['widgetssetid']; //print_r($params); return $params; // Если MVC-ресурс не найден, то устанавливаем CategoriesController } else { $params["module"] = "default"; $params["controller"] = "categories"; $params["action"] = "index"; $params["categorypath"] = preg_match("#/\$#", $pathinfo[1]) ? $pathinfo[1] : $pathinfo[1] . "/"; } } } // После всех экзекуций у нас должны остаться только ресурсы для CategoriesControllerа $Categories = new Phorm_Categories(); $Categories->setModule($params["module"]); // Проверяем существование раздела if ($CategoryInfo = $Categories->getCategoryInfoByPath($params["categorypath"])) { $params["categoryinfo"] = $CategoryInfo; $params["WidgetSetId"] = $CategoryInfo["widgetssetid"]; // Если мы на главной странице раздела и есть материал для замещения, то переопределяем идентификатор материала if (!isset($params["resourceid"]) && $CategoryInfo["mainresourceid"] > 0) { $params["resourceid"] = $CategoryInfo["mainresourceid"]; } // Проверяем существование материала в текущем разделе и модуле по его идентификатору if (isset($params["resourceid"])) { $Resource = new Phorm_Resource(); $Resource->setModule($params["module"]); $options = array("categoryid" => $CategoryInfo["categoryid"], "moduleid" => $CategoryInfo["moduleid"]); if ($ResourceInfo = $Resource->getResourceInfo($params["resourceid"], $options)) { $params["module"] = "default"; $params["controller"] = $CategoryInfo["modulecontroller"]; $params["action"] = "view"; $params["resourceinfo"] = $ResourceInfo; $params["mvcinfo"] = $Mvc->getMvcInfo($params); $params["WidgetSetId"] = $ResourceInfo["widgetssetid"]; //print_r($params); return $params; } } else { $params["mvcinfo"] = $Mvc->getMvcInfo($params); //print_r($params); return $params; } } // Все, что не смогло вернуться выше, попадает в ErrorController notfoundAction $params["module"] = "default"; $params["controller"] = "error"; $params["action"] = "notfound"; $params["mvcinfo"] = $Mvc->getMvcInfo($params); $params["WidgetSetId"] = $params["mvcinfo"]["widgetssetid"]; return $params; }