Test op cron

Drupal 6, 7.

Soms is het gewenst dat alleen een specifieke groep gebruikers één node of groep nodes mag inzien. Dit is te realiseren door in de node zelf een test te zetten die controleert of de bezoeker de node mag zien of niet. Zo nee, dan wordt meestal middels de functie drupal_goto() de ongewenste bezoeker naar een andere pagina gestuurd. Zie bijvoorbeeld „Afgeschermde pagina’s”.

Een probleem is dat tijdens een cron-job de search module ook deze node zal indexeren en als niet gewenste bezoeker wordt doorgeleid naar de andere pagina. Ook andere modules kunnen dit „overkomen”.

In Drupal 6 is in hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) te zien of de search module de functie aanroept of niet. Zo ja, dan zijn zowel $a3 als $a4 gelijk aan NULL>.

In Drupal 7 is de vergelijkbare hook: hook_node_view($node, $view_mode, $language). Hierin is niet te testen of een cron-job actief is.

Omdat er meerdere manieren waarop een cron-job kan draaien en de test in meer modules tegelijk nodig kan zijn heb ik er een module van gemaakt. De module test of cron() actief is en geeft dan TRUE als resultaat anders FALSE. Het gebruikt de op dit moment bekende beste oplossing.

De functie kan als volgt worden aangeroepen:

 if (!my_is_cron()) {
  drupal_goto($preferredLink);
}

Er moeten twee bestandjes worden aangemaakt, namelijk een .info en een .module bestand.

Bestand: my_is_cron.info

name = Mijn is cron
description = Test of cron op dit moment actief is.
version = "7.x-1.0"
core = "7.x"
files[] = my_is_cron.module

Bestand: my_is_cron.module:

/**
 * function is_cron()
 * Test of cron actief is
 */
function my_is_cron() {
  if (php_sapi_name() == 'cli') {
    // This may mean cron via Drush
    return TRUE;
  }
  if(preg_match('/\/cron.php$/', $_SERVER['SCRIPT_NAME'])) {
    //check for cron.php in the url. *preg_match accommodates sites in sub-directories
    return TRUE;
  }
  if (arg(0) == 'admin' && arg(1) == 'reports' && arg(2) == 'status' && arg(3) == 'run-cron') {
    return TRUE;
  }
  // start search met Elysia-cron
  if (module_exists('elysia_cron')) {
    if (current_path() == "admin/config/system/cron/execute/search_cron") {
      return TRUE;
    }
  }
  return FALSE;
}

De informatie voor deze pagina komt van www.drupal.org/node/102138 en de functie is gelijk aan die uit comment #26. Op de genoemde pagina kan een verbeterde versie staan.