DrupalのさまざまなCMSからサイトをインポートする

Drupalを仕事で定期的に使用するすべての人は、他のCMSで実行されているサイトを転送する問題、または単にDrupalプラットフォームにデータをインポートするタスクに問題があると思います。



このようなタスクは定期的に発生しますが、すべてのインポートを行う前に、必要な情報をDrupalデータベースに直接書き込むphpでスクリプトを作成します。 もちろん、Drupal APIを使用してデータを追加できるメカニズムがあることは知っていましたが、どうにかしてそれらを処理するのが面倒で、データベースに直接書き込むスクリプトは非常に迅速に記述されています。



Drupalのサイトが非常にシンプルで、複雑なモジュールを使用していない(そしてそれらが十分でない)場合、このインポートの原則(データベースへの直接書き込み)は正当化されます。 しかし、多くのモジュールとその複雑な設定がある非常に複雑なサイトにデータを転送する必要がある場合はどうすればよいでしょうか?



この場合、Drupal APIの知識は非常に役立ちます。 すべての相互接続されたテーブルの正しい更新に関するすべての作業は、すべてのトリッキーな設定を考慮して、Drupalによって行われます。



結局のところ、Drupal APIの使用はそれほど単純ではなく、非常に単純です。 これについては、今日の記事になります。



そのため、Drupalにはいくつかのタイプのコンテンツを含むサイトがあり、それぞれのタイプに写真付きの追加フィールドが追加され(CCKが使用されます)、多数のビューが使用され(ビューが使用されます)、ImageCacheが写真のカットに使用されます(非常にバグの多いものですが、これまでのところ何もありません)。 このサイトはDrupal 6で動作します。他のバージョンでも似ていると思いますが、おそらくコードをわずかに修正する必要があるだけです。 それらのAPIはわずかに異なります。



