2012-12-22 46 views
2

我使用FileFeild Image字段获取图像,然后使用File (Field) Paths将文件重命名为随机字符。创建节点别名的正确方法是文件名

我试图做

  • 图像内容类型
  • 有一个FileField或图片,field_image
  • 与内容类型
  • 上传图像,example.jpg
  • example.jpg是已更名为Ax54jk.jpg(File Field Paths)
  • 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代替文件名?

回答

我最终的文件追查(场)路径代码钩来实现,并使用@下面克莱夫的代码,我能够创建一个别名。我创建了一个模块来执行此操作,因为文件(字段)路径似乎不直接与Pathauto一起工作。

hook_filefield_paths_process_file

回答

2

节点已经被保存在hook_node_insert()/hook_node_update()这就是为什么没有被反映更改。

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

的文件字段将只包含文件的ID,所以你需要加载该对象来获取文件名:如果您安装了Pathauto模块

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

,不过,你就可以为图像节点类型分配一个模式,其中包含图像字段的文件名,根本没有任何代码。

+0

我不幸遇到了Pathauto。如果你知道如何解决它,我会很乐意尝试。如果没有,我会尝试你建议的钩子。 – Kirk

+0

我已经实现了这个钩子,并且它允许我按照您的建议将别名设置为文件名。但是,它将别名设置为mysite.com/example.jpg,而不是从mysite.com/Ax54jk.jpg的FileField Paths中重命名的文件名。对此有何建议? – Kirk

+0

我发现了一个文件(字段)路径的钩子,可让我使用您的代码进行更新。我接受你的答案,因为我花了十年的时间才弄清楚如何在代码中完成文件加载。 – Kirk