<?php
require_once 'config.php';
require_once LIB_PATH.'/db.php';
require_once LIB_PATH.'/view.php';
/**
* Главная функция приложения. Вызывает необходимый контроллер, выполняет требуемое действие и с помощью объекта View выводит результат.
*
* @param string $ctl_name Имя контроллера
* @param string $action Действие
* @param string $method Метод запроса (POST|GET)
* @param array $data Параметры запроса
* @param string $file Имяч файла, из которго вызывается функция.
*
*/
function main($ctl_name, $action, $method, $data, $file)
{
// Первым делом — обработка исключений!
/* путь к скрипту от корня ФС */
$full_root = dirname($_SERVER['SCRIPT_FILENAME']);
/* путь к текущей папке от DOCCUMENT_ROOT */
$root = strtr(dirname($_SERVER['PHP_SELF']), '\\', '/');
$dir_uri = 'http://'.$_SERVER['HTTP_HOST'].rtrim($root, '/\\');
/* Удаление лишних слешей */
if (get_magic_quotes_gpc())
{
foreach ($data as $k => $v)
{
$data[$k] = stripslashes($v);
}
}
$db = new DB();
$db->connect(DB_HOST, DB_NAME, DB_USER, DB_PASS) or die("Error connecting to database");
$view = new View($full_root);
$objects = Array(
'db' => $db,
'dir_uri' => $dir_uri
);
/* Вызов контроллера */
$ctl_class = $ctl_name.'_Ctl';
$ctl_file = strtolower($ctl_class).'.php';
require_once LIB_PATH.'/'.$ctl_file;
$ctl = new $ctl_class($objects);
$action_method = "action_$action";
if (!method_exists($ctl, $action_method))
{
die("Internal error.");
}
// ставим шаблон по ум-ю вида контроллер-действие.tpl
$ctl->template = strtolower($ctl_name).'-'.strtolower($action).".tpl";
$ctl->$action_method($method, $data);
$viewdata = $ctl->getViewData();
/* Дополнительные переменные, вроде имени скрипта, выбранного контроллера, и т. д.*/
$viewdata['global'] = Array(
'ctl' => $ctl_name,
'action'=> $action,
'file' => $file,
'root' => $root,
'title' => $ctl->getTitle()
);
/* вывод шаблона */
$view->display($ctl->getTemplate(), $viewdata);
}
set_error_handler(create_function('$c, $m, $f, $l', 'if ($c === E_NOTICE) {echo 'This is notice: '.$m} else {throw new MyException($m, $c, $f, $l);}'), E_ALL);
function sMVCHandlePHPError($type, $msg, $file,$line)
{
// Здесь можно добавить backtrace, error_log и пропуск нотисов
//~ if ($c === E_NOTICE)
//~ {
//~ echo 'This is notice: '.$m
//~ }
//~ else
throw new MyException($msg, $type, $file, $line);
}
/** Класс для преобразования PHP-ошибок в исключения */
class MyException extends Exception
{
public function __construct($message, $errorLevel = 0, $errorFile = '', $errorLine = 0)
{
parent::__construct($message, $errorLevel);
$this->file = $errorFile;
$this->line = $errorLine;
}
}
?>