Expertos en Drupal

Programación de scripts independientes con acceso a la API de Drupal

En muchas ocasiones nos encontramos con la necesidad de programar scripts que hay que ejecutar periódicamente desde el “crontab” del sistema. Para ser más ágiles, podemos hacer que nuestros scripts tengan acceso a la API de Drupal y a su base de datos.

.
Roger Codina
Roger Codina

Diciembre 03, 2020

Programación de scripts independientes con acceso a la API de Drupal

Cuando programamos scripts para nuestros sitios webs Drupal tenemos dos alternativas: o programamos un comando de “drush” personalizado mediante un módulo personalizado de Drupal o bien creamos un script independiente con acceso a Drupal. Nosotros preferimos el segundo método ya que nos permite integrar este script en el “crontab” del sistema con menos problemas que en el primer caso.

A continuación, tenéis el código necesario para crear scripts independientes para Drupal 8/9 y también para Drupal 7. En función del directorio dónde pongáis vuestro script, tendréis que cambiar el “path” relativo hast el núcleo de Drupal.

Drupal 8/9: 

<?php

use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

// Change the directory to the Drupal root.
chdir(dirname(__FILE__) . '/../web');
$autoloader = require_once 'autoload.php';

try {
  $request = Request::createFromGlobals();
  $kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');
  $kernel->boot();
  $kernel->preHandle($request);

  // Ensure the request includes the session if appropriate.
  if (PHP_SAPI !== 'cli') {
    $request->setSession($kernel->getContainer()->get('session'));
  }

  // EL CÓDIGO DE NUESTRO SCRIPT VA AQUÍ.

} catch (HttpExceptionInterface $e) {
  $response = new Response('', $e->getStatusCode());
  $response->prepare($request)->send();
  exit;
}

Drupal 7:

<?php

// Avoid PHP Notice.
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';

// Boostrap Drupal.
define('DRUPAL_ROOT', dirname(__FILE__) . '/..');

// Boot drupal.
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

// EL CÓDIGO DE NUESTRO SCRIPT VA AQUÍ.

Bibliografía: 

https://www.drupal.org/project/drupal/issues/1436272
https://drupal.stackexchange.com/questions/174474/bootstrap-from-external-script/294348#294348
 

Comparte este artículo

Artículos Relacionados