/** * Execute les taches crons sur tous les dsn paramétrés * XXX: Les noms de variables sont volontairement exotiques, pour éviter * qu'ils soient redéfinis dans les scripts inclus. * * @static * @access public * @return void */ public static function run() { // ajouter ce check aussi dans les scripts à appeller (protection) if (php_sapi_name() != 'cli' || !isset($GLOBALS['DSNS'])) { exit(1); } // for compatibility issues if (!isset($argv)) { $argv = $_SERVER['argv']; } $_force_ = isset($argv[1]) && ($argv[1] == '-f' || $argv[1] == '--force'); // error handler custom $_mday_ = date('d'); $_wday_ = date('w'); $_hour_ = date('H'); $_logger_ = Tools::loggerFactory(); // pour intercepter les fatal errors set_error_handler(array('CronTaskManager', 'errorHandler')); ob_start(array('CronTaskManager', 'fatalErrorHandler')); foreach ($GLOBALS['DSNS'] as $_dsn_) { $_dsn_ = constant($_dsn_); if (substr_count($_dsn_, '/') == 4) { // XXX compte qui n'a pas de base propre: les crons ne sont pas // executées continue; } Database::connection($_dsn_); // IMPORTANT: le parmètre nocache doit être à true ! $_col_ = Object::loadCollection('CronTask', array(), array(), array(), 0, 1, false, true); $_count_ = $_col_->getCount(); for ($_i_ = 0; $_i_ < $_count_; $_i_++) { $_cron_ = $_col_->getItem($_i_); if (!$_cron_->getActive() || !$_force_ && $_cron_->getHourOfDay() != $_hour_) { continue; } if ($_force_ || $_cron_->getDayOfMonth() == $_mday_ || $_cron_->getDayOfWeek() == $_wday_ || $_cron_->getDayOfWeek() == -1 && $_cron_->getDayOfMonth() == 0) { // le script trouvera la cnx à la bado déjà ouverte $_cron_script_ = CRON_DIR . '/' . $_cron_->getScriptName(); if (include $_cron_script_) { $vars = $file_vars = $self_vars = array(); $self_vars = array_keys(get_defined_vars()); $file_vars = array_keys(get_defined_vars()); // loggue l'execution du script $_msg_ = sprintf('Cron script "%s" executed on database "%s"', $_cron_script_, Database::connection()->database); $_logger_->log($_msg_, PEAR_LOG_NOTICE); // nettoie les locales du fichier inclu $vars = array_diff($file_vars, $self_vars); foreach ($vars as $v) { unset(${$v}); } } } } } ob_end_flush(); restore_error_handler(); }
/** * Appelle la méthode statique $method de la classe $entity. * * @access public * @param string $entity * @param string $dndSortableField * @param array $ids * @return string json */ public function dndSortEntity($entity, $dndSortableField, $ids, $page = 1) { $setter = 'set' . $dndSortableField; if (!method_exists($entity, $setter) || empty($ids)) { return json_encode($entity . '::' . $setter . ' does not exists.'); } $col = Object::loadCollection($entity, array('Id' => $ids)); $index = ($page - 1) * count($ids) + 1; foreach ($ids as $id) { $item = $col->getItemById($id); if (!$item instanceof $entity) { continue; } $item->{$setter}($index); $item->save(); $index++; } return json_encode(true); }