2

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

我正在尝试做的事情

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

问题

该图像确实使用文件(字段)路径重命名,并且效果很好。问题是我无法让节点重命名以匹配新重命名的文件名。

我试过的

我尝试使用 Pathauto,在其中为 Image 内容类型设置了模式[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 代码,我能够创建一个别名。我创建了一个模块来执行此操作,因为文件(字段)路径似乎不能直接与 Pathauto 一起使用。

hook_filefield_paths_process_file

4

1 回答 1

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模块,您将能够将模式分配给包含图像字段文件名的图像节点类型,而无需任何代码。

于 2012-12-22T11:52:20.670 回答