Drupal 7 -以编程方式创建节点,在字段中添加youtube嵌入


Drupal 7 - create node programatically, adding a youtube embed to a field

我试图以编程方式创建节点。使用媒体模块与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->uri中,并使用file_get_mimetype,然后它没有抛出错误,但视频也不起作用。有人知道怎么做吗?

我找到了答案。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;  

这解决了大多数问题。我仍然得到一个消息,说错误的文件扩展名,但它仍然工作。

我让它像这样工作。我正在导入需要解析的嵌入代码,有些是欺骗,我认为这个功能file_uri_to_object($code, $use_existing = TRUE)允许您重用托管的url。$r->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); 

一个更好的方法:

    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;