データインポートスクリプトは、サイトのルートに配置され、http-request(hxxp://site.ru/import.phpなど)を介して呼び出されます。 インポートのためにデータを転送する方法(他のデータベースを使用する、ディスク上のファイルを読み取る、またはPOSTデータを介して)は、すでにあなたのビジネスであり、本質は変わりません。



まず、スクリプトの冒頭に次のコードを配置します。



require_once 'includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
      
      







このコードは、Drupalコアをロードし、サイトデータベースに接続するために必要なすべての設定を行います。



次に、データソースに接続し、必要なデータをダウンロードする必要があります。



サイトにニュースを追加する必要があるとします。そのために、次のコードを記述します。



 $node = new stdClass(); $node->title = " "; $node->body = "<p>HTML- </p>"; $node->teaser = $node->body; $node->type = "news"; $node->created = time(); //   $node->changed = $node->created; //   $node->status = 1; //   $node->format = 1; //   Filtered HTML $node->comment = 2; //   $node->uid = 0; //   "",   uid=1,      $node->language = 'ru'; //     node_save($node); $new_id = $node->nid;
      
      







新しいノードを作成するには、stdClassクラスのインスタンスを作成し、必要なデータを入力する必要があります。 この例では、ニュースの見出し、本文、ティーザーが示されています。 コンテンツのタイプ(タイプ)「ニュース」を指定したため、サイトにニュースが表示されます。 タイプは他のものでも構いません。 Drupalのほとんどすべては、ノードの概念を通じて行われます。



実際には、Drupal APIの使用は1行で行われます。node_saveメソッドの呼び出しで、ノードデータの入力されたクラスインスタンスが渡されます。 このメソッドはノード、node_revisions、および場合によっては他の関連テーブルに記録するため、これについて考える必要はありません。



記録されたノードの識別子を取得したい場合、node_saveを呼び出した直後に変数$ node-> nidの値を読み取ります(関数自体が新しいプロパティを追加し、そこに値を書き込みます)。



次に、ニュースに追加のCCKフィールドを追加する必要があります。 私の場合、これはニュースの画像を表示するために使用されるfield_imgフィールドであり、画像のサムネイルまたはわずかに縮小されたコピーを表示する必要がある場合はImageCacheが使用されます。 画像はさまざまなサイズにすることができ、ImageCacheを介したすべての画像は指定されたサイズに調整されます。



ノードに新しいフィールドを追加するには、Drupalで「ファイル」として画像を追加し、受信した「ファイル」識別子を使用して、CCKフィールドに必要なすべてのデータを書き留める必要があります。



 $file = new stdClass(); $file->uid = 0; $file->filename = "newsimage.jpeg"; $file->filepath = "files/newsimage.jpeg"; $file->filemime = file_get_mimetype($file->filename); $file->filesize = filesize($filepath); $file->status = 1; $file->timestamp = time(); $file->origname = ""; drupal_write_record('files', $file); $file_id = $file->fid;
      
      







ここで、filenameはファイルの名前、filepathは(サイトのルートからの)相対パスを持つファイルの名前です。この場合、すべての写真がfilesフォルダーにあると想定しています。 次に、画像のMIMEタイプを示す関数呼び出し(「image / jpeg」を手で簡単に指定できます)を実行し、ファイルサイズを計算します。 その後、drupal_write_record api関数が呼び出されます。これは、$ files構造をファイルシステムテーブルに単純に書き込みます。 これは、Drupalデータベースにデータを書き込む機能に関するラッパーの類似物であることがわかりました。



次に、CCKフィールドのすべてのデータをノードに追加して保存します。



 $node->field_img[0]['fid'] = $file->fid; $node->field_img[0]['data']['alt'] = $node->title; $node->field_img[0]['data']['title'] = $node->title; node_save($node);
      
      







最後に、ImageCacheを使用した非常に奇妙で不快な不具合の解決策を示します。 モジュール自体は完全に機能し、非常に便利です。Drupalが適切なタイミングで呼び出す必要はありません。 サイトにニュースをインポートしてページを更新した後、ImageCacheのサムネイルは表示されません。



問題は、画像付きのファイルにアクセスするときに404エラーが発生したときにのみImageCacheが呼び出されることです。 原則として、ImageCacheはこのエラーをキャッチする必要があり、存在しないピクチャにアクセスする場合は、それを生成してから、200番目のコードでピクチャ自体を発行します。 しかし、これは起こりません。



私はたくさんのフォーラムを調べ、自分でコードを掘り下げようとしましたが、なぜ画像が生成されなかったのか理解できませんでした。 したがって、ニュースをインポートした時点で、Drupal APIを直接使用してImageCache経由で画像を生成することにしました。



写真と共にCCKフィールドを保存した直後に、次のコードを呼び出します。



 //  thumbnail- $preset = imagecache_preset_by_name("thumb"); $dst = imagecache_create_path($preset['presetname'], $file->filepath); imagecache_build_derivative($preset['actions'], $filepath, $dst); //  preview- $preset = imagecache_preset_by_name("preview"); $dst = imagecache_create_path($preset['presetname'], $file->filepath); imagecache_build_derivative($preset['actions'], $filepath, $dst);
      
      







その後、適切なフォルダに適切な写真が作成され、この有名なグリッチが消えます。



完全なコードは次のとおりです。



 require_once 'includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); $node = new stdClass(); $node->title = " "; $node->body = "<p>HTML- </p>"; $node->teaser = $node->body; $node->type = "news"; $node->created = time(); //   $node->changed = $node->created; //   $node->status = 1; //   $node->format = 1; //   Filtered HTML $node->comment = 2; //   $node->uid = 0; //   "",   uid=1,      $node->language = 'ru'; //     node_save($node); $new_id = $node->nid; $file = new stdClass(); $file->uid = 0; $file->filename = "newsimage.jpeg"; $file->filepath = "files/newsimage.jpeg"; $file->filemime = file_get_mimetype($file->filename); $file->filesize = filesize($filepath); $file->status = 1; $file->timestamp = time(); $file->origname = ""; drupal_write_record('files', $file); $file_id = $file->fid; $node->field_img[0]['fid'] = $file->fid; $node->field_img[0]['data']['alt'] = $node->title; $node->field_img[0]['data']['title'] = $node->title; node_save($node); //  thumbnail- $preset = imagecache_preset_by_name("thumb"); $dst = imagecache_create_path($preset['presetname'], $file->filepath); imagecache_build_derivative($preset['actions'], $filepath, $dst); //  preview- $preset = imagecache_preset_by_name("preview"); $dst = imagecache_create_path($preset['presetname'], $file->filepath); imagecache_build_derivative($preset['actions'], $filepath, $dst);
      
      







使用した材料:

api.drupal.org/api/drupal/6-公式ドキュメント

www.drupal.ru- 「データのインポート」のサイトを検索



PS:私が提案した方法の使用は、Drupal APIに限定されず、接続されたモジュールの関数を直接呼び出すこともできます。これはImageCache関数の例で示されています。



All Articles