Bootstrap correctement Drupal pour un fichier PHP autonome?

16

Voici ce que j'ai en ce moment:

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

Je reçois un tas d'erreurs de ce qui précède lorsque je suis autonome. Fonctionne très bien dans mon module. Certaines des erreurs sont:

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
la source
1
Quel est l'intérêt d'un fichier php autonome si vous faites un bootstrap complet?
googletorp
2
@googletorp, je les utilise de temps en temps pour planifier des choses via une crontab quand je veux le contrôle d'accès Apache et que je veux rester en dehors du mécanisme cron Drupal. J'ajouterais cependant que l'utilisation d'une entrée hook_menu () appropriée ou d'une commande drush est généralement une meilleure idée dans la plupart des circonstances.
mpdonadio
1
Travailler sur un site en ce moment avec plusieurs fichiers PHP externes devant utiliser ce type de fonctionnalité. J'ai trouvé récemment, il vous aidera peut - être: interworks.com/blogs/jkhalaj/2012/05/01/how-bootstrap-drupal
fndtn357
Vous pouvez démarrer drupal avec la commande drush src Voici quelques explications: oliverdavies.co.uk/blog/2013/11/dont-bootstrap-drupal-use-drush
ya.teck

Réponses:

14

De loin, la façon la plus simple de gérer le bootstrap est d'utiliser drush php-script , alias scr.

file.php:

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

Cli:

drush @alias scr file.php

Production:

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

De cette façon, vous n'avez rien à faire en ce qui concerne le bootstrap, drush le résoudra entièrement pour vous et vous donnera la possibilité de l'utiliser facilement sur tous les sites grâce aux alias. (Peut même fonctionner sur des sites distants, même si je n'ai pas essayé cela)

Létharion
la source
Si vous souhaitez le faire sur un site distant, le script doit être distant (voir drupal.stackexchange.com/questions/98098 ). Si jamais j'ai du temps libre (ha!), J'essaierai un patch pour cela.
mpdonadio
C'est vraiment la façon la plus simple de le faire et devrait obtenir plus de votes positifs.
Bala Clark
Que doit-on faire exactement @alias? Je reçois seulement un Could not find the alias @alias. Malheureusement, le lien que vous avez fourni est rompu. Pourriez-vous s'il vous plaît le corriger et développer votre explication?
leymannx
@leymannx Hé, désolé, je n'ai pas remarqué votre question avant. J'ai mis à jour le lien vers la documentation. Cependant, je n'ai pas développé la partie alias, car les alias drush sont vraiment hors de portée pour cette question particulière.
Letharion
11

votre bootstrap Drupal 7 autonome n'est pas tout à fait correct.

Essaye ça:

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

J'espère que cela t'aides.

Zydrunas Tamasauskas
la source
Hmm. Il échoue silencieusement sur cette ligne: $ users = views_get_view_result ('userlist', 'uid_list'); Ai-je raison de dire que votre appel drupal_override_server_variables doit pointer vers l'emplacement de mon fichier php?
Joren
Oui tu as raison. Ce bootstrap charge uniquement la couche de base de données, mais pas les modules. Vous devez invoquer le hook init du module pour que les vues utilisent sa fonctionnalité ou inclure le fichier de module responsable du traitement des données ici: require_once DRUPAL_ROOT . '...'; // include required module files to work with here
Zydrunas Tamasauskas
J'ai inclus common.inc, views.module et ctools.module car les erreurs rendaient évident qu'elles étaient nécessaires. Après ces 3, j'ai cessé de recevoir des erreurs et il est mort en silence. Je ne sais pas où aller d'ici.
Joren
Faites des impressions après chaque inclusion et voyez où elles sont restées. Vous saurez alors ce qui ne va pas. En option, essayez de faire un bootstrap complet et voyez ce qui se passe.
Zydrunas Tamasauskas
2

c'est assez:

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

La dernière erreur

Avertissement: include_once (sites / all / modules / views_bulk_operations / actions / archive.action.inc): échec de l'ouverture du flux: aucun fichier ou répertoire de ce type dans views_bulk_operations_load_action_includes () (ligne 56 de / var / www / clients / client1 / web15 / web / sites / all / modules / views_bulk_operations / views_bulk_operations.module).

est un bug dans VBO. views_bulk_operations_load_action_includes () n'utilise pas DRUPAL_ROOT lors de l'utilisation de include_once. Je déposerais un bogue et le corrigerais dans VBO.

L'autre erreur (les 2 sont liées les unes aux autres) peut être liée au fait que _system_rebuild_module_data () n'utilise pas DRUPAL_ROOT lors de l'accès au fichier .info des modules. Je mettrais des points d' arrêt dans system_rebuild_module_data () pour la variable $ modules et voir si vous pouvez le localiser . Une fois de plus, signalez un bug avec drupal core car je ne vois pas ce problème dans la file d'attente.

Bonne chance!

mikeytown2
la source