Drupal bootstrap dengan benar untuk file PHP mandiri?

16

Inilah yang saya miliki sekarang:

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

Saya mendapatkan banyak kesalahan dari hal di atas ketika menjalankan standalone. Bekerja dengan baik di modul saya. Beberapa kesalahan adalah:

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
sumber
1
Apa gunanya file php mandiri jika Anda melakukan bootstrap penuh?
googletorp
2
@googletorp, saya menggunakan ini dari waktu ke waktu untuk menjadwalkan hal-hal melalui crontab ketika saya ingin kontrol akses Apache dan ingin tetap keluar dari mekanisme cron Drupal. Saya akan menambahkan, bahwa menggunakan entri hook_menu () yang tepat atau perintah drush biasanya merupakan ide yang lebih baik di sebagian besar keadaan.
mpdonadio
1
Bekerja di situs saat ini dengan beberapa file PHP luar perlu memanfaatkan jenis fungsi ini. Saya menemukan ini baru-baru ini, mungkin itu akan membantu: interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357
Anda dapat bootstrap drupal dengan perintah drush src. Berikut adalah beberapa penjelasan: oliverdavies.co.uk/blog/2013/11/dont-bootstrap-drupal-use-drush
ya.teck

Jawaban:

14

Sejauh ini cara termudah untuk mengelola bootstrap adalah dengan menggunakan drush php-script , alias scr.

file.php:

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

Cli:

drush @alias scr file.php

Keluaran:

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

Dengan cara ini Anda tidak perlu berurusan dengan apa pun sehubungan dengan bootstrap, drush akan menyelesaikannya sepenuhnya untuk Anda, dan memberi Anda kemampuan untuk menggunakannya dengan mudah di seluruh situs berkat alias. (Bahkan mungkin bekerja di situs jarak jauh, meskipun saya belum mencobanya)

Letharion
sumber
Jika Anda ingin melakukan ini di situs jarak jauh, skrip harus jauh (lihat drupal.stackexchange.com/questions/98098 ). Jika saya mendapatkan waktu luang (ha!) Akan mencoba tambalan untuk ini.
mpdonadio
Ini benar-benar adalah cara paling sederhana untuk melakukannya dan harus mendapatkan lebih banyak upvotes.
Bala Clark
Apa yang @aliasseharusnya dilakukan? Saya hanya mendapat Could not find the alias @alias. Sayangnya tautan yang Anda berikan rusak. Bisakah Anda memperbaikinya dan memperluas penjelasan Anda?
leymannx
@leymannx Hei, maaf saya tidak memperhatikan pertanyaan Anda sebelumnya. Saya telah memperbarui tautan ke dokumentasi. Saya belum memperluas bagian alias, karena alias drush benar-benar di luar jangkauan untuk pertanyaan khusus ini.
Letharion
11

bootstrap 7 standup mandiri Anda tidak cukup benar.

Coba ini:

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

Semoga ini membantu.

Zydrunas Tamasauskas
sumber
Hmm. Gagal diam-diam di baris ini: $ users = views_get_view_result ('userlist', 'uid_list'); Apakah saya benar bahwa panggilan drupal_override_server_variables Anda harus mengarah ke lokasi file php saya?
Joren
Iya kamu benar. Bootstrap ini hanya memuat lapisan basis data, tetapi bukan modul. Anda harus mengaktifkan kait init modul agar tampilan menggunakan fungsionalitasnya atau menyertakan file modul yang bertanggung jawab untuk pemrosesan data di sini: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas
Saya sudah memasukkan common.inc, views.module dan ctools.module sebagai kesalahan yang membuatnya jelas bahwa mereka diperlukan. Setelah 3 ini saya berhenti mendapatkan kesalahan dan hanya mati diam-diam. Tidak yakin hendak kemana setelah ini.
Joren
Lakukan cetakan setelah setiap inklusi dan lihat di mana macetnya. Maka Anda mungkin tahu apa yang salah. Sebagai pilihan, coba lakukan bootstrap penuh dan lihat apa yang terjadi.
Zydrunas Tamasauskas
2

ini cukup:

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

Kesalahan terakhir

Peringatan: include_once (situs / semua / modul / views_bulk_operations / action / archive.action.inc): gagal membuka aliran: Tidak ada file atau direktori seperti itu di views_bulk_operations_load_action_includes () (baris 56 dari / var / www / klien / client1 / web15 / web / situs / semua / modul / views_bulk_operations / views_bulk_operations.module).

adalah bug di VBO. views_bulk_operations_load_action_includes () tidak menggunakan DRUPAL_ROOT saat menggunakan include_once. Saya akan mengajukan bug dan memperbaikinya dalam VBO.

Kesalahan lainnya (2 terkait satu sama lain) mungkin terkait dengan _system_rebuild_module_data () tidak menggunakan DRUPAL_ROOT saat mengakses file modul .info. Saya akan menaruh break point di system_rebuild_module_data () untuk variabel $ modules dan lihat apakah Anda bisa menyematkan titik itu. Sekali lagi mengajukan bug dengan inti drupal karena saya tidak melihat masalah ini dalam antrian masalah.

Semoga berhasil!

mikeytown2
sumber