2011-07-31 70 views
4

我试图以编程方式创建节点。使用带有youtube扩展名的媒体模块,我想使用YouTube数据填充字段。从我至今读,它会是这个样子:Drupal 7 - 以编程方式创建节点,添加嵌入到字段的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主题$内容变量中的信息了解到这一点。但是,这会导致“错误的文件扩展名”错误。我也尝试将整个网址放在$ file-> uri中,并使用file_get_mimetype,然后它不会抛出错误,但视频也不起作用。有谁知道如何做到这一点?

回答

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; 

这解决了大部分问题。我仍然收到一条消息,指出文件扩展名不正确,但它仍然有效。

3

我知道它是这样工作的。我正在导入需要解析的嵌入代码,有些是愚蠢的,我认为这个功能file_uri_to_object($code, $use_existing = TRUE)允许你重用被管理的网址。 $ R->视频是被解析到正确的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); 
3

一个更好的方式对于YouTube是iframe嵌入代码:

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; 
相关问题