набросал наброски, оцените пожалуйста и если где увидили недочеты, напишите, чтоб быть в курсе дела.
| Код | session_start();
// объявим константы и создадим установки define("WORK_MODE", 0); ini_set('error_reporting', WORK_MODE? 0: E_ALL); // вывод всех ошибок, в 5.4 E_NOTICE входит в состав E_ALL ini_set("display_errors", WORK_MODE? 0: 1); ini_set("log_errors", 1); ini_set("error_log", __DIR__."/_errors.log"); ini_set("default_charset", "utf-8"); define("ROOT", $_SERVER['DOCUMENT_ROOT']);
define("DIR_APPS", __DIR__."/apps"); define("DIR_CONTROLLERS", DIR_APPS."/controllers"); define("DIR_MODELS", DIR_APPS."/models"); define("DIR_VIEWS", DIR_APPS."/views"); define("DIR_SMARTY", __DIR__."/smarty");
define("DB_HOST", "localhost"); define("DB_NAME", "volodya-nrg"); define("DB_USER", "root"); // необходим юзер, который имеет меньше прав. под рутом не рекомундуется заходить define("DB_PASS", "somepass"); define("DB_CHARSET", "UTF8");
define("NMSPC_CNTRLR", "vnrgController");
// проверим необходимые папки $aTmp = array(DIR_CONTROLLERS, DIR_MODELS, DIR_VIEWS, DIR_SMARTY);
foreach($aTmp as $val){ if(!is_dir($val)){ die("Err: not found dir '".basename($val)."'."); } } $aTmp = NULL; // проверим версию php if(version_compare(PHP_VERSION, '5.3.0', '<')) { die("Err: change php version (".PHP_VERSION.")."); }
// подключимся к базе данных try{ $pdo = new PDO( "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, DB_USER, DB_PASS, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC) ); }catch(PDOException $e){ die("Err: not connect to database."); }
// укажем как нужно грузить контроллеры когда их вызываем внутри ф-ии через __autoload spl_autoload_register(function($class_name){ $class_name = substr_count($class_name, NMSPC_CNTRLR."\\")? str_replace(NMSPC_CNTRLR."\\", "", $class_name): $class_name; $file = DIR_CONTROLLERS.'/'.$class_name.'.php';
if(file_exists($file)){ require_once($file); } }); // подсоединим Smarty, обязательно до вызовов метода текущего контроллера $file = DIR_SMARTY."/libs/Smarty.class.php";
if(!file_exists($file)){ die("Err: not found Smarty."); } else{ require_once($file); // смарти лучше создать здесь и задать параметры. Это из-за аякса. $smarty = new Smarty(); $smarty->setTemplateDir(DIR_VIEWS); $smarty->setCompileDir(DIR_SMARTY.'/templates_c'); $smarty->setCacheDir(DIR_SMARTY.'/cache'); $smarty->setConfigDir(DIR_SMARTY.'/configs'); //$smarty->debugging = true; }
// подсоединим абстрактный класс для контроллеров $file = DIR_APPS."/Controller.php";
if(!file_exists($file)){ die("Err: not found abstract Controller."); } else{ require_once($file); }
// подсоединим пользовательские ф-ии если есть $file = DIR_APPS."/functions.php";
if(file_exists($file)){ require_once($file); } $file = NULL;
// обработаем url и возьмем названия контроллера, метода, параметров и шаблона $req_uri = strtolower($_SERVER['REQUEST_URI']); $sUrl = substr_count($req_uri, "?")? substr($req_uri, 0, strpos($req_uri, "?")): $req_uri; $aUrl = explode("/", $sUrl); $preg_pattern = "/^[a-z][a-z0-9_]*$/"; // патерн для названия класса и контроллера //$preg_pattern = "/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/"; // патерн для названия класса и метода $preg_ptrn_args = "/^[a-zа-я0-9][-a-zа-я0-9_.]*$/iu"; // паттерн для аргументов метода $aDisallowedCtrlrs = array("controller"); array_shift($aUrl); // уберем первый пустой элемент $sTplName = (!empty($aUrl[0]) && preg_match($preg_pattern, $aUrl[0]) && !in_array($aUrl[0], $aDisallowedCtrlrs))? $aUrl[0]: "main"; $sControllerMethod = (!empty($aUrl[1]) && preg_match($preg_pattern, $aUrl[1]))? $aUrl[1]: "index"; $sControllerName = NMSPC_CNTRLR."\\".$sTplName; $aArgs = array($sControllerMethod); // по умолчанию первым аргументом идет название ф-ии, сделанно спец-но, т.к. подобный подход используется и в других языках программирования if(sizeof($aUrl) > 2){ for($i=2, $size = sizeof($aUrl); $i<$size; $i++){ if(isset($aUrl[$i]) && preg_match($preg_ptrn_args, $aUrl[$i])){ $aArgs[] = $aUrl[$i]; } } } // проверим наличие контроллера (объект и метод) if(!class_exists($sControllerName)){ die("Err: not found class controller."); /*header("Location: /error"); exit;*/ } if(!method_exists($sControllerName, $sControllerMethod)){ die("Err: not found class method."); /*header("Location: /error"); exit;*/ }
// проверим наличие view, лучше перед вызовом метода у класса ... из-за редиректа на страницу error if(!file_exists(DIR_VIEWS."/".$sTplName.".tpl")){ die("Err: not found tamplate (".$sTplName.".tpl)"); } // вызовем метод у контроллера, если есть аргументы, то подставим их //eval("\$aOutput = call_user_func(array(\$sControllerName, \$sControllerMethod)".(sizeof($aArgs)? ", ".implode(",", $aArgs): "").");"); $aOutput = call_user_func(array(new $sControllerName(), $sControllerMethod), $aArgs); if($aOutput === false){ die("Err: controller method return false"); }
// если это ajax-метод, то шаблон (внизу) не подставляем. выводим данные. if(substr($sControllerMethod, 0, strlen("ajax_")) == "ajax_"){ echo $aOutput; exit; } // назначим необходимые переменные для шаблона (если есть) и отобразим шаблон if(!empty($aOutput) && is_array($aOutput)){ foreach($aOutput as $key=>$val){ $smarty->assign($key, $val); } }
$smarty->display($sTplName.".tpl");
|
Добавлено через 6 минут и 38 секунд http://rghost.ru/7TrHN77Md |