Правильно ли загружается drupal для автономного PHP-файла?

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).
Joren
источник
1
Какой смысл в автономном php-файле, если вы делаете полную загрузку?
googletorp
2
@googletorp, я использую их время от времени, чтобы планировать вещи через crontab, когда я хочу, чтобы контроль доступа Apache и хотел остаться вне механизма cron Drupal. Однако я бы добавил, что использование правильной записи 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

Безусловно, самый простой способ управлять загрузкой - использовать php-скрипт drush , псевдоним scr.

file.php:

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

Кли:

drush @alias scr file.php

Выход:

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

Таким образом, вам ничего не нужно делать с начальной загрузкой, drush решит ее полностью за вас и даст вам возможность легко использовать ее на разных сайтах благодаря псевдонимам. (Может даже работать на удаленных сайтах, хотя я этого не пробовал)

Letharion
источник
Если вы хотите сделать это на удаленном сайте, сценарий должен быть удаленным (см. Drupal.stackexchange.com/questions/98098 ). Если я когда-нибудь получу свободное время (ха!), Попробую патч для этого.
mpdonadio
Это действительно самый простой способ сделать это и должен получить больше голосов.
Бала Кларк
Что именно @aliasдолжен делать? Я только получаю Could not find the alias @alias. К сожалению, указанная вами ссылка не работает. Не могли бы вы исправить это и расширить свое объяснение?
leymannx
@leymannx Привет, прости, я не заметил твой вопрос раньше. Я обновил ссылку на документацию. Однако я не расширил часть псевдонимов, поскольку псевдонимы drush действительно выходят за рамки данного конкретного вопроса.
Летарион
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-файла?
Джорен
Да, ты прав. Этот загрузчик загружает только слой базы данных, но не модули. Вы должны вызвать хук инициализации модуля для представлений, чтобы использовать его функциональность, или включить файл модуля, отвечающий за обработку данных здесь: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas
Я включил common.inc, views.module и ctools.module, так как ошибки показали, что они необходимы. После этих 3 я перестал получать ошибки, и он просто тихо умер. Не уверен, куда идти отсюда.
Джорен
Делайте распечатки после каждого включения и смотрите, где оно застряло. Тогда вы можете знать, что не так. Как вариант, попробуйте сделать полную загрузку и посмотреть, что происходит.
Зидрунас Тамасаускас
2

достаточно:

define('DRUPAL_ROOT', '/path/to/drupal/root/');
 require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Matoeil
источник
0

Последняя ошибка

Предупреждение: include_once (sites / all / modules / views_bulk_operations / actions / archive.action.inc): не удалось открыть поток: нет такого файла или каталога в views_bulk_operations_load_action_include () (строка 56 из / var / www / clients / client1 / web15 / веб / сайты / все / модули / views_bulk_operations / views_bulk_operations.module).

это ошибка в VBO. views_bulk_operations_load_action_include () не использует DRUPAL_ROOT при использовании include_once. Я бы подал ошибку и исправил ее в VBO.

Другая ошибка (2 связаны друг с другом) может быть связана с _system_rebuild_module_data (), не использующей DRUPAL_ROOT при доступе к файлу .info модулей. Я бы поставил точки останова в system_rebuild_module_data () для переменной $ modules и посмотрел, сможешь ли ты ее указать. Еще раз подайте ошибку с ядром drupal, так как я не вижу этой проблемы в очереди.

Удачи!

mikeytown2
источник