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