/** * extract path information from a string * the string is like module|ag|methName * if module is not given (ag|methName) then we consider the current context */ function extractPath($path) { $extract = explode('|', $path); if (count($extract) == 1) { return CopixActionGroup::extractPath(CopixContext::get() . '|' . $path); } $extractMethod = explode('::', $extract[1]); if (count($extractMethod) !== 2) { trigger_error(CopixI18N::get('copix:copix.error.wrongActionGroupPath', $path), E_USER_ERROR); } $extracted->module = $extract[0] === '' ? null : $extract[0]; $extracted->actiongroup = $extractMethod[0]; $extracted->method = $extractMethod[1]; return $extracted; }
function CopixModuleFileSelector($selector) { $this->type = 'module'; $match = null; if (preg_match("/^(([_0-9a-zA-Z-]*)\\|)?(.*)\$/", $selector, $match)) { if ($match[1] != '') { $this->module = $match[2]; } $this->fileName = $match[3]; //le nom correspond à tout ce qui suit l'éventuel séparateur if ($this->module === null) { $this->module = CopixContext::get(); } $this->isValid = true; } }
/** * extrait le nom du module de la chaine, utilise le contexte pour retourner * un résultat. * @param string $from le nom formaté du fichier * @return string le nom du module, null si projet */ function getModuleUsingContext($from) { //vérifie que le nom soit sur. if (!CopixNamingConvention::isSafe($from)) { trigger_error('Invalid ' . $from . '', E_USER_ERROR); } //récupération des deux éléments. $into = explode('|', $from); //Si un élément module est demandé, retour. if (count($into) > 1) { return $into[0] !== '' ? $into[0] : null; } else { //Pas d'élément trouvé, retourne le contexte courant. return CopixContext::get(); } }
/** * Extraction du chemin à partir de l'identifiant donné(de la forme module|service::nomMethode) * Si aucun module n'est donné, on utilise le contexte courant. * @param string $pServiceIf L'identifiant du service */ protected static function _extractPath($pServiceId) { $extract = explode('|', $pServiceId); if (count($extract) == 1) { return self::_extractPath(CopixContext::get() . '|' . $pServiceId); } $extractMethod = explode('::', $extract[1]); if (count($extractMethod) !== 2) { throw new CopixServicesException('Wrong Service ID ' . $pServiceId); } $extracted = new StdClass(); $extracted->module = $extract[0] === '' ? CopixContext::get() : $extract[0]; $extracted->service = $extractMethod[0]; $extracted->method = $extractMethod[1]; return $extracted; }
/** * Tests sur les contextes */ public function testContext() { //En premier lieu, le Contexte doit être default $this->assertEquals(CopixContext::get(), 'default'); //On vérifie que l'on arrive à placer des Contextes CopixContext::push('module1'); $this->assertEquals(CopixContext::get(), 'module1'); //On vérifie que l'on pop correctement le contexte $lastContext = CopixContext::pop(); $this->assertEquals($lastContext, 'module1'); //On vérifie que le contexte est revenu à default $this->assertEquals('default', CopixContext::get()); //on vérifie que même si l'utilisateur fait n'importe quoi et pop de trop, //on indique default comme dernier contexte (ce qui est le cas) $lastContext = CopixContext::pop(); $this->assertEquals($lastContext, 'default'); //On vérifie que l'on peut poser plusieurs éléments $push = array('push1', 'push2', 'push3', 'push4'); foreach ($push as $pushMe) { CopixContext::push($pushMe); $this->assertEquals($pushMe, CopixContext::get()); } //et on vérifie que ces éléments reviennent dans le bon ordre for ($i = 0; $i < count($push); $i++) { $poped = CopixContext::pop(); $this->assertEquals($push[count($push) - ($i + 1)], $poped); } //on vérifie que l'on est bien retourné en default $this->assertEquals(CopixContext::get(), 'default'); //on repousse le tableau pour contrôler la méthode clear. foreach ($push as $pushMe) { CopixContext::push($pushMe); $this->assertEquals($pushMe, CopixContext::get()); } // On efface les contextes CopixContext::clear(); $this->assertEquals(CopixContext::get(), 'default'); }
/** * Méthode qui efface le cache de la zone * @param array $Params les paramètres de contexte pour la zone. * @return boolean si tout s'est bien passé * @access public */ function clearZone($params = array()) { $this->params = $params; //if (count ($this->_cacheParams) > 0){ if ($this->_useCache) { $module = CopixContext::get(); if ($module .= '') { $module .= '_'; } $cache =& new CopixCache($this->_makeId(), 'zones|' . $module . get_class($this)); $cache->remove(); } return true; }
/** * Instancie l'objet ActionGroup correspondant au CopixAction, et éxecute la methode adéquate. * * @param CopixAction $ObjAction décrivant la classe ActionGroup et la méthode à utiliser * @todo contrôler le fontionnement avec un type File, puis prévoir les fichiers inexistants. * @see CopixAction * @see CopixActionGroup * @see CopixActionReturn * @access private */ function _doAction($action) { //action en fonction du type de la demande. if ($action->type === COPIX_ACTION_TYPE_OBJ || $action->type === COPIX_ACTION_TYPE_MODULE) { //recherche le fichier correspondant à l'objet ActionGroup à utiliser. if ($action->file->module === null) { $action->file->module = CopixContext::get(); } $execPath = $action->file->getPath(); $nomFichier = $execPath . COPIX_ACTIONGROUP_DIR . strtolower($action->file->fileName) . COPIX_ACTIONGROUP_EXT; if (is_readable($nomFichier)) { require_once $nomFichier; } else { trigger_error(CopixI18N::get('copix:copix.error.load.actiongroup', $action->file->fileName), E_USER_ERROR); return; } //Nom des objets/méthodes à utiliser. $objName = COPIX_ACTIONGROUP_CLASSNAME . $action->file->fileName; $methName = $action->useMeth; //instance de l'objet, qui s'enregistre dans GLOBALS['COPIX']['ACTIONGROUP'] $obj =& new $objName(); //Exécution du traitement. $this->_processResult($obj->{$methName}()); } elseif ($action->type === COPIX_ACTION_TYPE_FILE) { //demande d'inclusion d'un fichier "extérieur" au framework. //UTILISER UNIQUEMENT EN CAS DE NECESSITE BIEN PARTICULIERE ET EXCEPTIONNELLE. //inclusion du fichier. require_once $action->useFile; } elseif ($action->type === COPIX_ACTION_TYPE_REDIRECT) { //redirection automatique. $this->_processResult(new CopixActionReturn(COPIX_AR_REDIRECT, $action->url)); } elseif ($action->type === COPIX_ACTION_TYPE_STATIC) { //page statiques. $this->_processResult(new CopixActionReturn(COPIX_AR_STATIC, $action->useFile, $action->more)); } elseif ($action->type === COPIX_ACTION_TYPE_ZONE) { //implémenter l'action zone. $tpl =& new CopixTpl(); $tpl->assign('TITLE_PAGE', $action->titlePage); $tpl->assign('TITLE_BAR', $action->titleBar); $tpl->assign('MAIN', CopixZone::process($action->zoneId, $action->zoneParams)); $this->_processResult(new CopixActionReturn(COPIX_AR_DISPLAY, $tpl)); } }
/** * sets the value of a parameter */ function set($id, $value) { if (($pos = strpos($id, '|')) === false) { $id = CopixContext::get() . '|' . $id; $group = CopixContext::get() . '|'; } else { $group = substr($id, 0, $pos) . '|'; } $me =& CopixConfig::instance(); $group =& $me->_getGroupConfig($group); return $group->set($id, $value); }
/** * Constructeur * @param string $selector le sélecteur Copix "module|element" */ public function __construct($selector) { $this->type = 'module'; //ok, I don't use regexp here cause it's 0,40 ms slower :-) $tab = explode('|', $selector); if (($counted = count($tab)) > 1) { $this->module = $tab[0] == '' ? "default" : $tab[0]; $this->fileName = $tab[1]; } else { if ($counted == 1) { $this->module = CopixContext::get(); $this->fileName = $tab[0]; } else { throw new Exception(_i18n('copix:copix.error.fileselector.invalidSelector', $selector)); } } $this->module = strtolower($this->module); }
/** * Retourne un objet contenant des infos sur la paramètre (propriétés : name, id * * @param string $pId Nom du paramètre, sous la forme [module|]name * @return object */ private static function _getParamInfos($pId) { if (($pos = strpos($pId, '|')) === false) { $module = CopixContext::get() . '|'; $pId = $module . $pId; } else { $module = substr($pId, 0, $pos) . '|'; } if ($module == '|') { $module = 'default|'; $pId = 'default' . $pId; } $toReturn = new StdClass(); $toReturn->module = $module; $toReturn->id = $pId; return $toReturn; }
/** * @param CopixUrl $urlorigin url à transformer */ function transformUrl($urlorigin) { $url = $urlorigin; // Attention, il faut une copie ici, pas une référence ! (PHP5 -> clone !) /* a) recupere module|desc|action -> obtient les infos pour la creation de l'url b) récupère un à un les parametres indiqués dans params à partir de CopixUrl c) remplace la valeur récupérée dans le result et supprime le paramètre de l'url d) remplace scriptname de CopixUrl par le resultat */ $module = $url->get('module'); if ($module === null) { $module = CopixContext::get(); } $desc = $url->get('desc'); if ($desc === null) { $desc = COPIX_DEFAULT_VALUE_DESC; } $action = $url->get('action'); if ($action === null) { $action = COPIX_DEFAULT_VALUE_ACTION; } $id = $module . '|' . $desc . '|' . $action; //if ($module !== null && isset ($this->scriptnameList[$module])){ // $url->scriptName = $this->scriptnameList[$module]; //} /*$_compile_createUrl = array('test1|default|default'=> array('test',true, array('annee','mois','id'), '/%1/%2/%3','')); */ if (isset($this->dataCreateUrl[$id])) { $urlinfo =& $this->dataCreateUrl[$id]; if ($urlinfo[1]) { $dturl =& $urlinfo[2]; $result = $urlinfo[3]; foreach ($dturl as $k => $param) { $result = str_replace('%' . ($k + 1), $url->get($param), $result); $url->del($param); } $url->pathInfo = $result; } else { $class = $urlinfo[2]; $method = $urlinfo[3]; $file = CopixCoordination::extractFilePath($module . '|' . $class, 'classes', '.url.php'); if ($file) { include_once $file; $obj = new $class(); $url = $obj->{$method}($url); } else { } } // rajouter le suffixe if ($urlinfo[0] != '') { $url->pathInfo .= '.' . $urlinfo[0]; } // indiquer l'entrypoint if ($urlinfo[4] != '') { $url->scriptName = $urlinfo[4]; } } $url->del('module'); $url->del('desc'); $url->del('action'); // vraiment supprimer ? return $url; }
/** * Demande le chargement de Mootools. * * @param array $pPlugins Liste de plugins à charger. */ public static function addJSFramework($pPlugins = null) { // Charge le noyau if (!isset(self::$_JSFrameworkAdded['*core*'])) { self::$_JSFrameworkAdded['*core*'] = true; // Initialise Mootools et l'identifiant de session if (!CopixAJAX::isAJAXRequest()) { // Ajoute MooTools et FirebugLite if (CopixConfig::instance()->getMode() == CopixConfig::DEVEL) { // MooTools non compressé et FirebugLite normal self::addJSLink(_resource('js/firebuglite/firebug.js'), array('id' => 'firebug_js')); self::addJSLink(_resource('js/mootools/mootools-devel.js'), array('id' => 'mootools_core_js')); } else { // MooTools compressé et FirebugLite qui ne fait rien. self::addJSLink(_resource('js/firebuglite/firebugx.js'), array('id' => 'firebug_js')); self::addJSLink(_resource('js/mootools/mootools.js'), array('id' => 'mootools_core_js')); } // Ajoute le framework JS spécifique de Copix self::addJSLink(_resource('js/copix.js'), array('id' => 'copix_js', 'charset' => 'UTF-8')); // Ajoute le code d'initialisation $urlBase = CopixUrl::get(); self::addJSCode(sprintf('Copix = new CopixClass(%s);', CopixJSON::encode(array('ajaxSessionId' => CopixAJAX::getSessionId(), 'module' => CopixContext::get(), 'urlBase' => $urlBase, 'resourceUrlBase' => CopixResource::getResourceBaseUrl($urlBase, CopixTpl::getTheme(), CopixI18N::getLang(), CopixI18N::getCountry())))), 'copixajax_init', CopixHTMLHeader::DOMREADY_ALWAYS); } } // Charge les plugins if (is_array($pPlugins)) { foreach ($pPlugins as $pluginName) { if (!isset(self::$_JSFrameworkAdded[$pluginName])) { self::$_JSFrameworkAdded[$pluginName] = true; $pluginId = 'mootools_plugin_' . $pluginName; $scriptId = $pluginId . '_js'; $stylesheetId = $pluginId . '_css'; if (file_exists(CopixUrl::getResourcePath($path = 'js/mootools/plugins/' . $pluginName . '.js'))) { self::addJSLink(_resource($path), array("id" => $scriptId)); } elseif (file_exists(CopixUrl::getResourcePath($path = 'js/mootools/plugins/' . $pluginName . '.js.php'))) { self::addJSLink(_resource($path), array("id" => $scriptId)); } else { throw new CopixException('[Mootools] Plugin ' . $pluginName . ' not found in ' . $pluginPath); } if (file_exists(CopixUrl::getResourcePath($path = 'js/mootools/css/' . $pluginName . '.css'))) { self::addCssLink(_resource($path), array("id" => $stylesheetId)); } } } } }
/** * Extraction du chemin à partir de l'identifiant donné, de la forme module|ag::methName * Si aucun module n'est donné, on utilise le contexte courant. * * @param string $pAGId Identifiant d'action que l'on souhaite exécuter * @return object Objet avec 3 propriétés : module, actiongroup et method * @throws Exception */ private static function _extractPath($pAGId) { $extract = explode('|', $pAGId); if (count($extract) == 1) { return CopixActionGroup::_extractPath(CopixContext::get() . '|' . $pAGId); } $extractMethod = explode('::', $extract[1]); if (count($extractMethod) !== 2) { throw new Exception(_i18n('copix:copix.error.wrongActionGroupPath', $pAGId)); } $extracted = new StdClass(); $extracted->module = strtolower($extract[0] === '' ? null : $extract[0]); $extracted->actiongroup = $extractMethod[0]; $extracted->method = $extractMethod[1]; return $extracted; }
/** * gets the module/desc/action parameters from the destination string. * dest is described as modules|desc|action where module & desc are optionnal. * @param string $dest the destination to parse * @see function.copixurl.php * @return assocative array where keys are module, desc and action */ function _getDest($dest) { $tabUrl = explode('|', $dest); $urlParams = array(); switch (count($tabUrl)) { case 1: $urlParams = array('module' => CopixContext::get(), 'desc' => 'default', 'action' => $tabUrl[0]); break; case 2: $urlParams = array('module' => CopixContext::get(), 'desc' => $tabUrl[0], 'action' => $tabUrl[1]); break; case 3: $urlParams = array('module' => $tabUrl[0], 'desc' => $tabUrl[1], 'action' => $tabUrl[2]); break; default: $urlParams = array(); } if ($urlParams['module'] == '' || $urlParams['module'] == null) { $urlParams['module'] = '_'; } if ($urlParams['desc'] == '' || $urlParams['desc'] == null) { $urlParams['desc'] = 'default'; } if ($urlParams['action'] == '' || $urlParams['action'] == null) { $urlParams['action'] = 'default'; } return $urlParams; }
/** * Analyse et découpe une sélecteur de ressource. * * Accepte les deux formes suivantes : * - chemin/vers/ressource.txt * - module|chemin/vers/ressource.txt * * Le '/' initial du chemin est supprimé. * * @param unknown_type $pResourcePath Sélecteur de la ressource. * @return array Tableau de la forme (chemin, nom_du_module ou null, chemin_du_module ou null) */ private static function _parseResourcePath($pResourcePath) { if (!preg_match('@^((\\w+)?\\|)?/?(.+)$@', $pResourcePath, $parts)) { throw new CopixException(_i18n("copix:copix.error.resource.invalidResource", $pResourcePath)); } list(, $modulePrefix, $moduleName, $resourcePath) = $parts; if (!empty($modulePrefix) && empty($moduleName)) { $moduleName = CopixContext::get(); } return array($resourcePath, $moduleName, empty($moduleName) ? null : CopixModule::getPath($moduleName)); }
function CopixModuleFileSelector($selector) { $this->type = 'module'; //ok, I don't use regexp here cause it's 0,40 ms slower :-) $tab = explode('|', $selector); if (($counted = count($tab)) > 1) { $this->module = $tab[0] == '' ? null : $tab[0]; $this->fileName = $tab[1]; $this->isValid = true; } else { if ($counted == 1) { $this->module = CopixContext::get(); $this->fileName = $tab[0]; $this->isValid = true; } else { $this->isValid = false; } } //we wants to check if the module name is valid, in case we got a non project demand. if ($this->isValid && $this->module !== null) { $this->isValid = CopixModule::isValid($this->module); } }
/** * gets the bundle for a given language. * @param string $bundleKey la clef du bundle * @param string $lang la langue dans laquelle on veut récupérer le bundle * @return CopixI18NBundle */ public static function getBundle($pBundleKey, $pLang) { $context = CopixContext::get(); if (isset(self::$_bundles[$context][$pBundleKey][$pLang])) { return self::$_bundles[$context][$pBundleKey][$pLang]; } $fileSelector = CopixSelectorFactory::create($pBundleKey); $s = $fileSelector->getSelector(); if (!isset(self::$_bundles[$context][$s][$pLang])) { self::$_bundles[$context][$s][$pLang] = new CopixI18NBundle($fileSelector, $pLang); self::$_bundles[$context][$pBundleKey][$pLang] = self::$_bundles[$context][$s][$pLang]; } return self::$_bundles[$context][$s][$pLang]; }
/** * Méthode qui efface le cache de la zone * @param array $pParams les paramètres de contexte pour la zone. * @return boolean si tout s'est bien passé * @access private */ protected function _clear($pParams) { $this->_params = $pParams; if ($this->_useCache) { $module = CopixContext::get(); CopixCache::clear($this->_makeId(), 'zones|' . $module . get_class($this)); } return true; }