Richtig Bootstrap Drupal für eigenständige PHP-Datei?


16

Das habe ich gerade:

<?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();
?>

Ich erhalte eine Reihe von Fehlern aus dem oben genannten, wenn Standalone ausgeführt wird. Funktioniert gut in meinem Modul. Einige der Fehler sind:

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
Was nützt eine eigenständige PHP-Datei, wenn Sie einen vollständigen Bootstrap durchführen?
googletorp

2
@googletorp, ich benutze diese von Zeit zu Zeit, um Dinge über eine Crontab zu planen, wenn ich Apache-Zugriffskontrolle möchte und mich aus dem Drupal-Cron-Mechanismus heraushalten möchte. Ich würde jedoch hinzufügen, dass die Verwendung eines korrekten hook_menu () - Eintrags oder eines drush-Befehls in den meisten Fällen eine bessere Idee ist.
mpdonadio

1
Arbeiten Sie gerade an einer Site mit mehreren externen PHP-Dateien, die diese Art von Funktionalität benötigen. Ich habe dies kürzlich gefunden, vielleicht hilft es: interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357

Sie können Drupal mit dem Befehl drush src booten. Hier einige Erklärungen: oliverdavies.co.uk/blog/2013/11/dont-bootstrap-drupal-use-drush
ya.teck

Antworten:


14

Der mit Abstand einfachste Weg, den Bootstrap zu verwalten, ist die Verwendung von drush php-script , alias scr.

file.php:

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

Cli:

drush @alias scr file.php

Ausgabe:

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

Auf diese Weise müssen Sie mit dem Bootstrap nichts zu tun haben. Drush wird es für Sie vollständig lösen und Ihnen die Möglichkeit geben, es dank Aliasen problemlos über Websites hinweg zu verwenden. (Könnte sogar an entfernten Standorten funktionieren, obwohl ich das nicht ausprobiert habe.)


Wenn Sie dies auf einer Remote-Site tun möchten, muss das Skript remote sein (siehe drupal.stackexchange.com/questions/98098 ). Wenn ich mal frei habe (ha!) Werde ich mal einen Patch dafür probieren.
mpdonadio

Dies ist wirklich der einfachste Weg, dies zu tun, und sollte mehr Gegenstimmen erhalten.
Bala Clark

Was genau @aliassoll das tun? Ich bekomme nur eine Could not find the alias @alias. Der von Ihnen angegebene Link ist leider fehlerhaft. Könnten Sie es bitte beheben und Ihre Erklärung erweitern?
Leymannx

@leymannx Hey, sorry, ich habe deine Frage vorher nicht bemerkt. Ich habe den Link zur Dokumentation aktualisiert. Ich habe den Alias-Teil jedoch nicht erweitert, da drush-Aliase für diese bestimmte Frage wirklich nicht in Frage kommen.
Letharion

11

Ihr eigenständiger Drupal 7-Bootstrap ist nicht ganz richtig.

Versuche dies:

/**
 * 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

Hoffe das hilft.


Hmm. In der folgenden Zeile tritt ein Fehler auf: $ users = views_get_view_result ('userlist', 'uid_list'); Stimmt es, dass Ihr Aufruf von drupal_override_server_variables auf den Speicherort meiner PHP-Datei verweist?
Joren

Ja, du hast recht. Dieser Bootstrap lädt nur die Datenbankebene, jedoch keine Module. Sie müssen den Modul-Init-Hook aufrufen, damit Ansichten dessen Funktionalität nutzen können, oder die für die Datenverarbeitung verantwortliche Moduldatei hier require_once DRUPAL_ROOT . '...'; // include required module files to work with here
einfügen

Ich habe common.inc, views.module und ctools.module eingefügt, da die Fehler deutlich machten, dass sie benötigt wurden. Nach diesen 3 habe ich aufgehört, Fehler zu bekommen und es ist nur stillschweigend gestorben. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll.
Joren

Machen Sie Ausdrucke nach jeder Aufnahme und sehen Sie, wo es klebte. Dann wissen Sie vielleicht, was los ist. Versuchen Sie optional, einen vollständigen Bootstrap durchzuführen, um zu sehen, was passiert.
Zydrunas Tamasauskas

2

das ist genug:

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

0

Der letzte Fehler

Warnung: include_once (sites / all / modules / views_bulk_operations / actions / archive.action.inc): Fehler beim Öffnen des Streams: Keine Datei oder kein Verzeichnis in views_bulk_operations_load_action_includes () (Zeile 56 von / var / www / clients / client1 / web15 / web / sites / all / modules / views_bulk_operations / views_bulk_operations.module).

ist ein Fehler in VBO. views_bulk_operations_load_action_includes () verwendet DRUPAL_ROOT nicht, wenn include_once verwendet wird. Ich würde einen Fehler melden und ihn in VBO beheben.

Der andere Fehler (die 2 sind miteinander verbunden) kann mit _system_rebuild_module_data () zusammenhängen, das DRUPAL_ROOT nicht verwendet, wenn auf die INFO-Datei des Moduls zugegriffen wird. Ich würde Unterbrechungspunkte in system_rebuild_module_data () für die Variable $ modules einfügen und sehen, ob Sie sie festlegen können. Nochmals einen Fehler mit Drupal-Kern melden, da ich dieses Problem nicht in der Problemwarteschlange sehe.

Viel Glück!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.