Właściwie bootstrap Drupal dla samodzielnego pliku PHP?

16

Oto co mam teraz:

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

Otrzymuję mnóstwo błędów z powyższego, gdy uruchamiam samodzielny. Działa dobrze w moim module. Niektóre z błędów to:

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).
Joren
źródło
1
Jaki jest sens samodzielnego pliku php, jeśli wykonasz pełny bootstrap?
googletorp
2
@googletorp, używam ich od czasu do czasu do planowania rzeczy za pomocą crontab, kiedy chcę kontroli dostępu Apache i chcę trzymać się z dala od mechanizmu cron Drupala. Dodałbym jednak, że użycie właściwego wpisu hook_menu () lub polecenia drush jest zwykle lepszym pomysłem w większości przypadków.
mpdonadio
1
Pracuję teraz na stronie z kilkoma zewnętrznymi plikami PHP, które muszą korzystać z tego rodzaju funkcji. Znalazłem niedawno, może to pomoże: interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357
Możesz bootstrap drupal za pomocą komendy drush src Oto kilka wyjaśnień: oliverdavies.co.uk/blog/2013/11/dont-bootstrap-drupal-use-drush
ya.teck

Odpowiedzi:

14

Zdecydowanie najłatwiejszym sposobem zarządzania bootstrap jest użycie skryptu php drush , alias scr.

plik.php:

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

Cli:

drush @alias scr file.php

Wynik:

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

W ten sposób nie musisz zajmować się niczym w odniesieniu do bootstrapu, drush rozwiąże go całkowicie za Ciebie i da ci możliwość łatwego używania go na różnych stronach dzięki aliasom. (Może nawet działać na zdalnych stronach, chociaż nie próbowałem tego)

Letharion
źródło
Jeśli chcesz to zrobić na zdalnej stronie, skrypt musi być zdalny (patrz drupal.stackexchange.com/questions/98098 ). Jeśli kiedykolwiek dostanę czas wolny (ha!), Wypróbuję łatkę.
mpdonadio
To naprawdę najprostszy sposób, aby to zrobić i powinien uzyskać więcej pozytywnych opinii.
Bala Clark
Co dokładnie @aliasma zrobić? Dostaję tylko Could not find the alias @alias. Niestety podany link jest uszkodzony. Czy możesz to naprawić i rozwinąć wyjaśnienie?
leymannx,
@leymannx Hej, przepraszam, nie zauważyłem wcześniej twojego pytania. Zaktualizowałem link do dokumentacji. Nie rozwinąłem jednak części aliasu, ponieważ aliasy drush są naprawdę poza zakresem tego konkretnego pytania.
Letharion
11

twój samodzielny bootstrap Drupal 7 nie jest w porządku.

Spróbuj tego:

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

Mam nadzieję że to pomoże.

Zydrunas Tamasauskas
źródło
Hmm W tym wierszu po cichu zawodzi: $ users = views_get_view_result ('lista użytkowników', 'lista uid'); Czy mam rację, że twoje wywołanie drupal_override_server_variables powinno wskazywać lokalizację mojego pliku php?
Joren,
Tak masz rację. Ten bootstrap ładuje tylko warstwę bazy danych, ale nie moduły. Musisz wywołać moduł inicjujący przechwytywanie widoku, aby użyć jego funkcjonalności lub dołączyć plik modułu odpowiedzialny za przetwarzanie danych tutaj: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas
Dołączyłem common.inc, views.module i ctools.module, ponieważ błędy oznaczały, że były potrzebne. Po tych 3 przestałem dostawać błędy i po prostu cicho umarło. Nie jestem pewien, dokąd się udać.
Joren
Wykonuj wydruki po każdym włączeniu i zobacz, gdzie się przykleiło. Wtedy możesz wiedzieć, co jest nie tak. Opcjonalnie spróbuj wykonać pełny bootstrap i zobacz, co się stanie.
Zydrunas Tamasauskas,
2

wystarczy:

define('DRUPAL_ROOT', '/path/to/drupal/root/');
 require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Matoeil
źródło
0

Ostatni błąd

Ostrzeżenie: include_once (sites / all / modules / views_bulk_operations / actions / archive.action.inc): nie udało się otworzyć strumienia: brak takiego pliku lub katalogu w views_bulk_operations_load ma_działanie_kluczem () (wiersz 56 / var / www / client / client1 / web15 / web / sites / all / modules / views_bulk_operations / views_bulk_operations.module).

jest błędem w VBO. views_bulk_operations_load_action_includes () nie używa DRUPAL_ROOT podczas korzystania z include_once. Złożyłbym błąd i naprawił go w VBO.

Drugi błąd (2 są ze sobą powiązane) może być związany z brakiem używania funkcji DRUPAL_ROOT podczas _system_rebuild_module_data () podczas uzyskiwania dostępu do pliku .info modułów. Umieściłbym punkty przerwania w system_rebuild_module_data () dla zmiennej $ moduły i sprawdzę, czy potrafisz ją wskazać. Po raz kolejny zgłoś błąd do rdzenia drupal, ponieważ nie widzę tego problemu w kolejce problemów.

Powodzenia!

mikeytown2
źródło