正确的方法来创建作为文件名的节点别名

时间:2012-12-22 05:09:51

标签: php drupal drupal-7

我正在使用FileFeild Image字段来获取图像,然后我使用File (Field) Paths将文件重命名为随机字符。

我正在尝试做什么

  • 图片内容类型
  • 有一个FileField图像,field_image
  • 使用内容类型上传图片,example.jpg
  • example.jpg被重命名为Ax54jk.jpg(文件字段路径)
  • mysite.com/node/523已更改为mysite.com/Ax54jk

问题

图片确实已使用File (Field) Paths重命名,并且效果很好。麻烦的是我无法让节点重命名以匹配新重命名的文件名。

我尝试了什么

我尝试使用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此时似乎没有所有文件数据,但尚未可用。

问题

有人知道怎么做,即使我写了一个自定义模块吗?什么钩子可以让我这样做?

是否可以通过Custom Tokens获取文件名?

答案

我最终在File(Field)Paths代码中找到了一个钩子来实现和使用下面的@ Clive代码,我能够创建一个别名。我创建了一个模块来执行此操作,因为文件(字段)路径似乎不直接与Pathauto一起使用。

hook_filefield_paths_process_file

1 个答案:

答案 0 :(得分:2)

该节点已保存在hook_node_insert() / hook_node_update()中,这就是您的更改未被反映的原因。

幸运的是hook_node_presave()。如果你把你的代码放在那个钩子里它应该可以工作。

文件字段只包含文件的ID,因此您需要加载该对象以获取文件名:

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

但是,如果安装Pathauto模块,您将能够为包含图像字段文件名的图像节点类型分配模式,而不需要任何代码。