スタンドアロンPHPファイルの適切なブートストラップdrupal?


16

これは私が今持っているものです:

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

スタンドアロンで実行すると、上記から多数のエラーが発生します。私のモジュールでは問題なく動作します。エラーの一部は次のとおりです。

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
完全なブートストラップを行う場合、スタンドアロンphpファイルのポイントは何ですか?
googletorp

2
@ googletorp、Apacheのアクセス制御が必要で、Drupalのcronメカニズムを避けたい場合、crontabを介してこれらを時々スケジュールします。ただし、ほとんどの場合、通常、適切なhook_menu()エントリまたはdrushコマンドを使用することをお勧めします。
mpdonadio

1
この種の機能を利用する必要のあるいくつかの外部PHPファイルを使用して、現在サイトで作業しています。私は多分それは助ける、最近これを見つけた:interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357を

あなたは、ブートストラップすることができますdrupalのとdrush SRCここではコマンドいくつかの説明は、次のとおりです。oliverdavies.co.uk/blog/2013/11/dont-bootstrap-drupal-use-drush
ya.teck

回答:


14

ブートストラップを管理する最も簡単な方法は、drush php-script、エイリアスscr を使用することです

file.php:

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

Cli:

drush @alias scr file.php

出力:

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

この方法では、ブートストラップに関して何も処理する必要はありません。drushはそれを完全に解決し、エイリアスのおかげでサイト間で簡単に使用できるようにします。(私は試していませんが、リモートサイトでも動作するかもしれません)


リモートサイトでこれを行うには、スクリプトをリモートにする必要があります(drupal.stackexchange.com/questions/98098を参照)。暇なときは(ha!)、このためのパッチを試してみます。
mpdonadio

これは本当に最も簡単な方法であり、より多くの賛成票を獲得するはずです。
バラクラーク14

正確に何をする@aliasことになっていますか?私だけを取得しCould not find the alias @aliasます。残念ながら、指定したリンクは壊れています。修正して説明を拡大してください。
レイマン

@leymannxねえ、すみません、前にあなたの質問に気づかなかった。ドキュメントへのリンクを更新しました。ただし、エイリアスの部分は拡張していません。ブラシエイリアスはこの特定の質問の対象外です。
レサリオン

11

スタンドアロンのDrupal 7ブートストラップは適切ではありません。

これを試して:

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

お役に立てれば。


うーん。次の行で黙って失敗しています:$ users = views_get_view_result( 'userlist'、 'uid_list'); drupal_override_server_variables呼び出しがphpファイルの場所を指すように修正する必要がありますか?
Joren

はい、あなたが正しいです。このブートストラップ・ロードのみデータベース層ではなく、モジュール。ビューは、それの機能を使用するか、ここでデータ処理を担当するモジュールファイルをインクルードするためにあなたは、モジュールのinitフックを呼び出す必要があります: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas

エラーは、それらが必要とされたことが明らかに作られたように私はcommon.inc、views.moduleとctools.moduleを含めました。これらの3の後、私はエラーが発生して停止し、それだけで静かに死亡しました。ここからどこへ行くかわからない。
Joren

各インクルージョンの後にプリントアウトを行うと、それが立ち往生場所を確認。そして、あなたは間違っているのか知っていることがあります。オプションとして、完全なブートストラップを行うとだが、何が起こるか見てみてください。
Zydrunas Tamasauskas

2

これで十分です。

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

0

最後のエラー

警告:include_once(sites / all / modules / views_bulk_operations / actions / archive.action.inc):ストリームを開けませんでした:views_bulk_operations_load_action_includes()にそのようなファイルまたはディレクトリがありません(/ var / www / clients / client1 / web15 /の56行目) web / sites / all / modules / views_bulk_operations / views_bulk_operations.module)。

VBOのバグです。views_bulk_operations_load_action_includes()は、include_onceの使用時にDRUPAL_ROOTを使用しません。バグを報告し、VBOで修正します。

他のエラー(2つは互いに関連しています)は、モジュール.infoファイルにアクセスするときにDRUPAL_ROOTを使用していない_system_rebuild_module_data()に関連している可能性があります。$ modules変数のsystem_rebuild_module_data()にブレークポイントを置きそれを特定できるかどうかを確認します。問題キューにこの問題が表示されないため、もう一度drupalコアでバグを報告してください。

幸運を!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.