Дмитрий Сергеевич (axshavan) wrote,
Дмитрий Сергеевич
axshavan

Axcore


Движок написан на PHP5 и работает на СУБД MySQL какой-нибудь типа третьей версии - к этому делу он не требователен. Там нет ни одного объекта, но мне ничего не стоит перевести его на объектную основу. Он очень похож на Мисатин "Бало", но, как мне думается, неммного поизящнее и помощнее. Конечно, там еще нет никакой админки. Да вообще ничего нет фактически, голое ядро да пара тестовых файликов. Внутренне оно (ядро движка) выглядит так:
1,69 КБ
Самый главный файл - это, как становится понятно, kernel.php. Его полный текст я даже могу привести:
< ?

$_SESSION['execution_allowed'] = true;

require('system/init.php');
require('system/common.php');
require('system/user.php');
require('system/template.php');
require('system/engine.php');

db_connect();
user_getid();
$_SESSION['user_name'] = user_getname();
getpath();
user_access();
$_SESSION['branch'] = get_branchinfo();
get_layout();
for($i = 0; $i < count($_SESSION['scripts']); $i++)
{
	$_SESSION['current_script_id'] = $i;
	script_prepare($_SESSION['scripts'][$i]['name']);
	script_execute($_SESSION['scripts'][$i]['name']);
}

db_disconnect();
echo fetch_layout();
unset($_SESSION);

? >
Теперь сразу все понятно. Все функции находятся в тех вон инклюживаемых файлах, вся инфа складируется в $_SESSION. Не знаю, чревато ли это какими-нибудь замедлениями в работе движка, но если да, то мне не составит труда все переделать в другой массив или в свойства объекта.
В папке layouts лежат основные шаблоны, в которых перечислены подключаемые скрипты (за слово layout спасибо Мисате). Подключаемые скрипты лежат, соответственно, в папке scripts, а используемые в них пользовательские функции в папке functions. Потом еще появятся папки.
Замечательная, как мне кажется, особенность Акскора (в чем он значительно превосходит "Бало" по юзабельности) в том, что в любой скрипт можно подключить любые функции, и не надо заботиться о разделении на компоненты. Точнее, ничего подключать не надо - движок запарсит подключаемый скрипт и, согласно соглашению об именах, найдет сам используемые функции и их сам подключит. Еще дополнительное преимущество - в устройстве виртуального дерева, точнее, в способе нахождения пути в нем. Существуют ветки с "любым" именем - они помечаются в БД как ветки с именем * (как у Мисаты в "Бало", опять же), но при этом могут на том же уровне существовать ветки с определенным названием. У каждой ветки есть свой лэйаут и свой главный скрипт (который может и не выполняться или вообще его может не быть - зависит от лэйаута). Лэйаут - HTML-верстка с подключаемыми кое-где скриптами (подключается очень просто: {script name="myscript.php"}). Скрипты, выполняясь, могут отдавать назад (а могут и не отдавать) куски текста, которые формируются из шаблонов (темплейтов) и вставляются на соответствующие места в лэйауте.

Про шаблоны.


В "Бало" используется процессор шаблонов Smarty. Я решил сделать свой парсер шаблонов сам, и это стало самой сложной частью движка. Две недели я ходил и думал, как бы так его сделать поизящнее? Во многом мне помог своими идеями опять же Мисата. Вообще, он во многом мне помог, и если ему понравится эта моя разработка, это будет для меня лучшей похвалой (конечно, лучшей похвалой была бы похвала супруги, но она в веб-разработке ничего не понимает).
ПХП это просто ужасающий меня своими возможностями инструмент, обязанный ими, кажется, STD библиотеке или чему-то подобному. Короче, можно сделать вот такую штуку:
function parse_tpl($text)
{
	$text = parse_vars($text);
	$_tags = array();
	preg_match_all('`\{[\s\r\n]*([\w_]+)([\d]*)[\s\r\n]*\(([\s\S^\)]*)\)[\s\r\n]*\}([\s\S]*)\{/\1\2\}`U', $text, $_tags, PREG_SET_ORDER);
	for($i = 0; $i < count($_tags); $i++)
	{
		$tagfunction = 'tag_'.$_tags[$i][1];
		$text = str_replace($_tags[$i][0], $tagfunction($_tags[$i][3], $_tags[$i][4], $_tags[$i][2]), $text);
	}
	return $text;
}
И так все и работает. Таким образом я могу совершенно спокойно сочинять новые тэги и писать для них функциональную логику, не затрагивая все остальное. Уфф. Ну вроде нахвастался вдоволь. Осталось дописать функции для тэга {if}...{/if}, и можно будет сказать, что какая-нибудь там преальфабетаверсия кандидата на релиз готова.
Tags: web
Subscribe

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 6 comments