web-dev-qa-db-fra.com

Importer par programme un flux

Je peux importer avec succès du contenu distant à l'aide du module Flux en cliquant manuellement sur le bouton Importer. J'ai besoin d'exécuter le processus d'importation à partir du code, soit à partir d'un module ou en exécutant PHP code du module Rules.

J'ai essayé le code suivant dans un module personnalisé.

function imports_cron_cron(){
  drupal_set_message('Import-CRON responding to cron execution! ...');
  $importer_id = 'publications_import';
  $url = "http://xml/url";
  $feeds_source = feeds_source($importer_id);
  $feeds_config = $feeds_source->getConfigFor($feeds_source->importer->fetcher);
  $feeds_config['source'] = $url;
  $feeds_source->setConfigFor($feeds_source->importer->fetcher, $feeds_config);
  $feeds_source->save();
  $feeds_source->startImport();

  drupal_set_message(' .... ENDING IMPORTS-CRON CALL!');
}

Les appels drupal_set_message() sont exécutés avec succès, mais aucun nœud n'est importé.

Quelqu'un peut-il aider s'il vous plaît?

6
sisko

Votre code semble correct. J'utilise un code similaire dans l'un de mes projets (c'est un importateur csv, concept similaire):

function custom_function($importer_id, $csvfile_path) {
  // Load the Feeds Source object.
  $source = feeds_source($importer_id);
  // Load the source fetcher config.
  $fetcher_config = $source->getConfigFor($source->importer->fetcher);
  $fetcher_config['source'] = $csvfile_path;
  $source->setConfigFor($source->importer->fetcher, $fetcher_config);
  $source->save();
  $source->startImport();
}

Assurez-vous que vous utilisez la configuration de premier plan, de cette façon, le processus par lots pourrait être exécuté "à l'intérieur" drupal en affichant la barre de progression. Ou vous pouvez la forcer:

// Tweak the importer configuration, to enable "Process in the background".
$config = array(
  'process_in_background' => TRUE,
);
$source->importer->addConfig($config);

// Execute the import.

Une autre approche pourrait être de le programmer

// Schedule the import, and make sure importer is scheduled, too.
$source->schedule();
$source->importer->schedule();

Ceci est un bon article sur l'importateur de flux

13
jorgetutor

J'ai vu beaucoup de choses à ce sujet. Heres my take, je veux pouvoir le faire à partir de la ligne de commande, et pouvoir le faire à partir d'un profil d'installation.

donc en prenant des indices des réponses précédentes, et de la documentationIvev /trouvé, je suis venu à la réalisation que

n'utilisez pas l'api batch pour cela sauf si

a) vous le faites depuis le formulaire api (un utilisateur clique)

ou

b) vous écrivez un commande drush .

c'est donc ce que je travaille dans une installation de module

function load_data(){

// Files to import in specific order.
  $files = array(
    'challenge_importer' => 'data/challenges.csv',
);

$file_location_base = drupal_get_path('module', 'challenge');
foreach ($files as $feed => $file) {

$feedSource = feeds_source($feed);
// Set the file name to import
$filename = $file_location_base.'/' . $file;
if (!file_destination($filename, FILE_EXISTS_ERROR)) {
  $config = $feedSource->getConfig();
  $config['FeedsFileFetcher']['source'] = $filename;
  $feedSource->setConfig($config);
  $feedSource->save();
    while (FEEDS_BATCH_COMPLETE != $feedSource->import());
    }
  }
}

  • challenge_importer est un importateur de flux,
  • le défi est le module.
  • les données sont stockées dans le module/données

    et avec cette structure, vous pouvez importer plusieurs fichiers dans un ordre défini.

1
Tim Marsh

Je crois que vous devez faire quelque chose de plus

$node = new stdClass();
$node->type = 'feed';
$node->title = 'My feed';
$node->feeds['FeedsHTTPFetcher']['source'] = 'http://example.com/rss.xml';
node_save($node);

Vous devriez jeter un œil à https://drupal.org/node/6227 (Opérations programmatiques).

0
Steven