public function testGetSpecialPart() { Request::setDelimiter('-'); $r = Request::getInstance(); $r->setUri('/news-item-1'); $this->assertEquals($r->getPart(0), 'news'); $this->assertEquals($r->getPart(1), 'item'); $this->assertEquals($r->getPart(2), '1'); }
public function createModule($object, $projectFile, $actionFile) { $lang = Lang::lang(); //prepare class name $name = Utils_String::formatClassName($object); $jsName = str_replace('_', '', $name); $runNamespace = 'app' . $jsName . 'Run'; $classNamespace = 'app' . $jsName . 'Classes'; $objectConfig = Db_Object_Config::getInstance($object); $primaryKey = $objectConfig->getPrimaryKey(); $appConfig = Registry::get('main', 'config'); $designerConfig = Config::factory(Config::File_Array, $appConfig->get('configs') . 'designer.php'); $objectFieldsConfig = $objectConfig->getFieldsConfig(false); $objectFields = array(); $searchFields = array(); $linkedObjects = array(); /* * Skip text fields */ foreach ($objectFieldsConfig as $key => $item) { if ($objectConfig->isObjectLink($key) || $objectConfig->isMultiLink($key)) { $linkedObjects[] = $objectConfig->getLinkedObject($key); } if (in_array($item['db_type'], Db_Object_Builder::$textTypes, true)) { continue; } $objectFields[] = $key; if (isset($item['is_search']) && $item['is_search']) { $searchFields[] = $key; } } $dataFields = array(); foreach ($objectConfig->getFieldsConfig(true) as $key => $item) { if (in_array($item['db_type'], Db_Object_Builder::$textTypes, true)) { continue; } $dataFields[] = $key; } array_unshift($objectFields, $primaryKey); $controllerContent = '<?php ' . "\n" . 'class Backend_' . $name . '_Controller extends Backend_Controller_Crud{' . "\n" . ' protected $_listFields = array("' . implode('","', $dataFields) . '");' . "\n" . ' protected $_canViewObjects = array("' . implode('","', $linkedObjects) . '");' . "\n" . '} '; /* * Create controller */ $controllerDir = $appConfig->get('backend_controllers') . str_replace('_', '/', $name); $this->_createControllerFile($controllerDir, $controllerContent); @chmod($controllerDir . DIRECTORY_SEPARATOR . 'Controller.php', $controllerContent, 0775); /* * Designer project */ $project = new Designer_Project(); $project->namespace = $classNamespace; $project->runnamespace = $runNamespace; /* * Project events */ $eventManager = $project->getEventManager(); $storeFields = Backend_Designer_Import::checkImportORMFields($object, $dataFields); $urlTemplates = $designerConfig->get('templates'); Request::setDelimiter($urlTemplates['urldelimiter']); $controllerUrl = Request::url(array($urlTemplates['adminpath'], $object, ''), false); $storeUrl = Request::url(array($urlTemplates['adminpath'], $object, 'list')); Request::setDelimiter($appConfig->get('urlDelimiter')); $dataStore = Ext_Factory::object('Data_Store'); $dataStore->setName('dataStore'); $dataStore->autoLoad = true; $dataStore->addFields($storeFields); $dataProxy = Ext_Factory::object('Data_Proxy_Ajax'); $dataProxy->type = 'ajax'; $dataReader = Ext_Factory::object('Data_Reader_Json'); $dataReader->root = 'data'; $dataReader->totalProperty = 'count'; $dataReader->idProperty = $primaryKey; $dataReader->type = 'json'; $dataProxy->reader = $dataReader; $dataProxy->url = $storeUrl; $dataProxy->startParam = 'pager[start]'; $dataProxy->limitParam = 'pager[limit]'; $dataProxy->sortParam = 'pager[sort]'; $dataProxy->directionParam = 'pager[dir]'; $dataProxy->simpleSortMode = true; $dataStore->proxy = $dataProxy; $dataStore->remoteSort = true; $project->addObject(0, $dataStore); /* * Data grid */ $dataGrid = Ext_Factory::object('Grid'); $dataGrid->setName('dataGrid'); $dataGrid->store = 'dataStore'; $dataGrid->columnLines = true; $dataGrid->title = $objectConfig->getTitle() . ' :: ' . $lang->HOME; $dataGrid->setAdvancedProperty('paging', true); $dataGrid->viewConfig = '{enableTextSelection: true}'; $eventManager->setEvent('dataGrid', 'itemdblclick', 'show' . $jsName . 'EditWindow(record.get("id"));'); $objectFieldList = Backend_Designer_Import::checkImportORMFields($object, $objectFields); if (!empty($objectFieldList)) { foreach ($objectFieldList as $fieldConfig) { switch ($fieldConfig->type) { case 'boolean': $column = Ext_Factory::object('Grid_Column_Boolean'); $column->renderer = 'Ext_Component_Renderer_System_Checkbox'; $column->width = 50; $column->align = 'center'; break; case 'integer': $column = Ext_Factory::object('Grid_Column'); break; case 'float': $column = Ext_Factory::object('Grid_Column_Number'); if (isset($objectFieldsConfig[$fieldConfig->name]['db_precision'])) { $column->format = '0,000.' . str_repeat('0', $objectFieldsConfig[$fieldConfig->name]['db_precision']); } break; case 'date': $column = Ext_Factory::object('Grid_Column_Date'); if ($objectFieldsConfig[$fieldConfig->name]['db_type'] == 'time') { $column->format = 'H:i:s'; } break; default: $column = Ext_Factory::object('Grid_Column'); } if ($objectConfig->fieldExists($fieldConfig->name)) { $cfg = $objectConfig->getFieldConfig($fieldConfig->name); $column->text = $cfg['title']; } else { $column->text = $fieldConfig->name; } $column->dataIndex = $fieldConfig->name; $column->setName($fieldConfig->name); $column->itemId = $column->getName(); $dataGrid->addColumn($column->getName(), $column, $parent = 0); } } $project->addObject(0, $dataGrid); /* * Top toolbar */ $dockObject = Ext_Factory::object('Docked'); $dockObject->setName($dataGrid->getName() . '__docked'); $project->addObject($dataGrid->getName(), $dockObject); $filters = Ext_Factory::object('Toolbar'); $filters->setName('filters'); $project->addObject($dockObject->getName(), $filters); /* * Top toolbar items */ $addButton = Ext_Factory::object('Button'); $addButton->setName('addButton'); $addButton->text = $lang->ADD_ITEM; $eventManager->setEvent('addButton', 'click', 'show' . $jsName . 'EditWindow(false);'); $project->addObject($filters->getName(), $addButton); $sep1 = Ext_Factory::object('Toolbar_Separator'); $sep1->setName('sep1'); $project->addObject($filters->getName(), $sep1); if (!empty($searchFields)) { $searchField = Ext_Factory::object('Component_Field_System_Searchfield'); $searchField->setName('searchField'); $searchField->width = 200; $searchField->store = $dataStore->getName(); $searchField->fieldNames = json_encode($searchFields); $fill = Ext_Factory::object('Toolbar_Fill'); $fill->setName('fill1'); $project->addObject($filters->getName(), $fill); $project->addObject($filters->getName(), $searchField); } /* * Editor window */ $editWindow = Ext_Factory::object('Component_Window_System_Crud'); $editWindow->setName('editWindow'); $editWindow->objectName = $object; $editWindow->controllerUrl = $controllerUrl; $editWindow->width = 800; $editWindow->height = 650; $editWindow->modal = true; $editWindow->resizable = true; $editWindow->extendedComponent(true); $eventManager->setEvent('editWindow', 'dataSaved', $runNamespace . '.dataStore.load();'); if (!$objectConfig->hasHistory()) { $editWindow->hideEastPanel = true; } $project->addObject(0, $editWindow); $tab = Ext_Factory::object('Panel'); $tab->setName($editWindow->getName() . '_generalTab'); $tab->frame = false; $tab->border = false; $tab->layout = 'anchor'; $tab->bodyPadding = 3; $tab->bodyCls = 'formBody'; $tab->anchor = '100%'; $tab->title = $lang->GENERAL; $tab->autoScroll = true; $tab->fieldDefaults = "{\n\t\t labelAlign: 'right',\n\t\t labelWidth: 160,\n\t\t anchor: '100%'\n\t\t }"; $project->addObject($editWindow->getName(), $tab); $objectFieldList = array_keys($objectConfig->getFieldsConfig(false)); foreach ($objectFieldList as $field) { if ($field == $primaryKey) { continue; } $newField = Backend_Designer_Import::convertOrmFieldToExtField($field, $objectConfig->getFieldConfig($field)); if ($newField === false) { continue; } $newField->setName($editWindow->getName() . '_' . $field); $fieldClass = $newField->getClass(); if ($fieldClass == 'Component_Field_System_Objectslist' || $fieldClass == 'Component_Field_System_Objectlink') { $newField->controllerUrl = $controllerUrl; } if (in_array($fieldClass, $this->tabTypes, true)) { $project->addObject($editWindow->getName(), $newField); } else { $project->addObject($tab->getName(), $newField); } } /* * Save designer project */ $designerStorage = Designer_Factory::getStorage($designerConfig); $project->actionjs = $actionFile; if (!$designerStorage->save($projectFile, $project)) { throw new Exception('Can`t create Designer project'); } /* * Create ActionJS file */ $this->_createActionJS($runNamespace, $classNamespace, $actionFile, $jsName); return true; }
public function __construct() { $this->appConfig = Registry::get('main', 'config'); $this->designerConfig = Config::factory(Config::File_Array, $this->appConfig->get('configs') . 'designer.php'); Request::setDelimiter($this->appConfig->get('urlDelimiter')); }
/** * Initialize the application, configure the settings, inject dependencies * Adjust the settings necessary for running the system */ public function init() { if ($this->_init) { return; } date_default_timezone_set($this->_config->get('timezone')); /* * Init cache connection */ $this->_initCache(); /* * Init database connection */ $conManager = $this->_initDb(); /* * Apply configs */ Filter::setDelimiter($this->_config->get('urlDelimiter')); Request::setDelimiter($this->_config->get('urlDelimiter')); Request::setExtension($this->_config->get('urlExtension')); Request::setRoot($this->_config->get('wwwroot')); Resource::setCachePaths($this->_config->get('jsCacheSysUrl'), $this->_config->get('jsCacheSysPath')); Resource::setDocRoot($this->_config->get('docroot')); Resource::setResourceRoot($this->_config->get('wwwroot')); Utils::setSalt($this->_config->get('salt')); /* * Init lang dictionary (Lazy Load) */ $lang = $this->_config->get('language'); Lang::addDictionaryLoader($lang, $this->_config->get('docroot') . '/system/lang/' . $lang . '.php', Config::File_Array); Lang::setDefaultDictionary($this->_config->get('language')); $eventManager = new Eventmanager(); if ($this->_cache) { $eventManager->setCache($this->_cache); Resource::setCache($this->_cache); Template::setCache($this->_cache); if ($this->_config->offsetExists('template_check_mtime')) { Template::checkMtime($this->_config->get('template_check_mtime')); } } /* * Prepare Db object storage */ $objectStore = new Db_Object_Store(); $objectStore->setEventManager($eventManager); $objectStore->setLinksObjectName($this->_config->get('orm_links_object')); $objectStore->setHistoryObject($this->_config->get('orm_history_object')); $objectStore->setVersionObject($this->_config->get('orm_version_object')); /* * Prepare models */ Model::setDataCache($this->_cache); Model::setGlobalHardcacheTime($this->_config->get('frontend_hardcache')); Model::setGlobalObjectStore($objectStore); Model::setDefaultDbManager($conManager); /* * Prepare Db_Object */ $translator = new Db_Object_Config_Translator($this->_config->get('lang_path') . $this->_config->get('language') . '/objects.php'); $translator->addTranslations(array($this->_config->get('lang_path') . $this->_config->get('language') . '/system_objects.php')); Db_Object_Config::setConfigPath($this->_config->get('object_configs')); Db_Object_Config::setTranslator($translator); if ($this->_config->get('db_object_error_log')) { $log = new Log_File($this->_config->get('db_object_error_log_path')); /* * Switch to Db_Object error log */ if ($this->_config->get('erorr_log_object')) { $errorModel = Model::factory($this->_config->get('erorr_log_object')); $errorTable = $errorModel->table(true); $errorDb = $errorModel->getDbConnection(); $logOrmDb = new Log_Db('db_object_error_log', $errorDb, $errorTable); $logModelDb = new Log_Db('model', $errorDb, $errorTable); Db_Object::setLog(new Log_Mixed($log, $logOrmDb)); Model::setDefaultLog(new Log_Mixed($log, $logModelDb)); $objectStore->setLog($logOrmDb); } else { Db_Object::setLog($log); Model::setDefaultLog($log); $objectStore->setLog($log); } } /* * Prepare dictionaries */ Dictionary::setConfigPath($this->_config->get('dictionary')); /* * Prepare Controllers */ Controller::setDefaultDb($this->_db); /* * Prepare Externals */ if ($this->_config->get('allow_externals')) { $this->_initExternals(); } $this->_init = true; }
/** * Get possible actions from Controller class. * Note! Code accelerator (eaccelerator, apc, xcache, etc ) should be disabled to get comment line. * Method returns only public methods that ends with "Action" * @param string $controllerName * @return array like array( * array( * 'name' => action name without "Action" postfix * 'comment'=> doc comment * ) * ) */ public static function getPossibleActions($controllerName) { $manager = new Backend_Modules_Manager(); $appCfg = Registry::get('main', 'config'); $designerConfig = Config::factory(Config::File_Array, $appCfg->get('configs') . 'designer.php'); $templates = $designerConfig->get('templates'); $reflector = new ReflectionClass($controllerName); if (!$reflector->isSubclassOf('Backend_Controller') && !$reflector->isSubclassOf('Frontend_Controller')) { return array(); } $actions = array(); $methods = $reflector->getMethods(ReflectionMethod::IS_PUBLIC); $url = array(); if ($reflector->isSubclassOf('Backend_Controller')) { $url[] = $templates['adminpath']; $url[] = $manager->getModuleName($controllerName); } elseif ($reflector->isSubclassOf('Frontend_Controller')) { if ($appCfg['frontend_router_type'] == 'module') { $module = self::_moduleByClass($controllerName); if ($module !== false) { $urlcode = Model::factory('Page')->getCodeByModule($module); if ($urlcode !== false) { $url[] = $urlcode; } } } elseif ($appCfg['frontend_router_type'] == 'path') { $paths = explode('_', str_replace(array('Frontend_'), '', $controllerName)); $pathsCount = count($paths) - 1; if ($paths[$pathsCount] === 'Controller') { $paths = array_slice($paths, 0, $pathsCount); } $url = array_merge($url, $paths); } elseif ($appCfg['frontend_router_type'] == 'config') { $urlCode = self::_moduleByClass($controllerName); if ($urlCode !== false) { $url[] = $urlCode; } } } if (!empty($methods)) { Request::setDelimiter($templates['urldelimiter']); Request::setRoot($templates['wwwroot']); foreach ($methods as $method) { if (substr($method->name, -6) !== 'Action') { continue; } $actionName = substr($method->name, 0, -6); $paths = $url; $paths[] = $actionName; $actions[] = array('name' => $actionName, 'code' => $method->name, 'url' => Request::url($paths, false), 'comment' => self::_clearDocSymbols($method->getDocComment())); } Request::setDelimiter($appCfg['urlDelimiter']); Request::setRoot($appCfg['wwwroot']); } return $actions; }