Drupal de bootstrap corretamente para arquivo PHP autônomo?

16

Isto é o que eu tenho agora:

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

Estou recebendo vários erros do exposto acima quando executado de forma independente. Funciona bem no meu módulo. Alguns dos erros são:

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
fonte
1
Qual é o sentido de um arquivo php autônomo se você fizer uma inicialização completa?
Googletorp
2
@ googletorp, eu os uso periodicamente para agendar as coisas por meio de um crontab quando quero o controle de acesso do Apache e quero ficar de fora do mecanismo cron do Drupal. Eu acrescentaria, porém, que usar uma entrada hook_menu () adequada ou um comando drush geralmente é uma idéia melhor na maioria das circunstâncias.
mpdonadio
1
Agora, trabalhando em um site com vários arquivos PHP externos que precisam utilizar esse tipo de funcionalidade. Achei isso recentemente, talvez ele vai ajudar: interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357
Você pode inicializar o Drupal com Drush src comando Aqui estão algumas explicações: oliverdavies.co.uk/blog/2013/11/dont-bootstrap-drupal-use-drush
ya.teck

Respostas:

14

De longe, a maneira mais fácil de gerenciar o bootstrap é usar drush php-script , alias scr.

file.php:

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

Cli:

drush @alias scr file.php

Resultado:

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

Dessa forma, você não precisa lidar com nada em relação ao bootstrap, o drush o resolverá totalmente para você e lhe permitirá usá-lo facilmente em sites, graças a aliases. (Pode até funcionar em sites remotos, embora eu não tenha tentado isso)

Letharion
fonte
Se você quiser fazer isso em um site remoto, o script deverá ser remoto (consulte drupal.stackexchange.com/questions/98098 ). Se algum dia eu tiver tempo livre (ha!), Tentarei um patch para isso.
mpdonadio
Essa é realmente a maneira mais simples de fazer isso e deve receber mais votos.
Bala Clark
O que exatamente @aliasdeveria fazer? Eu só recebo um Could not find the alias @alias. Infelizmente, o link que você forneceu está quebrado. Você poderia corrigi-lo e expandir sua explicação?
Leymannx
@leymannx Ei, desculpe, eu não percebi sua pergunta antes. Atualizei o link para a documentação. No entanto, eu não expandi a parte do alias, pois os aliases drush estão realmente fora do escopo dessa pergunta em particular.
Letharion
11

sua inicialização autônoma do Drupal 7 não está certa.

Tente o seguinte:

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

Espero que isto ajude.

Zydrunas Tamasauskas
fonte
Hmm. Está falhando silenciosamente nesta linha: $ users = views_get_view_result ('userlist', 'uid_list'); Estou correto que sua chamada drupal_override_server_variables aponte para o local do meu arquivo php?
21712 Joren
Sim, você está certo. Essa inicialização carrega apenas a camada do banco de dados, mas não os módulos. Você deve invocar o módulo de inicialização gancho para vistas para usá-lo de funcionalidade ou incluir arquivo de módulo responsável por processamento de dados aqui: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas
Incluí common.inc, views.module e ctools.module, pois os erros tornaram óbvio que eram necessários. Após esses 3, parei de receber erros e ele simplesmente morreu silenciosamente. Não tenho certeza para onde ir a partir daqui.
Joren
Faça impressões após cada inclusão e veja onde ficou. Então você pode saber o que está errado. Como opção, tente fazer o bootstrap completo e veja o que está acontecendo.
Zydrunas Tamasauskas
2

isto é suficiente:

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

O último erro

Aviso: include_once (sites / all / modules / views_bulk_operations / actions / archive.action.inc): falha ao abrir o fluxo: Não existe esse arquivo ou diretório em views_bulk_operations_load_action_includes () (linha 56 de / var / www / clients / client1 / web15 / web / sites / all / modules / views_bulk_operations / views_bulk_operations.module).

é um bug no VBO. views_bulk_operations_load_action_includes () não usa DRUPAL_ROOT ao usar include_once. Eu arquivava um bug e o corrigia no VBO.

O outro erro (os 2 estão relacionados entre si) pode estar relacionado a _system_rebuild_module_data () não usar DRUPAL_ROOT ao acessar o arquivo .info dos módulos. Eu colocaria pontos de interrupção em system_rebuild_module_data () para a variável $ modules e verificaria se você pode defini-la. Mais uma vez, arquive um bug com o núcleo drupal, pois não vejo esse problema na fila de problemas.

Boa sorte!

mikeytown2
fonte