web-dev-qa-db-ja.com

プログラムでフィードをインポートする

フィードモジュールを使用してリモートコンテンツを正常にインポートできます。手動でインポートボタンをクリックします。モジュールから、またはルールモジュールからPHPコードを実行して、コードからインポートプロセスを実行する必要があります。

カスタムモジュールで次のコードを試しました。

_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!');
}
_

drupal_set_message()呼び出しは両方とも正常に実行されますが、ノードはインポートされません。

誰か助けてもらえますか?

6
sisko

コードは問題ないようです。私は私のプロジェクトの1つ(これはcsvインポーター、同様の概念)でいくつかの同様のコードを使用します:

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

フォアグラウンド構成を使用していることを確認してください。これにより、バッチプロセスを「内部」で実行できますdrupalプログレスバーが表示されます。または、強制することもできます。

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

// Execute the import.

別のアプローチはそれをスケジュールすることです

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

これはフィードインポーターに関する優れた記事です

13
jorgetutor

私はこれについてたくさん見ました。これが私の見解です。コマンドラインからこれを実行でき、インストールプロファイルから実行できるようにしたいと考えています。

したがって、以前の回答と documentationIveseen /からヒントを得て、Iveは、

このためにバッチAPIを使用しないでくださいunless

a)フォームapiからこれを実行している(ユーザーがクリックする)

または

b) drushコマンド を作成している。

これがモジュールのインストールで機能したものです

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はフィードインポーターです。
  • 課題はモジュールです。
  • データはモジュール/データに保存されます

    この構造では、複数のファイルを定義された順序でインポートできます。

1
Tim Marsh

私はあなたがもっと何かをする必要があると信じています

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

https://drupal.org/node/6227 (プログラムによる操作)をご覧ください。

0
Steven