<?php
/**
* @version $Id: cron.helper.php 1832 2016-05-29 19:55:50Z sannosi $
* @package Elxis
* @subpackage Helpers/(Pseudo) Cron jobs
* @copyright Copyright (c) 2006-2015 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author Elxis Team ( http://www.elxis.org )
* @description Elxis CMS is free software. Read the license for copyright notices and details
*/
defined('_ELXIS_') or die ('Direct access to this location is not allowed');
class elxisCronHelper {
private $forcerun_allowed = true;
private $runnow = true;
private $seclevel = 0;
private $repo_path = '';
/***************/
/* CONSTRUCTOR */
/***************/
public function __construct() {
$elxis = eFactory::getElxis();
if ((int)$elxis->getConfig('CRONJOBS') == 0) {
$this->runnow = false;
$this->forcerun_allowed = false;
return;
}
$this->seclevel = (int)$elxis->getConfig('SECURITY_LEVEL');
$this->repo_path = rtrim($elxis->getConfig('REPO_PATH'), '/');
if ($this->repo_path == '') { $this->repo_path = ELXIS_PATH.'/repository'; }
if (!file_exists($this->repo_path.'/logs/') || !is_dir($this->repo_path.'/logs/')) {
$this->runnow = false;
$this->forcerun_allowed = false;
}
}
/*****************/
/* RUN CRON JOBS */
/*****************/
public function run($force=false) {
if ($this->forcerun_allowed === false) { $force = false; }
if ($force === true) {
$this->runnow = true;
}
if (!$this->runnow) { return false; }
if (file_exists($this->repo_path.'/logs/lastcron.txt')) {
//Don't run sooner than 10 minutes since last run except if force run was requested
if (!$force) {
$dts = time() - filemtime($this->repo_path.'/logs/lastcron.txt');
if ($dts < 600) { return false; }
}
} else {
$eFiles = eFactory::getFiles();
$eFiles->createFile('logs/lastcron.txt', '', true);
}
$this->pubUnpubArticles();
$this->pubUnpubModules();
$this->blockExpiredUsers();
$this->sendUserReminders();
if ($this->seclevel == 0) { //Custom cron jobs only under "Normal" security level
$this->customCronjobs();
}
@touch($this->repo_path.'/logs/lastcron.txt');
return true;
}
/****************************************/
/* SCHEDULED PUBLISH/UNPUBLISH ARTICLES */
/****************************************/
private function pubUnpubArticles() {
$db = eFactory::getDB();
$stdpubdate = '2014-01-01 00:00:00';
$stdunpubdate = '2060-01-01 00:00:00';
$today = gmdate('Y-m-d H:i:s');
$sql = "UPDATE ".$db->quoteId('#__content')." SET ".$db->quoteId('published')." = 1, ".$db->quoteId('pubdate')." = :xspd"
."\n WHERE ".$db->quoteId('published')." = 0 AND ".$db->quoteId('pubdate')." != :xspd AND ".$db->quoteId('pubdate')." <= :xnow";
$stmt = $db->prepare($sql);
$stmt->bindParam(':xspd', $stdpubdate, PDO::PARAM_STR);
$stmt->bindParam(':xnow', $today, PDO::PARAM_STR);
$stmt->execute();
$sql = "UPDATE ".$db->quoteId('#__content')." SET ".$db->quoteId('published')." = 0, ".$db->quoteId('unpubdate')." = :xsupd"
."\n WHERE ".$db->quoteId('published')." = 1 AND ".$db->quoteId('unpubdate')." != :xsupd AND ".$db->quoteId('unpubdate')." <= :xnow";
$stmt = $db->prepare($sql);
$stmt->bindParam(':xsupd', $stdunpubdate, PDO::PARAM_STR);
$stmt->bindParam(':xnow', $today, PDO::PARAM_STR);
$stmt->execute();
}
/***************************************/
/* SCHEDULED PUBLISH/UNPUBLISH MODULES */
/***************************************/
private function pubUnpubModules() {
$db = eFactory::getDB();
$stdpubdate = '2014-01-01 00:00:00';
$stdunpubdate = '2060-01-01 00:00:00';
$today = gmdate('Y-m-d H:i:s');
$sql = "UPDATE ".$db->quoteId('#__modules')." SET ".$db->quoteId('published')." = 1, ".$db->quoteId('pubdate')." = :xspd"
."\n WHERE ".$db->quoteId('published')." = 0 AND ".$db->quoteId('pubdate')." != :xspd AND ".$db->quoteId('pubdate')." <= :xnow";
$stmt = $db->prepare($sql);
$stmt->bindParam(':xspd', $stdpubdate, PDO::PARAM_STR);
$stmt->bindParam(':xnow', $today, PDO::PARAM_STR);
$stmt->execute();
$sql = "UPDATE ".$db->quoteId('#__modules')." SET ".$db->quoteId('published')." = 0, ".$db->quoteId('unpubdate')." = :xsupd"
."\n WHERE ".$db->quoteId('published')." = 1 AND ".$db->quoteId('unpubdate')." != :xsupd AND ".$db->quoteId('unpubdate')." <= :xnow";
$stmt = $db->prepare($sql);
$stmt->bindParam(':xsupd', $stdunpubdate, PDO::PARAM_STR);
$stmt->bindParam(':xnow', $today, PDO::PARAM_STR);
$stmt->execute();
}
/*******************************/
/* BLOCK EXPIRED USER ACCOUNTS */
/*******************************/
private function blockExpiredUsers() {
$db = eFactory::getDB();
$stdexpdate = '2060-01-01 00:00:00';
$today = gmdate('Y-m-d H:i:s');
$sql = "UPDATE ".$db->quoteId('#__users')." SET ".$db->quoteId('block')." = 1"
."\n WHERE ".$db->quoteId('block')." = 0 AND ".$db->quoteId('expiredate')." != :xsexp AND ".$db->quoteId('expiredate')." <= :xnow";
$stmt = $db->prepare($sql);
$stmt->bindParam(':xsexp', $stdexpdate, PDO::PARAM_STR);
$stmt->bindParam(':xnow', $today, PDO::PARAM_STR);
$stmt->execute();
}
/***********************/
/* SEND USER REMINDERS */
/***********************/
private function sendUserReminders() {
$db = eFactory::getDB();
$today = gmdate('Y-m-d H:i:s');
$sql = "SELECT b.id, b.uid, b.reminderdate, b.title, b.link, b.note, u.firstname, u.lastname, u.email"
."\n FROM ".$db->quoteId('#__bookmarks')." b"
."\n INNER JOIN ".$db->quoteId('#__users')." u ON u.uid = b.uid"
."\n WHERE b.cid = 5 AND b.remindersent = 0 AND b.reminderdate <= :xnow";
$stmt = $db->prepare($sql);
$stmt->bindParam(':xnow', $today, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_OBJ);
if (!$rows) { return; }
$elxis = eFactory::getElxis();
$eLang = eFactory::getLang();
$eDate = eFactory::getDate();
$eLang->load('com_user', 'component');
$parsed = parse_url($elxis->getConfig('URL'));
foreach ($rows as $row) {
$subject = sprintf($eLang->get('REMINDER_FROM_SITE'), $parsed['host']);
$txt = ($row->title != '') ? $row->title : $subject;
$txt .= "\r\n\r\n";
if ($row->note != '') { $txt .= $row->note."\r\n"; }
if ($row->link != '') { $txt .= $row->link."\r\n"; }
$txt .= $eLang->get('REMINDER_DATETIME').': ';
$txt .= $eDate->formatDate($row->reminderdate, $eLang->get('DATE_FORMAT_12'));
$txt .= "\r\n\r\n\r\n\r\n";
$txt .= "------------------------------------\r\n";
$txt .= $eLang->get('NOREPLYMSGINFO')."\r\n\r\n";
$txt .= $elxis->getConfig('SITENAME')."\r\n";
$txt .= $elxis->getConfig('URL');
$to = $row->email.','.$row->firstname.' '.$row->lastname;
$elxis->sendmail($subject, $txt, '', null, 'plain', $to);
}
$sql = "UPDATE ".$db->quoteId('#__bookmarks')." SET ".$db->quoteId('remindersent')." = 1 WHERE ".$db->quoteId('id')." = :xid";
$stmt = $db->prepare($sql);
foreach ($rows as $row) {
$id = $row->id;
$stmt->bindParam(':xid', $id, PDO::PARAM_INT);
$stmt->execute();
}
}
/************************/
/* RUN CUSTOM CRON JOBS */
/************************/
private function customCronjobs() {
if (!file_exists($this->repo_path.'/cronjobs/')) { return; }
if (!is_dir($this->repo_path.'/cronjobs/')) { return; }
$eFiles = eFactory::getFiles();
$files = $eFiles->listFiles('cronjobs/', '(\.php)$', false, true, true);
if (!$files) { return; }
foreach ($files as $file) {
include($file);
}
}
}
?>