php - Drupal 7 - 以编程方式创建节点,将 youtube 嵌入到字段中

标签 php drupal-7

我正在尝试以编程方式创建节点。使用带有 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;  

这解决了大部分问题。我仍然收到一条消息说文件扩展名错误,但它仍然有效。

关于php - Drupal 7 - 以编程方式创建节点,将 youtube 嵌入到字段中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6893134/

相关文章:

drupal-7 - Drupal 7如何防止多次表单提交(服务器端)

Drupal 7 - 使用 managed_file 类型上传文件后自动提交表单

php - 在 MySQL PHP 中更新查询

PHP停止构造函数的最佳方法

php - Drupal 电子邮件变量未出现

html - 从父样式中排除 div

php - 我怎样才能提取 drupal-x.x.tar.gz 文件

javascript - 使用 Javascript 在 URL 中发送多个 GET 变量

php - SQL 查询优化帮助

javascript - Ajax 无法在 Codeigniter 的页面中工作