Drupal bootstrap correttamente per file PHP autonomo?


16

Questo è quello che ho adesso:

<?php
    define('DRUPAL_ROOT', '/var/www/clients/client1/web15/web');
    include_once(DRUPAL_ROOT . '/includes/bootstrap.inc');
    drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//  drupal_flush_all_caches();  

    $users = views_get_view_result('userlist', 'uid_list');
    $i = 0;
    foreach ($users as $user) {
        $filename = 'sites/default/files/generated_pdfs/individual_pdf_report_' . $user->uid . '.pdf';
        generate_employee_pdf($user->uid, $filename);
        error_log('Generated ' . $filepath);
        $i++;
    }
    // create object
    $zip = new ZipArchive();
    // open archive
    if ($zip->open("sites/default/files/generated_zips/individual-reports.zip", ZIPARCHIVE::CREATE) !== TRUE) {
        die ("Could not open archive");
    }
    // initialize an iterator
    // pass it the directory to be processed
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("sites/default/files/generated_pdfs/"));
    // iterate over the directory
    // add each file found to the archive
    foreach ($iterator as $key=>$value) {
        $zip->addFile(realpath($key), $value->getFilename()) or die ("ERROR: Could not add file: $key");
    }
    // close and save archive
    $zip->close();
?>

Ricevo un sacco di errori da quanto sopra quando eseguito autonomo. Funziona bene nel mio modulo. Alcuni degli errori sono:

Warning: Invalid argument supplied for foreach() in drupal_depth_first_search() (line 56 of /var/www/clients/client1/web15/web/includes/graph.inc).
Warning: Invalid argument supplied for foreach() in _module_build_dependencies() (line 229 of /var/www/clients/client1/web15/web/includes/module.inc).
Warning: include_once(sites/all/modules/views_bulk_operations/actions/archive.action.inc): failed to open stream: No such file or directory in views_bulk_operations_load_action_includes() (line 56 of /var/www/clients/client1/web15/web/sites/all/modules/views_bulk_operations/views_bulk_operations.module).

1
Qual è il punto di un file php autonomo se si esegue un bootstrap completo?
googletorp

2
@googletorp, li utilizzo di tanto in tanto per pianificare le cose tramite un crontab quando voglio il controllo degli accessi di Apache e voglio stare fuori dal meccanismo cron di Drupal. Vorrei aggiungere che l'uso di una voce hook_menu () corretta o di un comando drush è generalmente un'idea migliore nella maggior parte dei casi.
mpdonadio

1
Lavorare su un sito in questo momento con diversi file PHP esterni che devono utilizzare questo tipo di funzionalità. L'ho trovato di recente, forse mi aiuterà: interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357

Risposte:


14

Di gran lunga il modo più semplice per gestire il bootstrap è usare drush php-script , alias scr.

file.php:

<?php
echo l('Link', 'path');

Cli:

drush @alias scr file.php

Produzione:

<a href="/path">Link</a>

In questo modo non dovrai fare nulla per quanto riguarda il bootstrap, drush lo risolverà interamente per te e ti darà la possibilità di usarlo facilmente attraverso i siti grazie agli alias. (Potrebbe anche funzionare su siti remoti, anche se non l'ho provato)


Se vuoi farlo su un sito remoto, lo script deve essere remoto (vedi drupal.stackexchange.com/questions/98098 ). Se mai avrò tempo libero (ah!) Proverò una patch per questo.
mpdonadio

Questo è davvero il modo più semplice per farlo e dovrebbe ottenere più voti.
Bala Clark,

Cosa @aliasdovrebbe fare esattamente ? Ho solo un Could not find the alias @alias. Sfortunatamente il link che hai fornito è rotto. Potresti risolvere il problema ed espandere la tua spiegazione?
leymannx,

@leymannx Ehi, scusa se non ho notato la tua domanda prima. Ho aggiornato il link alla documentazione. Tuttavia, non ho ampliato la parte di alias, poiché gli alias di droga sono davvero fuori portata per questa domanda particolare.
Letharion,

11

il tuo bootstrap Drupal 7 autonomo non è del tutto corretto.

Prova questo:

/**
 * Do not let execute this file from http request
 */
if (isset($_SERVER['REMOTE_ADDR'])) {
  print "...";
  exit(1);
}

/**
 * Initialize Drupal
 */
define('DRUPAL_ROOT', '/var/www/clients/client1/web15/web');
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once DRUPAL_ROOT . '...'; // include required module files to work with here

drupal_override_server_variables(array('url' => 'http://www.example.com/batch.php')); // trick drupal to do bootstrap
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);

set_time_limit(4600); // adjust for your needs
ini_set('memory_limit', '3524M'); // adjust for your needs

Spero che sia di aiuto.


Hmm. Non sta funzionando silenziosamente su questa riga: $ users = views_get_view_result ('userlist', 'uid_list'); Ho ragione che la tua chiamata drupal_override_server_variables dovrebbe puntare alla posizione del mio file php?
Joren,

Si hai ragione. Questo bootstrap carica solo il livello del database, ma non i moduli. È necessario invocare il modulo init hook per le viste per utilizzare la sua funzionalità o includere il file del modulo responsabile dell'elaborazione dei dati qui: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas,

Ho incluso common.inc, views.module e ctools.module poiché gli errori hanno reso evidente che erano necessari. Dopo questi 3 ho smesso di ricevere errori ed è morto silenziosamente. Non sono sicuro di dove andare da qui.
Joren,

Fai le stampe dopo ogni inclusione e vedi dove si è bloccato. Allora potresti sapere cosa c'è che non va. Come opzione, prova a eseguire il bootstrap completo e guarda cosa succede.
Zydrunas Tamasauskas,

2

è abbastanza:

define('DRUPAL_ROOT', '/path/to/drupal/root/');
 require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

0

L'ultimo errore

Avvertenza: include_once (sites / all / modules / views_bulk_operations / actions / archive.action.inc): impossibile aprire il flusso: nessun file o directory in views_bulk_operations_load_action_includes () (riga 56 di / var / www / client / client1 / web15 / web / sites / all / modules / views_bulk_operations / views_bulk_operations.module).

è un bug in VBO. views_bulk_operations_load_action_includes () non utilizza DRUPAL_ROOT quando si utilizza include_once. Vorrei segnalare un bug e risolverlo in VBO.

L'altro errore (i 2 sono correlati tra loro) potrebbe essere correlato a _system_rebuild_module_data () che non utilizza DRUPAL_ROOT quando si accede al file .info dei moduli. Vorrei mettere i punti di interruzione in system_rebuild_module_data () per la variabile $ modules e vedere se è possibile individuarlo. Ancora una volta, presenta un bug con drupal core poiché non vedo questo problema nella coda dei problemi.

In bocca al lupo!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.