/** * 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); }