/**
  * Création d'une instance d'un objet service
  * @param Object $pServiceDescription un objet qui décrit les composantes du service (avec les propriétés module, service, methode)
  */
 private static function _create($pServiceDescription, $pParams = array())
 {
     $serviceID = $pServiceDescription->module . '|' . $pServiceDescription->service;
     $execPath = CopixModule::getPath($pServiceDescription->module);
     $fileName = $execPath . COPIX_CLASSES_DIR . strtolower(strtolower($pServiceDescription->service)) . '.services.php';
     if (!Copix::RequireOnce($fileName)) {
         throw new CopixServicesException('Cannot load service from ' . $fileName);
     }
     //Nom des objets/méthodes à utiliser.
     $objName = 'Services' . $pServiceDescription->service;
     return new $objName($pParams);
 }
 /**
  * Récupération de la liste des DAO d'un module donné
  * @param $pModuleName le nom du module
  */
 public function _getAllDAOForModule($pModuleName)
 {
     //on va rechercher l'ensemble des fichiers DAO pour le module donné.
     $toReturn = array();
     $filePath = CopixModule::getPath($pModuleName) . 'resources/*.dao.xml';
     //$filePath = str_replace ('/', '\\', $filePath);
     if (($files = glob($filePath)) !== false) {
         foreach ($files as $fileName) {
             $className = basename($fileName, '.dao.xml');
             $toReturn[] = $pModuleName . '|' . $className;
         }
     }
     return $toReturn;
 }
 public function process($pParams)
 {
     static $_init = false;
     static $htmlPath = '';
     extract($pParams);
     //check the initialisation
     if (!$_init) {
         $path = CopixModule::getPath('htmleditor') . COPIX_CLASSES_DIR;
         $htmlPath = CopixUrl::get() . 'js/FCKeditor/';
         require_once $path . 'fckeditor.php';
         $_init = true;
     }
     if (empty($content)) {
         $content = ' ';
     }
     //name of the textarea.
     if (empty($name)) {
         throw new CopixTemplateTagException('htmleditor: missing name parameter');
     } else {
         if (!isset($width)) {
             $width = CopixConfig::get('htmleditor|width');
             //$width = '100%';
         }
         if (!isset($height)) {
             $height = CopixConfig::get('htmleditor|height');
             //$height = '450px';
         }
         /*
          * ATTENTION les éléments de config viewPhototèque etc font doublon avec la sélection de la toolbarset, mais sont nécessaire à Copix
          * Par contre si on ne les load pas, on a une erreur de FCKeditor, il faut donc supprimer ce gestionnaire d'erreur sinon on se prend un alert javascript
          * le gestionnaire en question se trouve dans "FCKToolbarItems.GetItem" (chercher cette chaîne pour le trouver) et désactiver "alert( FCKLang.UnknownToolbarItem.replace( /%1/g, itemName ) ) ;
          */
         $oFCKeditor = new FCKeditor($name);
         $oFCKeditor->BasePath = $htmlPath;
         $oFCKeditor->Value = $content;
         $oFCKeditor->ToolbarSet = 'Copix';
         $oFCKeditor->Width = $width;
         $oFCKeditor->Height = $height;
         $oFCKeditor->Config['viewPhototheque'] = CopixModule::isEnabled('pictures') ? 'true' : 'false';
         $oFCKeditor->Config['viewCmsLink'] = CopixModule::isEnabled('cms') ? 'true' : 'false';
         $oFCKeditor->Config['viewLinkPopup'] = CopixModule::isEnabled('cms') ? 'true' : 'false';
         $oFCKeditor->Config['viewDocument'] = CopixModule::isEnabled('document') ? 'true' : 'false';
         $oFCKeditor->Config['viewMailto'] = 'true';
         // Configuration de la feuille de style à utiliser.
         //$oFCKeditor->Config['EditorAreaCSS'] = CopixUrl::get ().'styles/themes/hivers/hivers.css';
         $out = $oFCKeditor->CreateHtml();
     }
     return $out;
 }
 public function _createContent(&$toReturn)
 {
     $moduleName = CopixZone::getParam('moduleName');
     $infos = CopixModule::getInformations($moduleName);
     $tpl = new CopixTpl();
     if (in_array($moduleName, CopixModule::getList())) {
         $arModule = CopixModule::getDependenciesForDelete($moduleName);
         $template = 'detailmoduledelete.tpl';
         $record = _dao('Copix:copixmodule')->get($moduleName);
         $tpl->assign('version', $record->version_cpm);
     } else {
         $arDependencies = CopixModule::getDependenciesForInstall($moduleName);
         $arModule = array();
         $arExtension = array();
         $install = true;
         foreach ($arDependencies as $key => $dependency) {
             if ($dependency->kind === 'module') {
                 if (CopixModule::testDependency($dependency)) {
                     $dependency->exists = true;
                     $dependency->isInabled = CopixModule::isEnabled($dependency->name);
                     $arModule[] = $dependency;
                 } else {
                     $dependency->exists = false;
                     $install = false;
                     $arModule[] = $dependency;
                 }
             } else {
                 if (CopixModule::testDependency($dependency)) {
                     $dependency->exists = true;
                     $arExtension[] = $dependency;
                 } else {
                     $dependency->exists = false;
                     $install = false;
                     $arExtension[] = $dependency;
                 }
             }
         }
         $tpl->assign('arExtension', $arExtension);
         $tpl->assign('install', $install);
         $template = 'detailmoduleinstall.tpl';
     }
     $tpl->assign('path', CopixModule::getPath($moduleName));
     $tpl->assign('arModule', $arModule);
     $tpl->assign('info', $infos);
     $tpl->assign('moduleName', $moduleName);
     $toReturn = $tpl->fetch($template);
     return true;
 }
 /**
  * Préparation de l'installation
  */
 public function processInstallFramework()
 {
     // find the current connection type (defined in /plugins/copixDB/profils.definition.xml)
     $config = CopixConfig::instance();
     $driver = $config->copixdb_getProfile();
     $typeDB = $driver->getDriverName();
     // Search each module install file
     $scriptName = 'prepareinstall.' . $typeDB . '.sql';
     $file = CopixModule::getPath('admin') . COPIX_INSTALL_DIR . 'scripts/' . $scriptName;
     CopixDB::getConnection()->doSQLScript($file);
     //make sure that copixmodule is reset
     CopixModule::reset();
     $tpl = new CopixTpl();
     $tpl->assignZone('MAIN', 'admin|installmodulewithdep', array('arModule' => array('generictools', 'auth', 'default', 'admin'), 'url_return' => _url('admin|database|done'), 'messageConfirm' => false));
     return _arDisplay($tpl);
 }
 /**
  * Récupération de l'ensemble des éléments testables pour un module
  * @param $pModuleName le nom du module dont on veut connaitre l'ensemble des classes de test.
  * @return tableau de clef => libelle
  */
 private function getTestableForModule($pModuleName)
 {
     $toReturn = array();
     $filePath = CopixModule::getPath($pModuleName) . 'tests/*.class.php';
     $filePath = str_replace('\\', '/', $filePath);
     if (($files = glob($filePath)) !== false) {
         foreach ($files as $fileName) {
             $className = basename($fileName, '.class.php');
             if (!isset($toReturn[$pModuleName])) {
                 $toReturn[$pModuleName] = array();
             }
             $toReturn[$pModuleName][] = $pModuleName . '|' . $className;
         }
     }
     return $toReturn;
 }
 /**
  * Récupération des modules dans l'ordre de leur description
  *
  */
 public function _getModuleOrderByDescription()
 {
     $arReturn = array();
     foreach (CopixModule::getList(true) as $module) {
         $temp = CopixModule::getInformations($module);
         $modulePath = CopixModule::getPath($module);
         if (is_dir($modulePath . COPIX_CLASSES_DIR)) {
             $servicesDir = opendir($modulePath . COPIX_CLASSES_DIR);
             while ($file = readdir($servicesDir)) {
                 if (preg_match("/class.php\$/", $file)) {
                     $temp->services[] = $file;
                 }
             }
         }
         if (isset($temp->services)) {
             $arReturn[] = $temp;
         }
     }
     return $arReturn;
 }
 /**
  * Vérifie que l'on est bien authentifié (A voir).
  */
 public function beforeAction()
 {
     $pServiceName = CopixRequest::get('wsname');
     $this->_path = CopixModule::getPath('wsserver');
     if (isset($pServiceName)) {
         $this->_wsname = $pServiceName;
         $arRes = _ioDAO('wsservices')->findBy(_daoSP()->addCondition('name_wsservices', '=', $pServiceName));
         if (count($arRes) == 0) {
             throw new CopixException('Service introuvable ' . htmlentities($pServiceName));
         }
         $wsServiceInfo = $arRes[0];
         $this->_exportModule = $wsServiceInfo->module_wsservices;
         $this->_exportClass = $wsServiceInfo->class_wsservices;
         $this->_exportClassFilename = CopixModule::getPath($this->_exportModule) . COPIX_CLASSES_DIR . strtolower($wsServiceInfo->file_wsservices);
     } else {
         $this->_exportModule = CopixConfig::get('wsserver|exportedModule');
         $this->_exportClass = CopixConfig::get('wsserver|exportedClass');
         $this->_exportClassFilename = CopixModule::getPath($this->_exportModule) . COPIX_CLASSES_DIR . strtolower(CopixConfig::get('wsserver|exportedClassFile'));
     }
 }
 /**
  * Create code highlights
  * @param _wikielement codeelement
  */
 private function _treatCode($code)
 {
     //syntaxe highlight
     $code->data = preg_replace('/\\[code(.*?)\\]/', "", $code->data);
     $code->data = preg_replace('/\\[\\/code(.*?)\\]/', "", $code->data);
     require_once CopixModule::getPath('geshi') . 'lib/geshi/geshi.php';
     $lang = $code->other;
     $code = $code->data;
     $geshi = new GeSHi($code, $lang);
     $geshi->set_header_type(GESHI_HEADER_DIV);
     $code = $geshi->parse_code();
     $code = "\n" . '<div class="wiki_code">' . $code . '</div>' . "\n";
     return $code;
 }
 public function afterInstall()
 {
     // find the current connection type (defined in /plugins/copixDB/profils.definition.xml)
     $config = CopixConfig::instance();
     $driver = $config->copixdb_getProfile();
     $typeDB = $driver->getDriverName();
     // Search each module install file
     $scriptName = 'afterinstall.' . $typeDB . '.sql';
     $file = CopixModule::getPath('admin') . COPIX_INSTALL_DIR . 'scripts/' . $scriptName;
     CopixDB::getConnection()->doSQLScript($file);
 }
 /**
  * Permet d'exporter les classes des modukes
  *
  * @return CopixActionReturn
  */
 public function processExportClass()
 {
     $pModuleName = CopixRequest::get('moduleName');
     $pClassFileName = CopixRequest::get('classFileName');
     // si on a confirmé l'ajout
     if (CopixRequest::get('confirm')) {
         $pServiceName = trim(CopixRequest::get('serviceName'));
         $pClassName = CopixRequest::get('className');
         $pClassFileName = _request('classFileName');
         $pModuleName = _request('moduleName');
         // nom de service vide
         if ($pServiceName == '') {
             return _arRedirect(_url('admin|ExportClass', array('error' => 'serviceEmpty', 'moduleName' => $pModuleName, 'classFileName' => $pClassFileName)));
         }
         // verification si on n'a pas déja un service de ce nom
         $wsservices = _ioDao('wsservices')->findBy(_daoSP()->addCondition('name_wsservices', '=', $pServiceName));
         if (count($wsservices) > 0) {
             return _arRedirect(_url('admin|ExportClass', array('error' => 'serviceExists', 'moduleName' => $pModuleName, 'classFileName' => $pClassFileName)));
         }
         CopixDB::getConnection()->doQuery("insert into wsservices (name_wsservices, module_wsservices, file_wsservices, class_wsservices) values ('" . $pServiceName . "','" . $pModuleName . "','" . $pClassFileName . "', '" . $pClassName . "')");
         $res = 'Url du Webservice  : <a href="' . _url('wsserver||', array('wsname' => $pServiceName)) . '">' . _url('wsserver||', array('wsname' => $pServiceName)) . '</a><br/>' . "\n";
         $res .= 'Url du fichier wsdl : <a href="' . _url('wsserver|default|wsdl', array('wsname' => $pServiceName)) . '">' . _url('wsserver|default|wsdl', array('wsname' => $pServiceName)) . '</a><br/>' . "\n";
         $res .= '<br />';
         $res .= '<input type="button" value="' . _i18n('wsserver.back') . '" onclick="javascript: document.location=\'' . _url('admin|manageWebServices') . '\';" />';
         $tpl = new CopixTpl();
         $tpl->assign('MAIN', $res);
         return new CopixActionReturn(CopixActionReturn::DISPLAY, $tpl);
         // si on doit afficher le formulaire d'ajout
     } else {
         $ppo = new CopixPPO();
         $ppo->TITLE_PAGE = _i18n('wsserver.title.manageWebServices');
         $ppo->classFileName = $pClassFileName;
         $ppo->arErrors = array();
         // erreur "service existant" passée en paramètre
         if (_request('error') !== null) {
             $ppo->arErrors[] = _i18n('wsserver.error.' . _request('error'));
         }
         $ppo->ModuleName = $pModuleName;
         $arBefore = get_declared_classes();
         include CopixModule::getPath($pModuleName) . COPIX_CLASSES_DIR . $pClassFileName;
         $arAfter = get_declared_classes();
         $arClass = array_diff($arAfter, $arBefore);
         sort($arClass);
         if (count($arClass) == 0) {
             throw new Exception('Pas de classe à exporter');
         }
         $ppo->arClass = $arClass;
         return _arPPO($ppo, 'wsservices.add.php');
     }
 }
 /**
  * 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));
 }
 public function testObject()
 {
     $element = new CopixSessionObject($object = _ioClass('fooclass'), CopixModule::getPath('copixtest') . 'classes/fooclass.class.php');
     $this->assertEquals($element->getSessionObject(), $object);
     $serialized = serialize($element);
     $elementBack = unserialize($serialized);
     $this->assertEquals(strtolower(get_class($elementBack->getSessionObject())), 'fooclass');
     $this->assertEquals(1, $elementBack->getParam(1));
     $this->assertEquals(array(1, 2), $elementBack->getArrayWith(1, 2));
     $elementBack->test = 2;
     $this->assertEquals($elementBack->test, 2);
     $this->assertEquals($elementBack->getSessionObject()->test, 2);
     $elementBack->notExists = 3;
     $this->assertEquals($elementBack->notExists, 3);
     $this->assertEquals($elementBack->getSessionObject()->notExists, 3);
     $elementBack->setPublicPropertyTest(4);
     $this->assertEquals($elementBack->test, 4);
     $this->assertEquals($elementBack->getSessionObject()->test, 4);
     $this->assertEquals($elementBack->getPublicPropertyTest(), 4);
     $this->assertEquals($elementBack->getSessionObject()->getPublicPropertyTest(), 4);
     $elementBack->setPrivatePropertyTest(5);
     $this->assertEquals($elementBack->getPrivatePropertyTest(), 5);
     $this->assertEquals($elementBack->getSessionObject()->getPrivatePropertyTest(), 5);
     $elementBack->setUnknownProperty('notexists', 6);
     $this->assertEquals($elementBack->getUnknownProperty('notexists'), 6);
     $this->assertEquals($elementBack->getSessionObject()->getUnknownProperty('notexists'), 6);
     $this->assertEquals($elementBack->notexists, 6);
     $this->assertEquals($elementBack->getSessionObject()->notexists, 6);
 }
 /**
  * Fonction principale du coordinateur à appeler dans le index.php pour démarrer le framework.
  * gère la cinématique globale du fonctionnement du site.
  */
 public function process()
 {
     $action = null;
     $fromDesc = true;
     //Choix des couples actions pour la tache a réaliser.
     $execParams = $this->_extractExecParam();
     //trio desc, action, module
     CopixContext::push($execParams->module);
     //détermine le chemin d'exécution.
     $path = CopixModule::getPath($execParams->module);
     // On regarde s'il existe un fichier desc.
     if (file_exists($fileName = $path . COPIX_DESC_DIR . strtolower($execParams->desc) . '.desc.php')) {
         include $fileName;
         //LAISSER INCLUDE (PAS ONCE). Php n'arrive pas a rafraichir sans cela.
         //Dans l'idée: inclusion une première fois, les variables sont connues de la fonction.
         //La deuxième fois, ne réinclus pas le fichier, et du coups les variables sont connues mais comme globales.
         // on verifie si la variable correspondante à l'action existe
         if (isset(${$execParams->action})) {
             $action = ${$execParams->action};
         }
     }
     if ($action === null) {
         $fileToRead = $path . COPIX_ACTIONGROUP_DIR . strtolower($execParams->desc) . '.actiongroup.php';
         // verification de l'existence du fichier
         $fromDesc = false;
         if (file_exists($fileToRead)) {
             $action = new CopixAction($execParams->module . '|' . $execParams->desc, $execParams->action);
         }
     }
     //Traitement de l'objet reçu.
     if ($action === null) {
         $this->_doNotExistsAction(_i18n('copix:copix.error.load.desc', $execParams->desc));
     } else {
         CopixContext::clear();
         foreach (CopixPluginRegistry::getRegistered() as $name => $plugin) {
             $plugin->beforeProcess($action);
         }
         CopixContext::push($action->file->module);
         $this->_doAction($action, $fromDesc);
     }
 }
 /**
  * Retourne la liste des plugins que l'on peut enregistrer
  * @return	array
  */
 public static function getAvailable()
 {
     $conf = CopixConfig::instance();
     $toReturn = array();
     /* TODO: arPluginsPath désactivé jusqu'à ce qu'on l'implémente vraiment, cf #151.
        //recherche des plugins dans les répertoires configurés à cet effet.
           foreach ($conf->arPluginsPath as $path){
               if (substr ($path, -1) != '/') {
                  $path .= '/';
               }
               foreach (self::_findPluginsIn ($path) as $pluginName){
                $toReturn[] = $pluginName;
               }
        }
        */
     //recherche des plugins configurés dans les répertoires de modules
     foreach (CopixModule::getList() as $moduleName) {
         foreach (self::_findPluginsIn(CopixModule::getPath($moduleName) . 'plugins/', $moduleName) as $pluginName) {
             $toReturn[] = $pluginName;
         }
     }
     return $toReturn;
 }
 /**
  * _getDeleteFile
  *
  * Return  delete.DBType.sql file for the modulePath
  * @param string $pModuleName le nom du module
  * @return le chemin du fichier sql
  * @access private
  */
 private static function _getDeleteFile($pModuleName)
 {
     if (self::_dbConfigured()) {
         // find the current connection type (defined in /plugins/copixDB/profils.definition.xml)
         $config = CopixConfig::instance();
         $driver = $config->copixdb_getProfile();
         $typeDB = $driver->getDriverName();
         // Search each module install file
         $scriptName = 'delete.' . $typeDB . '.sql';
         $SQLScriptFile = CopixModule::getPath($pModuleName) . COPIX_INSTALL_DIR . 'scripts/' . $scriptName;
         // chemin et nom du fichier de script d'install
         return is_readable($SQLScriptFile) ? $SQLScriptFile : null;
     }
     return null;
 }
 /**
  * Création d'un listener
  * @param	string	$pModule		le nom du module auquel appartient le listener que l'on souhaite créer
  * @param 	string 	$pListenerName	le nom du listener
  * @return 	CopixListener
  */
 private function _create($pModule, $pListenerName)
 {
     if (!isset($this->_listenersSingleton[$pModule][$pListenerName])) {
         Copix::RequireOnce(CopixModule::getPath($pModule) . '/' . COPIX_CLASSES_DIR . strtolower($pListenerName) . '.listener.php');
         $className = 'Listener' . $pListenerName;
         $this->_listenersSingleton[$pModule][$pListenerName] = new $className();
     }
     return $this->_listenersSingleton[$pModule][$pListenerName];
 }
 /**
  * gets the path relative to the selector
  */
 protected function _getPath($directory)
 {
     return CopixModule::getPath($this->module) . COPIX_PLUGINS_DIR . $this->pluginName . '/';
 }
 public function testModuleContext()
 {
     $modulePrefix = CopixModule::getPath('copixtest') . 'www/';
     // Attention ici on teste getResourcePath
     $this->assertEquals($modulePrefix . 'img/fr_FR/module_fr_FR.jpg', CopixUrl::getResourcePath('|img/module_fr_FR.jpg'));
     $this->assertEquals($modulePrefix . 'img/fr/module_fr.jpg', CopixUrl::getResourcePath('|img/module_fr.jpg'));
     $this->assertEquals($modulePrefix . 'img/module.jpg', CopixUrl::getResourcePath('|img/module.jpg'));
     $this->assertEquals(CopixUrl::get() . 'img/notFound.jpg', CopixUrl::getResource('|img/notFound.jpg'));
 }
 /**
  * Recherche de templates dans un module et d'extension donnée.
  *
  * Cette fonction va rechercher les templates dans le répertoire module template par défaut
  * et également dans le répertoire de surcharge dans le thème default
  * (project/modules/module_name/templates/* & project/themes/default/module_name/*)
  *
  * <code>
  * $arTemplates = CopixTpl::find ('module_name', '.dyn.tpl');
  * //recherche de plusieurs types de templates
  * $arTemplates = CopixTpl::find ('module_name', array ('.dyn.tpl', '.dyn.ptpl'));
  * //recherche avec masques
  * $arTemplates = CopixTpl::find ('module_name', '.dyn.*');
  * </code>
  *
  * @param	string	$pModuleName	le nom du module dans lequel on va chercher le template
  * @param 	mixed  	$pExtension		l'extension que l'on recherche (ou un tableau d'extensions)
  *
  * @return array Retourne un tableau contenant en clé 'modules|fichier_trouvé'  et en valeur le nom dans (tpl){*@name NOM} (ptpl)/*@name NOM si aucun nom n'est trouvé, on mets la clé
  */
 public static function find($pModuleName, $pExtension)
 {
     if (!is_array($pExtension)) {
         $pExtension = array($pExtension);
     }
     $files = array();
     foreach ($pExtension as $extension) {
         $files = array_merge($files, CopixFile::search('*' . $extension, COPIX_PROJECT_PATH . 'themes/default/' . $pModuleName . '/', false));
         $files = array_merge($files, CopixFile::search('*' . $extension, CopixModule::getPath($pModuleName) . 'templates/', false));
     }
     $arFiles = array();
     /*TODO Ajouter la gestion des ptpl*/
     foreach ($files as $key => $file) {
         $name = $pModuleName . '|' . basename($file);
         $tpl = CopixFile::read($file);
         if (substr($file, strlen($file) - 4) == 'ptpl') {
             $nom = ereg_replace('.*\\/*@name ([^\\*]+[^/]+)\\*/.*', '\\1', $tpl);
         } else {
             $nom = ereg_replace('.*{*@name ([^\\*]+[^}]+)\\*\\}.*', '\\1', $tpl);
         }
         if (strlen($nom) == strlen($tpl)) {
             $nom = $name;
         }
         $arFiles[$name] = $nom;
     }
     return $arFiles;
 }
 /**
  * Récupère l'instance de l'actiongroup donné.
  *
  * @param object $pActionGroupDescription Description de l'actiongroup dont on souhaite récupérer l'instance. Doit avoir 2 propriétés : module et actiongroup
  * @return CopixActionGroup
  * @throws Exception
  */
 public static function instance($pActionGroupDescription)
 {
     $actionGroupID = $pActionGroupDescription->module . '|' . $pActionGroupDescription->actiongroup;
     if (!isset(self::$_instances[$actionGroupID])) {
         $execPath = CopixModule::getPath($pActionGroupDescription->module);
         $fileName = $execPath . COPIX_ACTIONGROUP_DIR . strtolower(strtolower($pActionGroupDescription->actiongroup)) . '.actiongroup.php';
         if (!Copix::RequireOnce($fileName)) {
             throw new Exception(_i18n('copix:copix.error.load.actiongroup', $fileName));
         }
         // nom des objets/méthodes à utiliser.
         $objName = 'ActionGroup' . $pActionGroupDescription->actiongroup;
         self::$_instances[$actionGroupID] = new $objName();
     }
     return self::$_instances[$actionGroupID];
 }