我正在尝试以编程方式创建节点。使用带有youtube扩展程序的媒体模块,我想用youtube数据填充一个字段。从我到目前为止所读到的内容来看,它看起来像这样:
<?php
// $value in this case is the youtube ID.
$file = new stdClass();
$file->uid = 1;
$file->filename = $value;
$file->uri = 'youtube://v/' . $value;
$file->filemime = 'video/youtube';
$file->type = 'video';
$file->status = 1;
$youtube = file_save($file);
node->field_youtube[$node->language]['0']['fid'] = (array) $youtube->fid;
?>
我通过查看bartik主题中$ content变量中的信息来了解这一点。但是,这会导致“错误的文件扩展名”错误。我也尝试将整个url放在$ file-&gt; uri中并使用file_get_mimetype,然后它没有抛出错误,但视频也无效。有谁知道怎么做?
答案 0 :(得分:5)
我找到了答案。函数file_save仅检查文件ID是否已存在于数据库中。但是,youtube uri字段不允许重复。因此我从file_example模块中窃取了这个函数。它检查文件是否存在该uri,如果存在,则加载该对象。
function file_example_get_managed_file($uri) {
$fid = db_query('SELECT fid FROM {file_managed} WHERE uri = :uri', array(':uri' => $uri))->fetchField();
if (!empty($fid)) {
$file_object = file_load($fid);
return $file_object;
}
return FALSE;
}
所以最后我简单地写了一个if语句,如下:
$file_exists = wthm_get_managed_file('youtube://v/' . $value);
if (!$file_exists) {
$file_path = drupal_realpath('youtube://v/' . $value);
$file = new stdClass();
$file->uid = 1;
$file->filename = $value;
$file->uri = 'youtube://v/' . $value;
$file->filemime = file_get_mimetype($file_path);
$file->type = 'video';
$file->status = 1;
$file_exists = file_save($file);
}
$node->field_youtube[$node->language]['0'] = (array) $file_exists;
这解决了大多数问题。我仍然收到一条消息说文件扩展名不好,但无论如何都可以。
答案 1 :(得分:3)
我让它像这样工作。我正在导入需要解析的嵌入代码,有些是dupes,我认为此函数file_uri_to_object($code, $use_existing = TRUE)
允许您重用托管网址。
$ r-&gt; video是youtube的iframe嵌入代码,可以解析为正确的uri格式
// include the media youtube handler.inc file to use the embed code parsing
$path = drupal_get_path('module','media_youtube').'/includes/MediaInternetYouTubeHandler.inc';
require_once($path);
$code = MediaInternetYouTubeHandler::parse($r->video);
$youtube = file_uri_to_object($code, $use_existing = TRUE);
$youtube->display = 1;
$youtube = file_save($youtube);
$node->field_video[$lang][0] = (array)$youtube;
node_save($node);
答案 2 :(得分:3)
更好的方式:
module_load_include('inc', 'media_youtube', 'includes/MediaInternetYouTubeHandler.inc');
$obj = new MediaInternetYouTubeHandler($url);
$file = $obj->getFileObject();
$file->display = 1;
file_save($file);
$product->field_product_video[LANGUAGE_NONE][] = (array) $file;