170 lines
5.3 KiB
PHP
170 lines
5.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Destination class implementing migration into media entities.
|
|
*/
|
|
class MigrateDestinationMedia extends MigrateDestinationFile {
|
|
/**
|
|
* Call this from the prepare() method of a migration that contains media
|
|
* image files, if you want to rewrite the IMG tags into media references.
|
|
*
|
|
* @param $entity
|
|
* Entity object being built.
|
|
* @param $field
|
|
* Name of the text field within the entity to be modified. Defaults to 'body'.
|
|
*/
|
|
static public function rewriteImgTags($entity, $field = 'body') {
|
|
if (is_array($entity->$field)) {
|
|
migrate_instrument_start('MigrateDestinationMedia rewriteImgTags');
|
|
foreach ($entity->$field as $language => $values) {
|
|
$body = $values[0]['value'];
|
|
break;
|
|
}
|
|
// Quickly skip any non-candidates
|
|
if (!stristr($body, '<img')) {
|
|
migrate_instrument_stop('MigrateDestinationMedia rewriteImgTags');
|
|
return;
|
|
}
|
|
// Pass full img tags into the callback
|
|
$new_body = preg_replace_callback('|<img [^>]*>|i', array(self, 'replaceCallback'),
|
|
$body);
|
|
$entity->{$field}[$language][0]['value'] = $new_body;
|
|
migrate_instrument_stop('MigrateDestinationMedia rewriteImgTags');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* If a referenced image can be found in the files table, replace the <img> tag
|
|
* with a media JSON reference.
|
|
*
|
|
* @param array $matches
|
|
*/
|
|
static protected function replaceCallback(array $matches) {
|
|
$src_matches = array();
|
|
// Default to the original <img> tag
|
|
$result = $matches[0];
|
|
// Extract the src parameter
|
|
if (preg_match('|src=[\'"]([^\'"]+)[\'"]|i', $matches[0], $src_matches)) {
|
|
// Replace the scheme and host portions of the referenced URI with the
|
|
// Drupal scheme as it's saved in the file_unmanaged table
|
|
$src = $src_matches[1];
|
|
$fid = db_select('file_managed', 'f')
|
|
->fields('f', array('fid'))
|
|
->condition('filename', basename($src))
|
|
->execute()
|
|
->fetchField();
|
|
if ($fid) {
|
|
$image_info = array(
|
|
'type' => 'media',
|
|
'view_mode' => 'media_large',
|
|
'fid' => $fid,
|
|
'attributes' => array(
|
|
'alt' => '',
|
|
'title' => '',
|
|
'class' => 'media-image',
|
|
'typeof' => 'foaf:Image',
|
|
'wysiwyg' => 1,
|
|
),
|
|
);
|
|
// Get the height and width parameters if present
|
|
preg_match('|width=[\'"]([^\'"]+)[\'"]|i', $matches[0], $width);
|
|
preg_match('|height=[\'"]([^\'"]+)[\'"]|i', $matches[0], $height);
|
|
// image width
|
|
if ($width) {
|
|
$image_info['attributes']['width'] = $width[1];
|
|
}
|
|
// image height
|
|
if ($height) {
|
|
$image_info['attributes']['height'] = $height[1];
|
|
}
|
|
|
|
$result = '[[' . drupal_json_encode($image_info) . ']]';
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Class for creating Youtube file entities.
|
|
*/
|
|
class MigrateExtrasFileYoutube implements MigrateFileInterface {
|
|
/**
|
|
* Implementation of MigrateFileInterface::fields().
|
|
*
|
|
* @return array
|
|
*/
|
|
static public function fields() {
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Implementation of MigrateFileInterface::processFiles().
|
|
*
|
|
* @param $value
|
|
* The URI or local filespec of a file to be imported.
|
|
* @param $owner
|
|
* User ID (uid) to be the owner of the file.
|
|
* @return object
|
|
* The file entity being created or referenced.
|
|
*/
|
|
public function processFile($value, $owner) {
|
|
// Convert the Youtube URI into a local stream wrapper.
|
|
if (class_exists('MediaInternetYouTubeHandler')) {
|
|
$handler = new MediaInternetYouTubeHandler($value);
|
|
$destination = $handler->parse($value);
|
|
$file = file_uri_to_object($destination, TRUE);
|
|
}
|
|
elseif (class_exists('MediaInternetOEmbedHandler')) {
|
|
$handler = new MediaInternetOEmbedHandler($value);
|
|
$file = $handler->getFileObject();
|
|
}
|
|
else {
|
|
MigrationBase::displayMessage(t('Could not find a handler for YouTube videos'));
|
|
return FALSE;
|
|
}
|
|
|
|
// Create a file entity object for this Youtube reference, and see if we
|
|
// can get the video title.
|
|
if (empty($file->fid) && $info = $handler->getOEmbed()) {
|
|
$file->filename = truncate_utf8($info['title'], 255);
|
|
}
|
|
$file = file_save($file);
|
|
if (is_object($file)) {
|
|
return $file;
|
|
}
|
|
else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Basic support for the deprecated media field type.
|
|
class MigrateMediaFieldHandler extends MigrateFileFieldHandler {
|
|
public function __construct() {
|
|
$this->registerTypes(array('media'));
|
|
}
|
|
/**
|
|
* Implementation of MigrateFieldHandler::fields().
|
|
*
|
|
* @param $type
|
|
* The field type.
|
|
* @param $instance
|
|
* Instance info for the field.
|
|
* @param Migration $migration
|
|
* The migration context for the parent field. We can look at the mappings
|
|
* and determine which subfields are relevant.
|
|
* @return array
|
|
*/
|
|
public function fields($type, $instance, $migration = NULL) {
|
|
$fields = parent::fields($type, $instance, $migration);
|
|
unset($fields['description']);
|
|
unset($fields['display']);
|
|
$fields += array(
|
|
'title' => t('Subfield: String to be used as the title value'),
|
|
'data' => t('Subfield: Additional data about the field'),
|
|
);
|
|
return $fields;
|
|
}
|
|
}
|