wrapper
Guest
Ну это не самая елегантная частьАвтор оригинала: Alexandre
wrapper
чисто технический вопрос:
каким образом осуществляется
и как часто?
над остальным я просто буду думать
Все идет в 2-а этапа:
1) Парсится xml (делаю это DOMXML функциями)
И создается обьект ProjectDescriptor который содержит всю информацию по приложению для данной роли (anonymous, user, admin...)
PHP:
class ConfigParser {
/**
*
* @access public
* @return ProjectDescriptor
**/
function getProjectDescriptor($role) {
$dom = @domxml_open_file($GLOBALS['PCOF']['CONFIGURATION_FILE_PATH']);
if($dom == null) {
Engine::raiseFatalError(new Error("Unable to parse configuration file"));
}
$project = $dom->document_element();
$projectDescriptor = new ProjectDescriptor();
//Get roles
$rolesNodeList = $project->child_nodes();
foreach($rolesNodeList as $rolesNode) {
if(($rolesNode->node_type() == XML_ELEMENT_NODE) && ($rolesNode->node_name() == "roles")) {
if($role == null) {
$role = $GLOBALS['PCOF']['PCOF_DEFAULT_ROLE'];
}
if($role == null) {
Engine::raiseFatalError(new Error("Bad configuration. Unable to resolve role.<br>No role was found in session and no role was defined as default in configuration"));
}
$roleNodeList = $rolesNode->child_nodes();
foreach($roleNodeList as $roleNode) {
if(($roleNode->node_type() == XML_ELEMENT_NODE) && ($roleNode->node_name() == "role")) {
if($roleNode->get_attribute("id") == $role) {
$roleDescriptor = new RoleDescriptor();
$roleDescriptor->id = $roleNode->get_attribute("id");
$projectDescriptor->role = $roleDescriptor;
}
}
}
}
}
//...
}
Код:
class ConfigCompiler {
/**
*
* @access public
* @return void
* @param role - string, role of user (defined in configuration.xml). f.e.: anonymous, user, admin
* Creates php file
**/
function compile($projectDescriptor) {
$role = $projectDescriptor->role->id;
$handle = @fopen ($GLOBALS['PCOF']['CONFIG_COMPILER_DIR'].$role.".php", "w");
fwrite($handle, "<? \r\n");
fwrite($handle, "global \$projectDescriptor; \r\n");
fwrite($handle, "\$projectDescriptor = new ProjectDescriptor();\r\n");
fwrite($handle, "\r\n//Init Role\r\n");
fwrite($handle, "\$roleDescriptor = new RoleDescriptor();\r\n");
fwrite($handle, "\$roleDescriptor->id=\"".$projectDescriptor->role->id."\";\r\n");
//...
ConfigCompiler::saveCompilationTime();
}
//...
}
Каждый раз сверяю timestamp-ы редактирования конфига и последней компиляции. При желании можно эту проверку убрать и запускать компиляцию ручками. Тогда и тормозной DOMXML на хостинге не нужен, можно просто закачивать их туда скомпиленные.
2 Ямерт
Velocity поддерживает много логических конструкций так что уж если кто захочет то запихнет туда что угодно
Разве что в базу может не полезешь