/**
  * 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');
 }
 /**
  * Agit selon le résultat de l'execution de l'action de la méthode de l'objet ActionGroup
  * Methode qui va effectuer un affichage de template, une redirection etc... en fonction
  * du code indiqué par le CopixActionReturn.
  * @param CopixActionReturn      $ToProcess   indique le type de resultat
  * @see CopixActionGroup
  * @todo rajouter une sorte de "Fin de traitement" _DoEnd / _DoFirst
  * @access private
  */
 function _processResult($toProcess)
 {
     switch ($toProcess->code) {
         case COPIX_AR_ERROR:
             //erreur
             $tpl = new CopixTpl();
             $tpl->assign('message', $toProcess->data);
             $tpl->display($this->moduleDir . COPIX_TEMPLATE_PATH . 'error.tpl');
             break;
         case COPIX_AR_DISPLAY:
             //affichage classique, dans le template principal.
             $this->_processStandard($toProcess->data);
             //appel de la méthode de préparation de la page standard.
             $this->_doHTMLHeaders($toProcess->data);
             //Par ex, bandeaux de pub, menus dynamiques, ... (propres aux projets.)
             CopixContext::clear();
             $toProcess->data->display($GLOBALS['COPIX']['CONFIG']->mainTemplate);
             break;
         case COPIX_AR_DISPLAY_IN:
             //affichage spécifique, dans un template indiqué.
             $this->_processStandard($toProcess->data);
             //appel de la méthode de préparation de la page standard.
             $this->_doHTMLHeaders($toProcess->data);
             //Par ex, bandeaux de pub, menus dynamiques, ... (propres aux projets.)
             $toProcess->data->display($toProcess->more);
             break;
         case COPIX_AR_REDIRECT:
             //redirection standard, message http.
             header('location: ' . $toProcess->data);
             break;
         case COPIX_AR_STATIC:
             $tpl =& new CopixTpl();
             $tpl->assign('MAIN', $this->includeStatic($toProcess->data));
             $this->_processStandard($tpl);
             $this->_doHTMLHeaders($tpl);
             $waitForMore = array('TITLE_PAGE', 'TITLE_BAR');
             foreach ($waitForMore as $key) {
                 if (isset($toProcess->more[$key])) {
                     $tpl->assign($key, $toProcess->more[$key]);
                 }
             }
             //Affichage dans le template principal.
             CopixContext::clear();
             $tpl->display($GLOBALS['COPIX']['CONFIG']->mainTemplate);
             break;
         case COPIX_AR_DOWNLOAD:
             $fileName = $toProcess->data;
             if (is_readable($fileName) && is_file($fileName)) {
                 //quick and dirty..... still.
                 if (strlen(trim($toProcess->more))) {
                     $fileNameOnly = $toProcess->more;
                 } else {
                     $fileNameOnly = explode('/', str_replace('\\', '/', $fileName));
                     $fileNameOnly = $fileNameOnly[count($fileNameOnly) - 1];
                 }
                 header("Content-Type: application/forcedownload");
                 header("Content-Disposition: attachment; filename=" . $fileNameOnly);
                 header("Content-Description: File Transfert");
                 header("Content-Transfer-Encoding: binary");
                 header("Pragma: no-cache");
                 header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
                 header("Expires: 0");
                 header("Content-Length: " . filesize($fileName));
                 flush();
                 readfile($fileName);
             }
             break;
         case COPIX_AR_BINARY:
             $fileName = $toProcess->data;
             //echo $fileName;
             if (is_readable($fileName) && is_file($fileName)) {
                 header("Content-Type: " . $toProcess->more);
                 header("Content-Length: " . filesize($fileName));
                 flush();
                 readfile($fileName);
             }
             break;
         case COPIX_AR_NONE:
             break;
         default:
             break;
     }
     //appel les plugins de post-processing.
     $this->_callPluginsMethodWithParam('afterProcess', $toProcess);
 }
 /**
  * Réalise les derniers traitements (généralement d'affichage ou de redirection).
  *
  * En fonction du code retour de l'action CopixActionReturn::CONST, Copix réalise
  * un certain nombre de traitements pour terminer la requête en cours.
  *
  * @param	CopixActionReturn      $pToProcess   Ce qui a été retourné par CopixActionGroup::process ()
  * @see CopixActionGroup
  */
 protected function _processResult($toProcess)
 {
     $config = CopixConfig::instance();
     //appel les plugins de post-processing.
     foreach (CopixPluginRegistry::getRegistered() as $name => $plugin) {
         $plugin->afterProcess($toProcess);
     }
     //Analyse du résultat du process
     switch ($toProcess->code) {
         case CopixActionReturn::ERROR:
             //erreur
             header("Content-Type: text/html");
             $tpl = new CopixTpl();
             if (($assignedTitlePage = $tpl->getAssigned('TITLE_PAGE')) !== null) {
                 $tpl->assign('TITLE_PAGE', '[' . _i18n('copix:common.messages.error') . ']' . $assignedTitlePage);
             } else {
                 $tpl->assign('TITLE_PAGE', '[' . _i18n('copix:common.messages.error') . ']');
             }
             $this->_processStandard($tpl);
             $tpl->assign('HTML_HEAD', '<$HTML_HEAD />');
             $tpl->assign('MAIN', $toProcess->data);
             $content = $tpl->fetch('|error.tpl');
             CopixContext::clear();
             $this->_beforeDisplay($content);
             echo $content;
             break;
         case CopixActionReturn::DISPLAY:
             $charset = CopixI18N::getCharset();
             header("Content-Type: text/html;charset=" . $charset);
             $this->_processStandard($toProcess->data);
             //appel de la méthode de préparation de la page standard.
             $toProcess->data->assign('HTML_HEAD', '<$HTML_HEAD />');
             //Par ex, bandeaux de pub, menus dynamiques, ... (propres aux projets.)
             CopixContext::clear();
             $content = $toProcess->data->fetch($config->mainTemplate);
             $this->_beforeDisplay($content);
             echo $content;
             break;
         case CopixActionReturn::DISPLAY_IN:
             $charset = CopixI18N::getCharset();
             header("Content-Type: text/html;charset=" . $charset);
             $this->_processStandard($toProcess->data);
             //appel de la méthode de préparation de la page standard.
             $toProcess->data->assign('HTML_HEAD', '<$HTML_HEAD />');
             //Par ex, bandeaux de pub, menus dynamiques, ... (propres aux projets.)
             $content = $toProcess->data->fetch($toProcess->more);
             $this->_beforeDisplay($content);
             echo $content;
             break;
         case CopixActionReturn::FILE:
         case CopixActionReturn::CONTENT:
             $contentDisposition = 'inline';
             $contentTransfertEnconding = 'binary';
             $contentType = null;
             $fileNameOnly = null;
             if ($toProcess->code == CopixActionReturn::FILE) {
                 $fileName = $toProcess->data;
                 $fileNameOnly = explode('/', str_replace('\\', '/', $fileName));
                 $fileNameOnly = $fileNameOnly[count($fileNameOnly) - 1];
             }
             if (is_array($toProcess->more)) {
                 if (isset($toProcess->more['content-disposition'])) {
                     $contentDisposition = $toProcess->more['content-disposition'];
                 }
                 if (isset($toProcess->more['filename'])) {
                     $fileNameOnly = $toProcess->more['filename'];
                 }
                 if (isset($toProcess->more['content-type'])) {
                     $contentType = $toProcess->more['content-type'];
                 }
                 if (isset($toProcess->more['content-transfer-encoding'])) {
                     $contentTransfertEnconding = $toProcess->more['content-transfer-encoding'];
                 }
             } elseif (strlen(trim($toProcess->more))) {
                 $contentType = $toProcess->more;
             }
             if ($contentType === null) {
                 $contentType = CopixMIMETypes::getFromFileName($fileNameOnly);
             }
             header("Pragma: public");
             header("Expires: 0");
             header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
             header("Cache-Control: protected", false);
             header("Content-Type: " . $contentType);
             header("Content-Disposition: " . $contentDisposition . "; filename=\"" . $fileNameOnly . "\";");
             header("Content-Transfer-Encoding: " . $contentTransfertEnconding);
             header("Content-Length: " . ($toProcess->code == CopixActionReturn::FILE ? filesize($fileName) : strlen($toProcess->data)));
             if ($toProcess->code == CopixActionReturn::FILE) {
                 readfile($fileName);
             } else {
                 echo $toProcess->data;
             }
             flush();
             break;
         case CopixActionReturn::PPO:
             $contentType = 'text/html';
             $cacheControl = false;
             $mainTemplate = $config->mainTemplate;
             $charset = CopixI18N::getCharset();
             if (is_array($toProcess->more)) {
                 $template = $toProcess->more['template'];
                 if (isset($toProcess->more['content-type'])) {
                     $contentType = $toProcess->more['content-type'];
                 }
                 if (array_key_exists('mainTemplate', $toProcess->more)) {
                     $mainTemplate = $toProcess->more['mainTemplate'];
                 }
                 if (isset($toProcess->more['charset'])) {
                     $charset = $toProcess->more['charset'];
                 }
                 if (isset($toProcess->more['cache-control'])) {
                     $cacheControl = $toProcess->more['cache-control'];
                 }
             } else {
                 $template = $toProcess->more;
             }
             $tplContent = new CopixTpl();
             $tplContent->assign('ppo', $toProcess->data);
             header("Content-Type: " . $contentType . ";charset=" . $charset);
             if ($cacheControl !== false) {
                 header('Cache-Control: ' . $cacheControl);
             }
             if ($mainTemplate !== null) {
                 $tplMain = new CopixTpl();
                 $tplMain->assign('TITLE_PAGE', isset($toProcess->data->TITLE_PAGE) ? $toProcess->data->TITLE_PAGE : null);
                 $tplMain->assign('TITLE_BAR', isset($toProcess->data->TITLE_BAR) ? $toProcess->data->TITLE_BAR : null);
                 $tplMain->assign('POPUP', isset($toProcess->data->POPUP) ? $toProcess->data->POPUP : null);
                 $tplMain->assign('MENU', isset($toProcess->data->MENU) ? $toProcess->data->MENU : null);
                 $tplMain->assign('CAN_CLOSE', isset($toProcess->data->CAN_CLOSE) ? $toProcess->data->CAN_CLOSE : null);
                 $tplMain->assign('BODY_ON_LOAD', isset($toProcess->data->BODY_ON_LOAD) ? $toProcess->data->BODY_ON_LOAD : null);
                 $tplMain->assign('BODY_ON_UNLOAD', isset($toProcess->data->BODY_ON_UNLOAD) ? $toProcess->data->BODY_ON_UNLOAD : null);
                 $tplMain->assign('MAIN', $tplContent->fetch($template));
                 $tplContent = null;
                 //on libère la mémoire
                 $tplMain->assign('ppo', $toProcess->data);
                 $this->_processStandard($tplMain);
                 $tplMain->assign('HTML_HEAD', '<$HTML_HEAD />');
                 $content = $tplMain->fetch($mainTemplate);
             } else {
                 $tplContent->assign('TITLE_PAGE', isset($toProcess->data->TITLE_PAGE) ? $toProcess->data->TITLE_PAGE : null);
                 $tplContent->assign('TITLE_BAR', isset($toProcess->data->TITLE_BAR) ? $toProcess->data->TITLE_BAR : null);
                 $tplContent->assign('BODY_ON_LOAD', isset($toProcess->data->BODY_ON_LOAD) ? $toProcess->data->BODY_ON_LOAD : null);
                 $tplContent->assign('BODY_ON_UNLOAD', isset($toProcess->data->BODY_ON_UNLOAD) ? $toProcess->data->BODY_ON_UNLOAD : null);
                 $this->_processStandard($tplContent);
                 $tplContent->assign('HTML_HEAD', '<$HTML_HEAD />');
                 $content = $tplContent->fetch($template);
             }
             CopixContext::clear();
             $this->_beforeDisplay($content);
             echo $content;
             break;
         case CopixActionReturn::REDIRECT:
             //redirection standard, message http.
             header('location: ' . $toProcess->data);
             break;
         case CopixActionReturn::HTTPCODE:
             foreach ($toProcess->data as $code) {
                 header($code);
             }
             echo $toProcess->more;
             break;
         case CopixActionReturn::NONE:
             break;
     }
     //Appel des méthodes afterDisplay des plugins
     foreach (CopixPluginRegistry::getRegistered() as $name => $plugin) {
         $plugin->afterDisplay();
     }
     session_write_close();
 }
 /**
  * Agit selon le résultat de l'execution de l'action de la méthode de l'objet ActionGroup
  * Methode qui va effectuer un affichage de template, une redirection etc... en fonction
  * du code indiqué par le CopixActionReturn.
  * @param CopixActionReturn      $ToProcess   indique le type de resultat
  * @see CopixActionGroup
  * @todo rajouter une sorte de "Fin de traitement" _DoEnd / _DoFirst
  * @access private
  */
 function _processResult($toProcess)
 {
     //ending
     switch ($toProcess->code) {
         case COPIX_AR_ERROR:
             //erreur
             header("Content-Type: text/html");
             $tpl = new CopixTpl();
             if (($assignedTitlePage = $tpl->getAssigned('TITLE_PAGE')) !== null) {
                 $tpl->assign('TITLE_PAGE', '[' . CopixI18N::get('copix:common.messages.error') . ']' . $assignedTitlePage);
             } else {
                 $tpl->assign('TITLE_PAGE', '[' . CopixI18N::get('copix:common.messages.error') . ']');
             }
             $this->_processStandard($tpl);
             $this->_doHTMLHeaders($tpl);
             $tpl->assign('MAIN', $toProcess->data);
             $content = $tpl->fetch('|error.tpl');
             CopixContext::clear();
             $this->_callPluginsMethod_beforeDisplay($content);
             echo $content;
             break;
         case COPIX_AR_DISPLAY:
             header("Content-Type: text/html");
             $this->_processStandard($toProcess->data);
             //appel de la méthode de préparation de la page standard.
             $this->_doHTMLHeaders($toProcess->data);
             //Par ex, bandeaux de pub, menus dynamiques, ... (propres aux projets.)
             CopixContext::clear();
             $content = $toProcess->data->fetch($GLOBALS['COPIX']['CONFIG']->mainTemplate);
             //$content = str_replace ('./', $GLOBALS['COPIX']['CONFIG']->significant_url_basepath, $content);
             $this->_callPluginsMethod_beforeDisplay($content);
             echo $content;
             break;
         case COPIX_AR_DISPLAY_IN:
             $this->_processStandard($toProcess->data);
             //appel de la méthode de préparation de la page standard.
             $this->_doHTMLHeaders($toProcess->data);
             //Par ex, bandeaux de pub, menus dynamiques, ... (propres aux projets.)
             $content = $toProcess->data->fetch($toProcess->more);
             $this->_callPluginsMethod_beforeDisplay($content);
             echo $content;
             break;
         case COPIX_AR_REDIRECT:
             //redirection standard, message http.
             header('location: ' . $toProcess->data);
             break;
         case COPIX_AR_STATIC:
             $tpl =& new CopixTpl();
             $tpl->assign('MAIN', $this->includeStatic($toProcess->data));
             $this->_processStandard($tpl);
             $this->_doHTMLHeaders($tpl);
             $waitForMore = array('TITLE_PAGE', 'TITLE_BAR');
             foreach ($waitForMore as $key) {
                 if (isset($toProcess->more[$key])) {
                     $tpl->assign($key, $toProcess->more[$key]);
                 }
             }
             //Affichage dans le template principal.
             CopixContext::clear();
             $content = $tpl->fetch($GLOBALS['COPIX']['CONFIG']->mainTemplate);
             $this->_callPluginsMethod_beforeDisplay($content);
             echo $content;
             break;
         case COPIX_AR_DOWNLOAD:
             $fileName = $toProcess->data;
             if (is_readable($fileName) && is_file($fileName)) {
                 //quick and dirty..... still.
                 if (strlen(trim($toProcess->more))) {
                     $fileNameOnly = $toProcess->more;
                 } else {
                     $fileNameOnly = explode('/', str_replace('\\', '/', $fileName));
                     $fileNameOnly = $fileNameOnly[count($fileNameOnly) - 1];
                 }
                 header("Content-Type: application/forcedownload");
                 header("Content-Disposition: attachment; filename=" . $fileNameOnly);
                 header("Content-Description: File Transfert");
                 header("Content-Transfer-Encoding: binary");
                 header("Pragma: no-cache");
                 header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
                 header("Expires: 0");
                 header("Content-Length: " . filesize($fileName));
                 readfile($fileName);
                 flush();
             }
             break;
         case COPIX_AR_BINARY:
             $fileName = $toProcess->data;
             //echo $fileName;
             if (is_readable($fileName) && is_file($fileName)) {
                 header("Content-Type: " . $toProcess->more);
                 header("Content-Length: " . filesize($fileName));
                 readfile($fileName);
                 flush();
             }
             break;
         case COPIX_AR_BINARY_CONTENT:
             $content = $toProcess->data;
             header("Content-Type: " . $toProcess->more);
             header("Content-Length: " . strlen($content));
             echo $content;
             flush();
             break;
         case COPIX_AR_DOWNLOAD_CONTENT:
             $content = $toProcess->data;
             header("Content-Type: application/forcedownload");
             header("Content-Disposition: attachment; filename=" . $toProcess->more);
             header("Content-Description: File Transfert");
             header("Content-Transfer-Encoding: binary");
             header("Pragma: no-cache");
             header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
             header("Expires: 0");
             header("Content-Length: " . strlen($content));
             echo $content;
             flush();
             break;
         case COPIX_AR_NONE:
             break;
         case COPIX_AR_XMLRPC:
             header("Content-Type: text/xml");
             require_once COPIX_UTILS_PATH . 'CopixXmlRpc.class.php';
             $content = CopixXmlRpc::encodeResponse($toProcess->data);
             header("Content-length: " . strlen($content));
             echo $content;
             break;
         case COPIX_AR_XMLRPC_FAULT:
             header("Content-Type: text/xml");
             require_once COPIX_UTILS_PATH . 'CopixXmlRpc.class.php';
             $content = CopixXmlRpc::encodeFaultResponse($toProcess->data[0], $toProcess->data[1]);
             header("Content-length: " . strlen($content));
             echo $content;
             break;
         default:
             trigger_error(CopixI18N::get('copix:copix.error.noActionReturn'), E_USER_ERROR);
             break;
     }
     //Calling plugins
     //appel les plugins de post-processing.
     $this->_callPluginsMethod_afterProcess($toProcess);
 }