2

FileFeild Image フィールドを使用して画像を取得し、File (Field) Pathsを使用してファイルの名前をランダムな文字に変更しています。

私がやろうとしていること

  • 画像コンテンツ タイプ
  • FileField 画像、field_image を持っています
  • コンテンツ タイプ example.jpg を含む画像をアップロードする
  • example.jpg は Ax54jk.jpg (ファイル フィールド パス) に名前が変更されました
  • mysite.com/node/523 は mysite.com/Ax54jk に変更されます

問題

画像はファイル(フィールド)パスで名前が変更され、完全に機能します。問題は、新しく名前が変更されたファイル名と一致するようにノードの名前を変更できないことです。

私が試したこと

の Image コンテンツ タイプのパターンを設定する Pathauto を使用しようとしましたが[node:field_image]、Pathauto は最初のノード作成時にエイリアスを追加できません。これは、フック呼び出しの順序に関係していると思われます。

私もこのフックを試しました

function MYMODULE_node_insert($node) {
 if ($node->type == 'image') {
   $filename = $node->field_image['und'][0]['filename'];
   // do stuff
   $node->path['alias'] = $result;
 }
}

このフックで$node->field_imageは、この時点ですべてのファイル データが存在していないようで、まだ利用できません。

質問

カスタムモジュールを書いたとしても、これを行う方法を知っている人はいますか? これを可能にするフックは何ですか?

代わりにカスタムトークンでファイル名を取得する方法はありますか?

答え

私は最終的にファイル (フィールド) パス コードで実装するフックを追跡し、以下の @Clive のコードを使用して、エイリアスを作成することができました。File (Field) Paths は Pathauto で直接動作しないように見えるため、これを行うモジュールを作成しました。

hook_filefield_paths_process_file

4

1 に答える 1

2

ノードはすでにhook_node_insert()/に保存されhook_node_update()ているため、変更が反映されていません。

幸いにもありhook_node_presave()ます。コードをそのフックに入れると、動作するはずです。

file フィールドにはファイルの ID のみが含まれるため、そのオブジェクトをロードしてファイル名を取得する必要があります。

$items = field_get_items('node', $node, 'field_image');
if ($items) {
  $file = file_load($items[0]['fid']);
  $filename = $file->filename;
  // ...
}

ただし、 Pathautoモジュールをインストールすると、コードをまったく使用せずに、イメージ フィールドのファイル名を含むイメージ ノード タイプにパターンを割り当てることができます。

于 2012-12-22T11:52:20.670 に答える