it-swarm.asia

كيفية إضافة صورة برمجياً من URL خارجي باستخدام وحدة الوسائط؟

أرغب في إضافة صورة برمجيًا من عنوان URL خارجي والحصول على متجر الوحدة النمطية وعرض نسخة محلية من الصورة. كيف أقوم بذلك؟ عادةً ما أقوم بالنقر فوق الزر "تحديد الوسائط" أثناء إنشاء عقدة جديدة ولكني أريد القيام بذلك من خلال التعليمات البرمجية.

19
Matthew Hui

هذه إجابة جزئية لسؤالك ، لأنني أحاول أن أفعل شيئًا مشابهًا ولكن مع مواد الفيديو.

يمكنك إنشاء العقدة كنوع محتوى ، وحفظ نوع الوسائط الذي تحتاجه (إلقاء نظرة من خلال رمز الوسائط على نوع/نوع MIME والوظائف ذات الصلة التي تحتاج إلى الاتصال بها). ربما ستحتاج إلى تعيين حقل أصول الوسائط المتعددة واستخدام محدد ملف الوسائط في نوع الحقل.

الشيء الذي أواجه مشكلة هو الحصول على المتصفح لإظهاره في العقدة التي تم إنشاؤها ، والتي أعمل عليها حاليًا.

تحديث

بعد أن حصلت على أبعد قليلا. بمجرد حفظ ملف الوسائط (باستخدام وسائط API) ، قم بربط معرف الملف بمعرف العقدة باستخدام file_usage_add () . ربما ستحتاج أيضًا إلى ربط الملف في الحقل المضاف عند إنشاء حقل أصول الوسائط.

0
ipe

تأكد من أن php.ini الخاص بك يسمح allow_url_fopen. ثم يمكنك استخدام شيء مثل هذا في وحدتك:

$image = file_get_contents('http://drupal.org/files/issues/druplicon_2.png'); // string
$file = file_save_data($image, 'public://druplicon.png',FILE_EXISTS_REPLACE);

استخدم دالة file_get_contents () الخاصة بـ php

http://www.php.net/manual/en/function.file-get-contents.php

ثم استخدم Drupal API

http://api.drupal.org/api/drupal/includes--file.inc/function/file_save_data/7

ثم يجب أن تكون قادرًا على الاتصال به باستخدامه وحفظه في العقدة وما إلى ذلك.

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

تحرير:

كما هو موضح في التعليقات ، يمكنك استخدام الوظيفة system_retrieve_file راجع: https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7

13
tecjam

هنا مثال عملي.

$remoteDocPath = 'http://drupal.org/files/issues/druplicon_2.png';
$doc = system_retrieve_file($remoteDocPath, NULL, FALSE, FILE_EXISTS_REPLACE);
$file = drupal_add_existing_file($doc);

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

function drupal_add_existing_file($file_drupal_path, $uid = 1, $status = FILE_STATUS_PERMANENT) {
  $files = file_load_multiple(array(), array('uri' => $file_drupal_path));
  $file = reset($files);

  if (!$file) {
    $file = (object) array(
        'filename' => basename($file_drupal_path),
        'filepath' => $file_drupal_path,
        'filemime' => file_get_mimetype($file_drupal_path),
        'filesize' => filesize($file_drupal_path),
        'uid' => $uid,
        'status' => $status,
        'timestamp' => time(),
        'uri' => $file_drupal_path,
    );
    drupal_write_record('file_managed', $file);
  }
  return $file;
}
6
hugronaphor

هذه ليست إجابة مباشرة ، ولكن تأكد من أنك تعرف بالفعل عن الوحدة Filefield Sources ، والتي تقوم بذلك للصور بشكل عام. قد تلبي احتياجاتك بمفردها ؛ لا أعرف ما إذا كانت مفيدة مع Media.

1
rfay

بالإضافة إلى إجابةtecjam: يجب عليك استخدام drupal_http_request () بدلاً من file_get_contents () ، يمنحك المزيد من التحكم في معالجة. ولكن في المجمل تعمل هذه الطريقة كما هو متوقع.

0
Kirill Roskolii
// This is a PHP function to get a string representation of the image file.
$image = file_get_contents($path); 

// A stream wrapper path where you want this image to reside on your file system including the desired filename.
$destination = 'public://path/to/store/this/image/name.jpg'; 

$file = file_save_data($image, $destination, FILE_EXISTS_REPLACE);

if (is_object($file)) { // if you get back a Drupal $file object, everything went as expected so make the status permenant
  $file->status = 1;
  $file = file_save($file);
}

return $file;
0
mrded