/** * Récupère le flux RSS à partir d'une URL. * Utilise MagpieRss http://magpierss.sourceforge.net/ */ public function getRss($url, $nbMax = -1) { $arFeeds = array(); // Test and Create rss temp_dir $cachePath = COPIX_CACHE_PATH . 'fluxrss/'; $cacheTestFile = 'rss.txt'; if (!file_exists($cachePath . $cacheTestFile)) { require_once COPIX_UTILS_PATH . 'CopixFile.class.php'; $objectWriter = new CopixFile(); $objectWriter->write($cachePath . $cacheTestFile, date('Y/m/d H:i')); } // Use Magpie to parse current RSS file define('MAGPIE_CACHE_DIR', COPIX_CACHE_PATH . 'rss'); require_once 'rss_fetch.inc'; $rss = fetch_rss($url); if ($rss) { if ($nbMax > 0) { $arFeeds = array_slice($rss->items, 0, intval($nbMax)); } else { $arFeeds = $rss->items; } } foreach ($arFeeds as $key => $Feed) { //print_r($Feed); if (isset($Feed['dc']['date'])) { $currentDate = @parse_w3cdtf($Feed['dc']['date']); // Ok with dotclear that uses w3c date format //var_dump($currentDate); } else { $currentDate = -1; } if ($currentDate != -1) { $Feed['dc']['datecopix'] = date("Ymd", $currentDate); if (!isset($Feed['date_timestamp'])) { $Feed['date_timestamp'] = $currentDate; } } else { if (isset($Feed['date_timestamp'])) { // Ok with b2evolution that uses timestamp format $Feed['dc']['datecopix'] = date('Ymd', $Feed['date_timestamp']); } else { $Feed['dc']['datecopix'] = null; $Feed['date_timestamp'] = null; } } //var_dump($Feed); //die(); $arFeeds[$key] = $Feed; } return $arFeeds; }
/** * Indique si le fichier de configuration est modifiable * @return boolean */ public function isWritable() { if (!file_exists($this->getPath())) { return CopixFile::write($this->getPath(), '<?php $_log_profiles = array (); ?>'); } return is_writable($this->getPath()); }
/** * Set the data mode * @param string $dataset_name * @param strong $mode "static" or "db" */ public function setDataMode($mode = "static", $dataset = null, $connectionName = null) { if (empty($dataset) && $mode == "db") { throw new Exception("No dataset given for CopixBayesian datas used with database"); } $this->dataset = "bayesiantable_" . $dataset; $this->mode = $mode == "db" ? "db" : "static"; //get tables if ($this->mode == "db") { $this->connectionName = $connectionName; $ct = CopixDB::getConnection($connectionName); if (!in_array($this->dataset, $ct->getTableList())) { if ($ct instanceof CopixDBConnectionMySQL || $ct instanceof CopixDBConnectionPDO_MySQL) { $sql = CopixFile::read(dirname(__FILE__) . "/../install/template_scripts/install.pdo_mysql.sql"); } elseif ($ct instanceof CopixDBConnectionPDO_SQLite) { $sql = CopixFile::read(dirname(__FILE__) . "/../install/template_scripts/install.pdo_sqlite.sql"); } elseif ($ct instanceof CopixDBConnectionPDO_PgSQL) { $sql = CopixFile::read(dirname(__FILE__) . "/../install/template_scripts/install.pdo_pgsql.sql"); } else { //throw new CopixException("Data type: ".get_class($ct)." not currently supported"); } $sql = str_replace('%TABLENAME%', $this->dataset, $sql); _doQuery($sql, array(), $connectionName); } } }
/** * Indique si le fichier de configuration est modifiable * @return boolean */ public function isWritable() { if (!file_exists($this->getPath())) { return CopixFile::write($this->getPath(), '<?php $_' . $this->_handlerType . '_handlers = array (); ?>'); } return is_writable($this->getPath()); }
/** * Rendu HTML de l'élément * * @return unknown */ public function render() { $path = COPIX_CACHE_PATH . "/graphviz/"; CopixFile::createDir($path); $md5 = md5(stripslashes($this->code)); $this->hash = $md5; $file = $md5 . ".png"; if (!file_exists($path . $file)) { $this->_render($file); } return $file; }
public function testSimpleRTFTemplate() { $template = CopixClassesFactory::create('genericTools|RTFTemplate'); $template->assign('VARIABLE_1', 'Voici une belle présentation <b>avec des infos importantes</b> ', true); $template->assign('VARIABLE_2', '<ul><li>puce 1</li><li>puce 2</li><li>puce 3</li></ul>', true); $template->assign('VARIABLE_3', 'Contenu simple', true); $codeDuDocumentRTFFinal = $template->fetch('generictools|rtftest.rtf'); $selector = CopixSelectorFactory::create('generictools|rtftest.expectedresult.rtf'); $expectedResultFilePath = $selector->getPath(COPIX_TEMPLATES_DIR) . $selector->fileName; $codeDuDocumentRTFTest = file_get_contents($expectedResultFilePath); CopixFile::write('/tmp/document_sortie.rtf', $codeDuDocumentRTFFinal); $this->assertEquals($codeDuDocumentRTFFinal, $codeDuDocumentRTFTest); }
public function testOtherFunctions() { $this->assertEquals(CopixFile::extractFileExt('file.ext'), '.ext'); $this->assertEquals(CopixFile::extractFileExt('filenoext'), null); $this->assertEquals(CopixFile::extractFileName('/chemin/pour/geraldc/'), 'geraldc'); }
/** * Génération du DAO * @param string $pFullyQualifiedDAO l'identifiant du DAO complet */ private static function _generateDAO($pFullyQualifiedDAO, $pConnectionName) { Copix::RequireOnce(COPIX_PATH . 'dao/CopixDAOGenerator.class.php'); $generator = new CopixDAOGenerator(self::_getDAODefinitionBuilder($pFullyQualifiedDAO, $pConnectionName)->getDefinition()); // génération des classes PHP correspondant à la définition de la DAO CopixFile::write(CopixDAOFactory::_getCompiledPath($pFullyQualifiedDAO), $generator->getPHPCode()); }
/** * Extrait des informations de l'ensemble des fichiers module.xml des modules installés. * * @param string $pCacheKey Clef pour la mise en cache. * @param string $pXPath Expression XPath de sélection des * @param callback $pParserCallback * @return mixed La valeur retournée par $pParserCallback. */ public static function getParsedModuleInformation($pCacheKey, $pXPath, $pParserCallback) { if (!is_callable($pParserCallback)) { $final = ''; if (is_array($pParserCallback)) { foreach ($pParserCallback as $name) { $final .= $name; } } throw new Exception("getParsedModuleInformation: {$final} should be callable"); } $config = CopixConfig::instance(); $force_compile = $config->force_compile; $compile_check = $config->compile_check; //var_dump($force_compile, $compile_check); if (!isset(self::$_registryCache[$pCacheKey])) { $cacheFile = self::_getRegistryCacheFile($pCacheKey); $must_compile = !file_exists($cacheFile) || $force_compile; if (!$must_compile && $compile_check) { // Test les fichiers si compile_check est vrai _log("Vérification du cache pour {$pCacheKey} ({$cacheFile})", "registry", CopixLog::NOTICE); $cacheDate = filemtime($cacheFile); foreach (self::getList(true) as $moduleName) { $descriptorPath = self::getPath($moduleName) . 'module.xml'; if (filemtime($descriptorPath) > $cacheDate) { _log("{$descriptorPath} est plus récent que {$cacheFile}", "registry", CopixLog::NOTICE); $must_compile = true; break; } } } if ($must_compile) { _log("Génération du cache pour {$pCacheKey} ({$cacheFile})", "registry", CopixLog::NOTICE); // Liste les modules $nodes = array(); foreach (self::getList(true) as $moduleName) { $xml = simplexml_load_file(self::getPath($moduleName) . 'module.xml'); // Extrait les infos $moduleNodes = $xml->xpath($pXPath); // N'ajoute dans la liste que si on trouve quelque chose if (is_array($moduleNodes) && count($moduleNodes) > 0) { $nodes[$moduleName] = $xml->xpath($pXPath); } } // Compile le tout self::$_registryCache[$pCacheKey] = call_user_func($pParserCallback, $nodes); // Ecrit le cache CopixFile::write($cacheFile, serialize(self::$_registryCache[$pCacheKey])); } else { _log("Chargement du cache pour {$pCacheKey} ({$cacheFile})", "registry", CopixLog::NOTICE); self::$_registryCache[$pCacheKey] = unserialize(CopixFile::read($cacheFile)); } } return self::$_registryCache[$pCacheKey]; }
/** * Affiche un contenu dans un div et avec des infos sur le fichier appelant * * @param string $pContent Contenu à afficher. */ private static function _outputFormatted(&$pContent) { if (!headers_sent()) { @header("Content-Type: text/html;charset=UTF-8"); } echo '<div style="border: solid #CC0000 1px; color: black; padding: 5px; text-align: left; cursor: default; align: left; background-color: white; whitespace: preserve; overflow: auto">'; $caller = self::getCaller(); list($prefix, $file) = CopixFile::getCopixPathPrefix($caller['file']); if ($prefix) { $file = $prefix . DIRECTORY_SEPARATOR . $file; } echo '<div style="width:100%; background-color:#CC0000; color: white; padding-top: 5px; padding-bottom: 5px; margin-bottom: 5px; font-weight: bold; text-align: center;">'; printf("From %s, line %d :", htmlentities($file), $caller['line']); echo '</div>'; echo '<pre>'; echo $pContent; echo '</pre>'; echo '</div>'; }
/** * Supression des éléments du cache * Si $pId = null tout le type (ou sous-type) passé en paramètre du constructeur est vidé * * @param string $pId Identifiant de l'élément à supprimer * @param string $pType Type de cache * @param array $pExtra Paramètres supplémentaires */ public function clear($pId, $pType, $pExtra) { if ($pId !== null) { $fileName = $this->_makeFileName($pId, $pType, $pExtra); if (is_readable($fileName)) { unlink($this->_makeFileName($pId, $pType, $pExtra)); } } else { if (file_exists(COPIX_CACHE_PATH . self::_getDir($pExtra) . $this->_getDirectory($pType, $pExtra))) { CopixFile::removeDir(COPIX_CACHE_PATH . self::_getDir($pExtra) . $this->_getDirectory($pType, $pExtra) . '/'); } } }
/** * 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; }
/** * Charge la configuration d'un plugin. * * S'il n'existe pas de configuration par défaut, renvoie null. Sinon: * * Cherche le fichier de configuration dans var/config/plugins/MODULE/PLUGIN.plugin.conf.php. * Si le fichier n'existe pas il est crée avec un contenu par défaut. * * @param string $pluginName Sélecteur du plugin. * @return mixed L'objet configuration ou NULL si le plugin n'a pas de configuration. */ private static function _loadConfig($pluginName) { $fic = new CopixModuleFileSelector($pluginName); $nom = strtolower($fic->fileName); $config_class = "PluginConfig" . $fic->fileName; // Vérifie la présence d'une configuration "old school" $old_config_path = $fic->getPath(COPIX_PLUGINS_DIR) . $nom . '/' . $nom . '.plugin.conf.php'; if (file_exists($old_config_path)) { // Ce plugin utilise l'ancien système de configuration _log($pluginName . " utilise un fichier de configuration dans les sources !", "plugin", CopixLog::WARNING); Copix::RequireOnce($old_config_path); $config = new $config_class(); return $config; } // Vérifie la présence d'une configuration par défaut $default_config_path = self::_getDefaultConfigPath($pluginName); $default_config_class = "PluginDefaultConfig" . $fic->fileName; if (!file_exists($default_config_path)) { // Pas de configuration return null; } // Cherche la configuration actuelle $config_path = $fic->getOverloadedPath(COPIX_VAR_PATH . 'config/plugins/') . $nom . '.plugin.conf.php'; if (!file_exists($config_path)) { // Génère une configuration par défaut _log($pluginName . ": création de la configuration par défaut ({$config_path})", "plugin"); CopixFile::write($config_path, "<?php\n" . "CopixPluginRegistry::requireDefaultConfig('{$pluginName}');\n" . "class {$config_class} extends {$default_config_class} {\n" . "\t// Surchargez la configuration ici.\n" . "}\n" . "?>"); } // Charge la configuration Copix::RequireOnce($config_path); $config = new $config_class(); return $config; }
/** * Ecriture du code PHP pour les listeners. * @param array $pEventsInfo Tableau des informations sur les événements (qui écoute quoi) */ private function _writePHPCode($pEventsInfos) { $generator = new CopixPHPGenerator(); $_resources = $generator->getPHPTags($generator->getVariableDeclaration('$eventList', $pEventsInfos)); //writing the PHP code to the disk CopixFile::write($this->_compiledFileName(), $_resources); }
/** * Traite un fichier de module. * * Si le type MIME du fichier est l'un de ceux pour lesquels on procède à la résolution * de {copixresource}, on vérifie si une version cachée existe. * * @param string $pFilePath Chemin complet du ficher. * @param string $pMIMEType Type MIME du fichier. * @return string Chemin complet du fichier à envoyer. */ private function _processModuleFile($pFilePath, $pMIMEType) { // Seuls certains types MIME sont traités if (!in_array($pMIMEType, self::$_processedMimeTypes)) { return $pFilePath; } // Récupère la config $config = $this->_getCopixConfig(); // Calcule le chemin du fichier en cache $cacheKey = array(COPIX_TEMP_PATH . 'resources/'); $cacheKey[] = $this->_module; $cacheKey[] = $this->_theme; if ($config->i18n_path_enabled) { $cacheKey[] = $this->_country; $cacheKey[] = $this->_lang; } $cacheKey[] = preg_replace('@[/\\x5c]@', '_', $this->_path); $cacheFile = join('_', $cacheKey); // Vérifie le fichier caché if ($config->force_compile || !file_exists($cacheFile) || ($config->compile_check || filemtime($pFilePath) > filemtime($cacheFile))) { // Génère le fichier de cache en remplaçant tous les tags CopixFile::write($cacheFile, preg_replace_callback('@\\{\\s*copixresource\\s+path=(["\'])(((\\w+)?\\|)?/?(.+))\\1\\s*}@i', array($this, '_replaceCopixresource'), CopixFile::read($pFilePath))); } // On envoie le fichier caché return $cacheFile; }
/** * Pour vider le répertoire temp * */ public function clearTemp() { CopixFile::removeFileFromPath(COPIX_TEMP_PATH, false, array($this, '_tempFileFilter')); }
public function uncompress($filename, $path = null) { $zip = zip_open($filename); if ($zip) { $buf = array(); while ($zip_entry = zip_read($zip)) { $entry = new _zip_entry(); $entry->name = zip_entry_name($zip_entry); $entry->realsize = zip_entry_filesize($zip_entry); $entry->size = zip_entry_compressedsize($zip_entry); $entry->method = zip_entry_compressionmethod($zip_entry); if (zip_entry_open($zip, $zip_entry, "r")) { $entry->buffer = zip_entry_read($zip_entry, $entry->realsize); zip_entry_close($zip_entry); $buf[] = $entry; } } zip_close($zip); } //return the _zip_zntry struct if not path given to save to... if (!$path) { return $buf; } //else... uncompress to pathx foreach ($buf as $file) { $file->name = "/" . $file->name; if (!CopixFile::write($path . $file->name, $file->buffer)) { return false; } } return true; }
/** * Loads the resources for a given lang/country. * will automatically loads the default (lang lang) * @param string $lang the language * @param string $country the country */ private function _loadLocales($lang, $country) { $this->_loadedCountries[] = $country; //file names for different cases. $bundleLang = $this->_fic->fileName . '_' . $lang . '.properties'; $bundleCountry = $this->_fic->fileName . '_' . $lang . '_' . $country . '.properties'; $path = $this->_fic->getPath(COPIX_RESOURCES_DIR); $toLoad[] = array('file' => $path . $this->_fic->fileName . '.properties', 'lang' => 'default', 'country' => 'DEFAULT'); $toLoad[] = array('file' => $path . $bundleLang, 'lang' => $lang, 'country' => strtoupper($lang)); $toLoad[] = array('file' => $path . $bundleCountry, 'lang' => $lang, 'country' => $country); // check if we have a compiled version of the ressources $_compileResourceId = $this->_getCompileId($lang, $country); if (($_compileResourceIdTime = @filemtime($_compileResourceId)) !== false) { $config = CopixConfig::instance(); if ($config->compile_check || $config->force_compile) { if ($config->force_compile) { //force compile, compiled files are never assumed to be ok. $okcompile = false; } else { // on verifie que les fichiers de ressources sont plus anciens que la version compilée $compiledate = $_compileResourceIdTime; $okcompile = true; //Compiled files are assumed to be ok. foreach ($toLoad as $infos) { if (($fileTime = @filemtime($infos['file'])) !== false) { if (!isset($fileTime) || $fileTime > $compiledate) { $okcompile = false; break; } } } } } else { //no compile check, it's ok then $okcompile = true; } if ($okcompile) { $_loaded = array(); include $_compileResourceId; //va charger _loaded $this->_messages[$country] = $_loaded; //everything was loaded. return; } } //loads the founded resources. foreach ($toLoad as $infos) { $this->_loadResources($infos['file'], $country); } //we want to use the PHP compilation of the resources. $generator = new CopixPHPGenerator(); $_resources = $generator->getPHPTags($generator->getVariableDeclaration('$_loaded', isset($this->_messages[$country]) ? $this->_messages[$country] : array())); CopixFile::write($_compileResourceId, $_resources); }
/** * Retourne le bon type MIME en fonction d'un nom de fichier * @param string $pFileName le nom du fichier à tester * @return string */ public static function getFromFileName($pFileName) { return self::getFromExtension(CopixFile::extractFileExt($pFileName)); }
/** * Sauvegarde la valeur des paramètres dans un fichier PHP * @return void */ private function _writeInPHPCache() { $generator = new CopixPHPGenerator(); $_resources = $generator->getPHPTags($generator->getVariableDeclaration('$_load', $this->_values)); CopixFile::write($this->_getCompiledFileName(), $_resources); }
/** * Reconstruit le fichier COPIX_CLASSPATHS_FILE. * * Nécessite les droits d'écriture dans COPIX_CLASSPATHS_FILE. Cette opération est réservée aux développeurs de Copix. */ public function build() { // Vérifie qu'on ait ce qu'il faut if (!is_writable(COPIX_CLASSPATHS_FILE)) { throw new Exception("Impossible d'écrire dans " . COPIX_CLASSPATHS_FILE); } // Récupère la liste des fichiers $files = CopixFile::findFiles(array_keys($this->basePaths), array($this, '_classFileFilter'), array($this, '_classDirFilter')); // Effectue une "évaluation" des fichiers pour y trouver des classes/interfaces potentielles $this->preParse($files); // Met en place notre autoloader maison $autoloader = array($this, 'autoload'); spl_autoload_register($autoloader); // Charge tout foreach ($files as $file) { include_once $file; } // Supprime l'autoloader maison spl_autoload_unregister($autoloader); // Récupère toutes les classes et interfaces $classes = array_merge(get_declared_classes(), get_declared_interfaces()); // Filtre celles de copix $classes = array_filter($classes, array($this, '_classNameFilter')); // Genère le fichier classpath $classPathCode = "<?php\n"; $classPathCode .= "/** Chemins des classes.\n"; $classPathCode .= " * Ce fichier est généré par CopixClassPathBuilder, ne pas le modifier !\n"; $classPathCode .= " * NE JAMAIS LE SUPPRIMER NON PLUS !\n"; $classPathCode .= " * Dernière génération le " . date("Y-m-d H:i:s") . "\n"; $classPathCode .= "*/\n"; $classPathCode .= " return array(\n"; sort($classes); foreach ($classes as $class) { $reflection = new ReflectionClass($class); $fileName = $reflection->getFileName(); if (isset($this->fileIncludes[$fileName])) { $classPathCode .= sprintf("\t'%s' => %s,\n", strtolower($class), $this->fileIncludes[$fileName]); } } $classPathCode .= ");\n"; $classPathCode .= "?>"; // Ecrit le fichier CopixFile::write(COPIX_CLASSPATHS_FILE, $classPathCode); }