/** * Cette fonction permet l'initialisation de la variable de session * * @access static * @author koéZionCMS * @version 0.1 - 20/04/2012 * @version 0.2 - 31/07/2012 - Suppression de la récupération des données de la variable de session par un fichier * @version 0.3 - 09/11/2012 - Rajout du test pour savoir si les classes Inflector et Set sont chargées */ static function init() { if (!class_exists('Inflector')) { require_once CAKEPHP . DS . 'inflector.php'; } if (!class_exists('Set')) { require_once CAKEPHP . DS . 'set.php'; } $sessionName = Inflector::variable(Inflector::slug('koeZion ' . $_SERVER['HTTP_HOST'])); //Récupération du nom de la variable de session //Récupération des configuration du coeur de l'application pour détermine le mode de stockage des variables de sessions //Soit on utilise le comportement natif de PHP //Soit on stocke les sessions en local dans le dossier TMP require_once LIBS . DS . 'config_magik.php'; $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'core.ini', true, false); $coreConfs = $cfg->keys_values(); if (isset($coreConfs['local_storage_session']) && $coreConfs['local_storage_session']) { ini_set('session.save_path', TMP . DS . 'sessions'); } ini_set('session.use_trans_sid', 0); //Evite de passe l'id de la session dans l'url session_name($sessionName); //On affecte le nom session_start(); //On démarre la session }
/** * Constructeur de la classe * * @access public * @author koéZionCMS * @version 0.1 - 06/20/2011 by FI * @version 0.2 - 02/03/2012 by FI - Modification de la récupération des configurations, on passe maintenant par un fichier .ini * @version 0.3 - 18/04/2012 by FI - Modification de la récupération du .ini il n'y a plus de section */ function init($file) { require_once LIBS . DS . 'config_magik.php'; //Import de la librairie de gestion des fichiers de configuration $cfg = new ConfigMagik($file, true, true); //Création d'une instance $conf = $cfg->keys_values(CURRENT_WEBSITE_ID); //Récupération des configurations en fonction du nom de domaine $this->smtpHost = isset($conf['smtp_host']) ? $conf['smtp_host'] : ''; $this->smtpPort = isset($conf['smtp_port']) ? $conf['smtp_port'] : ''; $this->smtpUserName = isset($conf['smtp_user_name']) ? $conf['smtp_user_name'] : ''; $this->smtpPassword = isset($conf['smtp_password']) ? $conf['smtp_password'] : ''; $this->mailSetFromEmail = isset($conf['mail_set_from_email']) ? $conf['mail_set_from_email'] : ''; //Récupération du mail de l'expéditeur $this->mailSetFromName = isset($conf['mail_set_from_name']) ? $conf['mail_set_from_name'] : ''; //Récupération du nom de l'expéditeur $this->bccEmail = isset($conf['bcc_email']) ? $conf['bcc_email'] : ''; //Récupération de la copie require_once SWIFTMAILER . DS . 'swift_required.php'; //Inclusion de la librairie d'envoi de mails //Si les paramètres sont bien renseignés if (!empty($this->smtpHost) && !empty($this->smtpPort) && !empty($this->smtpUserName) && !empty($this->smtpPassword)) { ////////////////////// // HACK 1AND1 // //A tester pour voir si cela fonction sur l'ensemble de leurs mutualisés //Pour le moment testé sur les serveurs dédiés clé en main if (substr_count($_SERVER['DOCUMENT_ROOT'], '/kunden/')) { $transport = Swift_MailTransport::newInstance(); $this->mailer = Swift_Mailer::newInstance($transport); //Création d'une nouvelle instance de mail } else { if (isset($conf['smtp_secure']) && $conf['smtp_secure']) { $encryption = 'ssl'; } else { $encryption = null; } //Définition du transport smtp $transport = Swift_SmtpTransport::newInstance()->setHost($this->smtpHost)->setPort($this->smtpPort)->setEncryption($encryption)->setUsername($this->smtpUserName)->setPassword($this->smtpPassword); //Mot de passe $this->mailer = Swift_Mailer::newInstance($transport); //Création d'une nouvelle instance de mail } } }
<?php //ini_set( 'magic_quotes_gpc', 0 ); //Récupération de la configuration du coeur require_once LIBS . DS . 'config_magik.php'; $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'core.ini', true, false); $coreConfs = $cfg->keys_values(); //////////////////// // TIMEZONE // if (!isset($coreConfs['date_default_timezone']) || empty($coreConfs['date_default_timezone'])) { date_default_timezone_set('Europe/Paris'); } else { date_default_timezone_set($coreConfs['date_default_timezone']); } //Sinon le timezone saisi en backoffice /////////////////////////////// // GESTION DES ERREURS // //--> http://www.ficgs.com/Comment-montrer-les-erreur-PHP-f1805.html if (!isset($coreConfs['display_php_error'])) { //Si la données n'est pas dans la liste (Cas pour d'anciennes versions) $httpHost = $_SERVER["HTTP_HOST"]; if ($httpHost == 'localhost' || $httpHost == '127.0.0.1') { $displayErrors = 1; } else { $displayErrors = 0; } } else { $displayErrors = $coreConfs['display_php_error']; } ini_set('display_errors', $displayErrors); //Affichage ou non des erreurs
if (isset($_POST['section']) && !empty($_POST['section'])) { $section = $_POST['section']; unset($_POST['section']); } else { $httpHost = $_SERVER["HTTP_HOST"]; if ($httpHost == 'localhost' || $httpHost == '127.0.0.1') { $section = 'localhost'; } else { $section = 'online'; } } require_once LIBS . DS . 'config_magik.php'; //Import de la librairie de gestion des fichiers de configuration $cfg = new ConfigMagik(CONFIGS_FILES . DS . 'database.ini', true, true); //Création d'une instance, si le fichier database.ini n'existe pas il sera créé $conf = $cfg->keys_values($section); //On va procéder à l'import require_once INSTALL_FUNCTIONS . DS . 'database.php'; //Inclusion des fonctions de paramétrage de la base de données $start = 1; $foffset = 0; $totalqueries = 0; $init_db_tables = init_db($conf['host'], $conf['database'], $conf['login'], $conf['password'], "database_datas", $start, $foffset, $totalqueries); ?> <div id="right"> <div id="main"> <div class="box"> <div class="title"> <h2>IMPORT DES DONNEES DANS LES TABLES</h2> </div>
/** * Cette fonction va insérer dans le fichier de log les différentes erreurs rencontrées * * @param varchar $message Message à insérer dans les logs * @access public * @author koéZionCMS * @version 0.1 - 23/12/2011 */ public function error($message) { require_once LIBS . DS . 'config_magik.php'; $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'core.ini', true, false); $coreConfs = $cfg->keys_values(); if ($coreConfs['log_php']) { //Rajout le 02/04/2013 $date = date('Y-m-d'); $traceSql = date('Y-m-d H:i:s') . "|#|" . $message . "|#|" . $this->request->url . "\n"; FileAndDir::put(TMP . DS . 'logs' . DS . 'php' . DS . 'e404_' . $date . '.log', $traceSql, FILE_APPEND); } $url = Router::url('e404'); $url .= "?e404=" . $this->request->url; Session::write('redirectMessage', $message); header("Location: " . $url); die; }
<?php echo $helpers['Form']->input('publication_date', _('Date de publication'), array("class" => "datepicker", "placeholder" => "dd.mm.yy", 'tooltip' => "Indiquez la date à laquelle cet article sera publié")); ?> <p style="padding:0 20px 0 20px;margin-bottom:5px"><?php echo _("Cette option vous permet de définir la date à laquelle sera publié l'article en utilisant une tâche"); ?> <a href="http://fr.wikipedia.org/wiki/Cron" target="_blank">CRON</a></p> <p style="padding:0 20px 0 20px;margin-bottom:5px"><?php echo _("Vous pouvez utiliser des services CRON gratuits comme par exemple"); ?> <a href="http://www.cronoo.com/" target="_blank">Cronoo</a></p> <?php $websiteUrl = Session::read('Backoffice.Websites.details.' . CURRENT_WEBSITE_ID . '.url'); require_once LIBS . DS . 'config_magik.php'; $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'security_code.ini', true, false); $updateCode = $cfg->keys_values(); if (empty($updateCode['security_code'])) { ?> <p style="padding:0 20px 0 20px;margin-bottom:5px"><?php echo _("Pour utiliser cette fonctionnalité vous devez en premier lieu"); ?> <a href="<?php echo Router::url('backoffice/configs/security_code_liste'); ?> "><?php echo _("paramétrer le code de sécurité"); ?> </a> <?php echo _("utilisé pour pouvoir lancer cette procédure"); ?> </p><?php
* * KoéZionCMS : PHP OPENSOURCE CMS (http://www.koezion-cms.com) * Copyright KoéZionCMS * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * * @copyright KoéZionCMS * @link http://www.koezion-cms.com * @version 0.1 - 09/03/2012 by FI */ require_once LIBS . DS . 'config_magik.php'; //Import de la librairie de gestion des fichiers de configuration $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'routes.ini', true, false); //Création d'une instance $routesConfigs = $cfg->keys_values(); //Récupération des configurations //On va créer une constante pour stocker la valeur par défaut du préfixe lors de l'ajout d'un post define('POST_PREFIX', $routesConfigs['posts_prefix_singular']); // Définition des différents préfixes de l'application // Ici le préfixe backoffice et identifié par le mot renseigné dans le fichiers de configuration .ini Router::prefix($routesConfigs['backoffice_prefix'], 'backoffice'); //Définition du prefixe backoffice // Définition des différentes routes de l'application // // Son fonctionnement est le suivant : // - A gauche l'url voulue // - A droite l'url renseignée dans les vues //////////////////////////// // REGLES FRONTOFFICE // Router::connect('', 'home/index');
/** * Cette fonction permet l'affichage de la liste des éléments * * @access public * @author koéZionCMS * @version 0.1 - 17/01/2012 by FI * @version 0.2 - 03/10/2014 by FI - Correction erreur surcharge de la fonction, rajout de tous les paramètres */ public function backoffice_index($return = false, $fields = null, $order = null, $conditions = null) { ////////////////////////////////////////////////////// // RECUPERATION DES CONFIGURATIONS DES ARTICLES // require_once LIBS . DS . 'config_magik.php'; //Import de la librairie de gestion des fichiers de configuration des posts $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'posts.ini', false, false); //Création d'une instance $postsConfigs = $cfg->keys_values(); if ($postsConfigs['order'] == 'modified') { $order = 'category_id ASC, modified DESC'; } else { if ($postsConfigs['order'] == 'created') { $order = 'category_id ASC, created_by ASC'; } else { if ($postsConfigs['order'] == 'order_by') { $order = 'category_id ASC, order_by ASC'; } } } $this->set('postsOrder', $postsConfigs['order']); $datas = parent::backoffice_index(true, null, $order); $posts = array(); foreach ($datas['posts'] as $k => $v) { $posts[$v['category_id']][] = $v; } $datas['posts'] = $posts; $this->set($datas); }
/** * Cette fonction permet la connexion au backoffice * * @access public * @author koéZionCMS * @version 0.1 - 27/01/2012 by FI * @version 0.2 - 20/04/2012 by FI - Gestion des messages d'erreurs * @version 0.3 - 05/06/2012 by FI - Gestion de la connexion utilisateurs avec vérification des sites autorisés * @version 0.4 - 11/07/2012 by FI - Mise en fonction privée de la récupération des sites Internet * @version 0.5 - 02/03/2013 by FI - Modification de la gestion du role de l'utilisateur, donnée provenant maintenant de la table des groupes * @version 0.6 - 16/04/2013 by FI - Mise en place de la récupération dynamique de la route pour l'interface d'administration * @version 0.7 - 17/10/2014 by FI - Suppression du contrôle du mot de passe pour une utilisation locale * @version 0.8 - 04/06/2015 by FI - Correction récupération des données lors de l'utilisation d'un site sécurisé */ function login() { $this->layout = 'connect'; //Définition du layout if ($this->request->data) { $data = $this->request->data; //Mise en variable des données postées require_once LIBS . DS . 'config_magik.php'; $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'core.ini', true, false); $coreConfs = $cfg->keys_values(); if ($coreConfs['hash_password']) { $data['password'] = sha1($data['password']); } //Cryptage du mot de passe //Récupération du login et du mot de passe dans des variables $postLogin = $data['login']; $postPassword = $data['password']; //Récupération de l'utilisateur $user = $this->User->findFirst(array('conditions' => array('login' => $postLogin))); //Si on récupère un utilisateur if (!empty($user)) { //Récupération des données de l'utilisateur dans des variables $bddPassword = $user['password']; $bddOnline = $user['online']; //En local on peut éviter la saisie des mots de passe $httpHost = $_SERVER["HTTP_HOST"]; $checkPassword = true; //Par défaut on check le password if (!isset($coreConfs['check_password_local'])) { $coreConfs['check_password_local'] = 0; } //Petit contrôle au cas ou le paramètre de cette conf ne soit pas renseigné if (($httpHost == 'localhost' || $httpHost == '127.0.0.1') && !$coreConfs['check_password_local']) { $checkPassword = false; } $passwordOk = true; //Par défaut la password est bon if ($checkPassword) { $passwordOk = $postPassword == $bddPassword; } //Sauf, éventuellement, si on souhaite le contrôle //On va contrôler que le mot de passe saisi soit identique à celui en base de données if ($passwordOk) { //Ensuite on contrôle que cet utilisateur à bien le droit de se connecter au backoffice if ($bddOnline) { //Récupération du groupe de cet utilisateur pour en connaître le role //1 --> ADMINISTRATEUR BACKOFFICE (SUPERADMIN) //2 --> UTILISATEUR BACKOFFICE (ADMINISTRATEUR DE SITE, REDACTEURS, ETC...) //3 --> UTILISATEUR FRONTOFFICE (UTILISATEUR INTRANET, CLIENT, PAGE PRIVEES) $this->load_model('UsersGroup'); $usersGroup = $this->UsersGroup->findFirst(array('conditions' => array('id' => $user['users_group_id']))); $bddRole = $usersGroup['role_id']; //Mise en place de la récupération dynamique de la route pour l'interface d'administration require_once LIBS . DS . 'config_magik.php'; //Import de la librairie de gestion des fichiers de configuration $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'routes.ini', true, false); //Création d'une instance $routesConfigs = $cfg->keys_values(); //Récupération des configurations //ADMINISTRATEUR BACKOFFICE// if ($bddRole == 1) { $session = array('User' => $user, 'UsersGroup' => $usersGroup, 'Websites' => $this->_init_websites_datas()); //GESTION DU PLUGIN ACLS// $session = $this->_check_acls_plugin($user, $session); //GESTION DU PLUGIN LOCALIZATION// $session = $this->_check_localization_plugin($session); ////////////////////////////////////////// // DEFINITION DE L'URL DE LA HOME // if (isset($usersGroup['default_home']) && !empty($usersGroup['default_home'])) { $redirectUrl = $usersGroup['default_home']; } else { if (isset($coreConfs['backoffice_home_page']) && !empty($coreConfs['backoffice_home_page'])) { $redirectUrl = $coreConfs['backoffice_home_page']; } else { $redirectUrl = $routesConfigs['backoffice_prefix']; } } Session::write('Backoffice', $session); //On insère dans la variable de session les données de l'utilisateur $this->redirect($redirectUrl); //On redirige vers la page d'accueil du backoffice //UTILISATEUR BACKOFFICE// } else { if ($bddRole == 2) { //Récupération des sites auxquels l'utilisateurs peut se connecter Via son groupe $this->load_model('UsersGroupsWebsite'); //Chargement du modèle $usersGroupsWebsites = $this->UsersGroupsWebsite->find(array('conditions' => array('users_group_id' => $user['users_group_id']))); //Récupération des sites auxquels l'utilisateurs peut se connecter Via l'utilisateur $this->load_model('UsersWebsite'); //Chargement du modèle $usersWebsites = $this->UsersWebsite->find(array('conditions' => array('user_id' => $user['id']))); $websitesList = array(); foreach ($usersGroupsWebsites as $k => $v) { $websitesList[] = $v['website_id']; } foreach ($usersWebsites as $k => $v) { $websitesList[] = $v['website_id']; } //On check qu'il y ait au moins un site if (count($websitesList) > 0) { //$usersGroupsWebsitesList = array(); //foreach($usersGroupsWebsites as $k => $v) { $usersGroupsWebsitesList[] = $v['website_id']; } $session = array('User' => $user, 'UsersGroup' => $usersGroup, 'Websites' => $this->_init_websites_datas(array('conditions' => 'id IN (' . implode(',', $websitesList) . ')'))); //GESTION DU PLUGIN ACLS// $session = $this->_check_acls_plugin($user, $session); //GESTION DU PLUGIN LOCALIZATION// $session = $this->_check_localization_plugin($session); ////////////////////////////////////////// // DEFINITION DE L'URL DE LA HOME // if (isset($usersGroup['default_home']) && !empty($usersGroup['default_home'])) { $redirectUrl = $usersGroup['default_home']; } else { if (isset($coreConfs['backoffice_home_page']) && !empty($coreConfs['backoffice_home_page'])) { $redirectUrl = $coreConfs['backoffice_home_page']; } else { $redirectUrl = $routesConfigs['backoffice_prefix']; } } Session::write('Backoffice', $session); //On insère dans la variable de session les données de l'utilisateur $this->redirect($redirectUrl); //On redirige vers la page d'accueil du backoffice } else { Session::setFlash(_("Désolé mais votre accès au backoffice n'est pas autorisé (Aucun site administrable)"), 'error'); } //Sinon on génère le message d'erreur //UTILISATEUR FRONTOFFICE// } else { if ($bddRole == 3) { //Récupération des sites auxquels l'utilisateurs peut se connecter Via son groupe $this->load_model('UsersGroupsWebsite'); //Chargement du modèle $usersGroupsWebsites = $this->UsersGroupsWebsite->find(array('conditions' => array('users_group_id' => $user['users_group_id']))); //Récupération des sites auxquels l'utilisateurs peut se connecter Via l'utilisateur $this->load_model('UsersWebsite'); //Chargement du modèle $usersWebsites = $this->UsersWebsite->find(array('conditions' => array('user_id' => $user['id']))); $websitesList = array(); foreach ($usersGroupsWebsites as $k => $v) { $websitesList[] = $v['website_id']; } foreach ($usersWebsites as $k => $v) { $websitesList[] = $v['website_id']; } //On check qu'il y ait au moins un site if (count($websitesList) > 0) { //On récupère la liste des sites dans un tableau //$usersGroupsWebsitesList = array(); //foreach($usersGroupsWebsites as $k => $v) { $usersGroupsWebsitesList[] = $v['website_id']; } $websiteDatas = $this->components['Website']->get_website_datas(); //Récupération des données du site courant if (!in_array(CURRENT_WEBSITE_ID, $websitesList)) { Session::setFlash(_("Désolé mais vous ne pouvez pas accéder à ce site"), 'error'); } else { $session = array('User' => $user, 'UsersGroup' => $usersGroup, 'AuthWebsites' => $websitesList); Session::write('Frontoffice', $session); //On insère dans la variable de session les données de l'utilisateur $this->redirect('/'); //On redirige vers la page d'accueil du site } } else { Session::setFlash(_("Vous ne disposez pas des droits nécessaires pour accéder à ce site"), 'error'); } //Sinon on génère le message d'erreur } } } } else { Session::setFlash(_("Désolé mais votre accès au backoffice n'est pas autorisé"), 'error'); } //Sinon on génère le message d'erreur } else { Session::setFlash(_("Désolé mais le mot de passe ne concorde pas"), 'error'); } //Sinon on génère le message d'erreur } else { Session::setFlash(_("Désolé aucun utilisateur n'a été trouvé"), 'error'); } //Sinon on génère le message d'erreur $this->request->data['password'] = ''; //On vide le mot de passe } }
/** * Cette fonction va permettre l'affichage et la modification des fichiers ini sans section * * @param varchar $file Fichier ini à charger * @param varchar $redirect Page de redirection * @access private * @author koéZionCMS * @version 0.1 - 18/04/2012 by FI */ function _proceed_datas_ini($file, $redirect, $section = null, $websiteUrl = null) { require_once LIBS . DS . 'config_magik.php'; //Import de la librairie de gestion des fichiers de configuration //Création d'une instance if (isset($section)) { $cfg = new ConfigMagik($file, true, true); } else { $cfg = new ConfigMagik($file, true, false); } //Si des données sont postées if ($this->request->data) { if (isset($section)) { foreach ($this->request->data as $k => $v) { $cfg->set($k, $v, $section); } $cfg->set('website_url', $websiteUrl, $section); //On va rajouter l'url du site dans les configurations pour information } else { //On va parcourir les données postées et mettre à jour le fichier ini foreach ($this->request->data as $k => $v) { $cfg->set($k, $v); } } Session::setFlash("Fichier de configuration modifié"); //Message de confirmation $this->redirect($redirect); //Redirection } //Récupération des configurations if (isset($section)) { $this->request->data = $cfg->keys_values($section); } else { $this->request->data = $cfg->keys_values(); } }
/** * * @param unknown_type $function * @param unknown_type $query * @param unknown_type $datasToSave */ protected function _trace_sql($function, $query, $datasToSave = null) { require_once LIBS . DS . 'config_magik.php'; $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'core.ini', true, false); $coreConfs = $cfg->keys_values(); if ($coreConfs['log_sql']) { $date = date('Y-m-d'); $debug = debug_backtrace(); $traceSql = "================================================================================" . "\n" . "[DATE] : \t\t\t" . date('Y-m-d H:i:s') . "\n" . "[CLASS] : \t\t\t" . get_class($this) . "\n" . "[REFERER] : \t\t" . $this->refererUrl . "\n" . "[DEBUG BACKTRACE] : " . "\n"; foreach ($debug as $k => $v) { if (isset($v['file']) && !empty($v['file']) && isset($v['line']) && !empty($v['line'])) { $traceSql .= "\t\t\t\t\t" . '[FILE] : ' . $v['file'] . ' --> [LINE] : ' . $v['line'] . "\n"; } } $traceSql .= "[FUNCTION] : \t\t" . $function . "\n" . "[QUERY] : " . "\n" . $query . "\n"; if (isset($datasToSave)) { $traceSql .= "[DATAS] : \n" . var_export($datasToSave, true) . "\n"; } FileAndDir::put(TMP . DS . 'logs' . DS . 'models' . DS . $date . '.log', $traceSql, FILE_APPEND); } }
/** * Cette fonction permet de récupérer les articles * * @return array Liste des articles * @access public * @author koéZionCMS * @version 0.1 - 27/06/2014 by FI * @version 0.2 - 24/04/2015 by FI - Gestion de la traduction */ public function _get_posts() { $cacheFolder = TMP . DS . 'cache' . DS . 'variables' . DS . 'Posts' . DS; //On contrôle si le modèle est traduit $this->load_model('Post'); if ($this->Post->fieldsToTranslate) { $cacheFile = "home_page_website_" . CURRENT_WEBSITE_ID . '_' . DEFAULT_LANGUAGE; } else { $cacheFile = "home_page_website_" . CURRENT_WEBSITE_ID; } $posts = Cache::exists_cache_file($cacheFolder, $cacheFile); if (!$posts) { ////////////////////////////////////////////////////// // RECUPERATION DES CONFIGURATIONS DES ARTICLES // require_once LIBS . DS . 'config_magik.php'; //Import de la librairie de gestion des fichiers de configuration des posts $cfg = new ConfigMagik(CONFIGS . DS . 'files' . DS . 'posts.ini', false, false); //Création d'une instance $postsConfigs = $cfg->keys_values(); //Récupération des configurations ////////////////////////////////////////////////////// $postsQuery = array('conditions' => array('online' => 1, 'display_home_page' => 1), 'limit' => '0, ' . $postsConfigs['home_page_limit']); if ($postsConfigs['order'] == 'modified') { $postsQuery['order'] = 'modified DESC'; } else { if ($postsConfigs['order'] == 'created') { $postsQuery['order'] = 'created DESC'; } else { if ($postsConfigs['order'] == 'order_by') { $postsQuery['order'] = 'order_by ASC'; } } } $posts = $this->Post->find($postsQuery); Cache::create_cache_file($cacheFolder, $cacheFile, $posts); } return $posts; }