web-dev-qa-db-ja.com

ノードを作成/保存するときに、プログラムでファイルをファイルフィールドに割り当てる(アタッチする)方法は?

プログラムでファイルを(アップロードではなく)ノードに割り当てようとしています。

これはシナリオです:

私は2000個のノードを作成し、2000個のPDFファイルがあります(ノードごとに1つのPDF)。これらのファイルをDrupalインターフェイス経由でアップロードしたくありません。これらすべてのPDFファイルをFTP経由でアップロードします。

これらのPDFファイルには適切な名前が付けられています。つまり、すべてのファイルに_{field_magazine_name}-{field_issue_number}.pdf_(sites/default/files /の下など)の標準化された名前がありますたとえばpdf)。

私がやりたいことは、ノードの作成/保存中にこれらのPDFファイルを関連ノードに割り当てることです。


可能な方法1

これを行う1つの方法は、 ファイルフィールドソース モジュールを使用することです。 enter image description here

リモートファイル転送はいくつかのJavaScriptコードで使用できると思います。リモートファイル転送の入力には、必要なフィールドを自動的に入力でき、機能します(たとえば、_http://example.com/sites/default/files/pdf/{field_magazine_name}-{field_issue_number}.pdf_)...しかし、ノードを作成しません手動でFeeds を使用してノードを作成しています。したがって、JavaScriptを使用することは、私が使用できる方法ではありません。

ノードを作成/保存するときに、ファイルをファイルフィールドにプログラムで割り当てる(アタッチする)方法はありますか?

4
herci

私も同じような状況でした。私の状況は、別のコンテンツタイプノードの作成時にノードにファイルを添付することです。これをhook_node_insertで行いました

  1. 最初に、すべてのファイルを/ default/files /の一時ディレクトリにアップロードしました。
  2. 次に、ノードごとに、ファイル属性を使用して新しいファイルオブジェクトを作成しました。
  3. 次に、その特定のファイルを、ファイルを配置する場所に移動しました。これにより、fidの完全なファイルオブジェクトが生成されます。
  4. 次に、このファイルオブジェクト属性をファイルフィールドに割り当て、ノードを保存します。

使用されるコードは次のとおりです。

$source_node = node_load($nid);
$filename = $bio_file_name; //your specific filename 
$dir = 'public://temp-path/'.$filename; //path to specific file with name
$file_size = filesize($dir);

//New file object
$file = new stdClass;
$file->uid = $source_node->uid;
$file->filename = $filename;
$file->uri = $dir;
$file->filemime = file_get_mimetype($dir);
// Make it permanent, otherwise it will get deleted later.
$file->status = FILE_STATUS_PERMANENT;
// Save file object to make it a 'managed file'.
$file_obj = file_move($file, 'public://newpath', FILE_EXISTS_REPLACE);

$source_node->your-file-field-name['und'][0] = array(
 'fid'  => $file_obj->fid,
 'uid'  => $file_obj->uid,
 'filename'  => $file_obj->filename,
 'uri'  => $file_obj->uri,
 'filemime'  => $file_obj->filemime,
 'filesize'  => $file_obj->filesize,
 'status'  => 1,
 'display'  => 1,
 'description'  => '', 
 );

 node_save($source_node); 

これがお役に立てば幸いです。

4
Abin

ファイル/画像フィールドを追加

// Some file on our system
$file_path = drupal_realpath('somefile.png'); // Create a File object
$file = (object) array(
  'uid' => 1,
  'uri' => $file_path,
  'filemime' => file_get_mimetype($file_path),
  'status' => 1,
); 
$file = file_copy($file, 'public://'); // Save the file to the root of the files directory. You can specify a subdirectory, for example, 'public://images' 
$node->field_image[LANGUAGE_NONE][0] = (array)$file; //associate the file object with the image field:

詳細

2
Adi

Abinに加えて、ノードの保存後に次のコードを追加して、ファイルの使用を設定します。

file_usage_add($file_obj, 'file', 'node', $source_node->nid);

drupal docs を参照してください。

これとは別にもう1つ、「und」の代わりにLANGUAGE_NONEを使用することをお勧めします。

1