123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- <?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;
- }
- }
|