【问题标题】:Proper way to create a node alias that is the filename创建作为文件名的节点别名的正确方法
【发布时间】:2012-12-22 05:09:50
【问题描述】:

我使用 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 来获取文件名?

回答

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

hook_filefield_paths_process_file

【问题讨论】:

    标签: php drupal drupal-7


    【解决方案1】:

    该节点已保存在 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 模块,您将能够为图像节点类型分配一个模式,其中包含图像字段的文件名,而无需任何代码。

    【讨论】:

    • 不幸的是,我遇到的问题是 Pathauto。如果你知道如何解决它,我会很高兴尝试它。如果没有,我会试试你建议的钩子。
    • 我已经实现了钩子,它允许我像你建议的那样将别名设置为文件名。但是,它将别名设置为 mysite.com/example.jpg,而不是从 mysite.com/Ax54jk.jpg 的 FileField Paths 重命名的文件名。对此有何建议?
    • 我找到了一个文件(字段)路径挂钩,让我可以使用您的代码进行更新。我接受你的回答,因为我需要十年时间才能弄清楚如何在代码中加载文件。
    • 好东西很高兴你把它整理好了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多