123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- <?php
- /**
- * @file
- * Support for migration from files sources.
- */
- /**
- * Implementation of MigrateList, for retrieving a list of IDs to be migrated
- * from a directory listing. Each item is a file, it's ID is the path.
- */
- class MigrateListFiles extends MigrateList {
- protected $listDirs;
- protected $baseDir;
- protected $fileMask;
- protected $directoryOptions;
- /**
- * Constructor.
- *
- * @param $list_dirs
- * Array of directory paths that will be scanned for files. No trailing
- * slash. For example:
- * array(
- * '/var/html_source/en/news',
- * '/var/html_source/fr/news',
- * '/var/html_source/zh/news',
- * );
- * @param $base_dir
- * The base dir is the part of the path that will be excluded when making
- * an ID for each file. To continue the example from above, you want base_dir
- * to be = '/var/html_source', so that the files will have IDs in the format
- * '/en/news/news_2011_03_4.html'.
- * @param $file_mask
- * Passed on and used to filter for certain types of files. Use a regular
- * expression, for example '/(.*\.htm$|.*\.html$)/i' to match all .htm and
- * .html files, case insensitive.
- * @param $options
- * Options that will be passed on to file_scan_directory(). See docs of that
- * core Drupal function for more information.
- */
- public function __construct($list_dirs, $base_dir, $file_mask = NULL, $options = array()) {
- parent::__construct();
- $this->listDirs = $list_dirs;
- $this->baseDir = $base_dir;
- $this->fileMask = $file_mask;
- $this->directoryOptions = $options;
- }
- /**
- * Our public face is the directories we're getting items from.
- */
- public function __toString() {
- if (is_array($this->listDirs)) {
- return implode(',', $this->listDirs);
- }
- else {
- return $this->listDirs;
- }
- }
- /**
- * Retrieve a list of files based on parameters passed for the migration.
- */
- public function getIdList() {
- $files = array();
- foreach ($this->listDirs as $dir) {
- migrate_instrument_start("Retrieve $dir");
- $files = array_merge(file_scan_directory($dir, $this->fileMask, $this->directoryOptions), $files);
- migrate_instrument_stop("Retrieve $dir");
- }
- if (isset($files)) {
- return $this->getIDsFromFiles($files);
- }
- Migration::displayMessage(t('Loading of !listuri failed:', array('!listuri' => $this->listUri)));
- return NULL;
- }
- /**
- * Given an array generated from file_scan_directory(), parse out the IDs for
- * processing and return them as an array.
- */
- protected function getIDsFromFiles(array $files) {
- $ids = array();
- foreach ($files as $file) {
- $ids[] = str_replace($this->baseDir, '', (string) $file->uri);
- }
- return array_unique($ids);
- }
- /**
- * Return a count of all available IDs from the source listing.
- */
- public function computeCount() {
- $count = 0;
- $files = $this->getIdList();
- if ($files) {
- $count = count($files);
- }
- return $count;
- }
- }
- /**
- * Implementation of MigrateItem, for retrieving a file from the file system
- * based on source directory and an ID provided by a MigrateList class.
- */
- class MigrateItemFile extends MigrateItem {
- protected $baseDir;
- protected $getContents;
- /**
- * Constructor.
- *
- * @param $base_dir
- * The base directory from which all file paths are calculated.
- * @param $get_contents
- * TRUE if we should try load the contents of each file (in the case
- * of a text file), or FALSE if we just want to confirm it exists (binary).
- */
- public function __construct($base_dir, $get_contents = TRUE) {
- parent::__construct();
- $this->baseDir = $base_dir;
- $this->getContents = $get_contents;
- }
- /**
- * Return an object representing a file.
- *
- * @param $id
- * The file id, which is the file URI.
- *
- * @return object
- * The item object for migration.
- */
- public function getItem($id) {
- $item_uri = $this->baseDir . $id;
- // Get the file data at the specified URI
- $data = $this->loadFile($item_uri);
- if (is_string($data)) {
- $return = new stdClass;
- $return->filedata = $data;
- return $return;
- }
- elseif ($data === TRUE) {
- $return = new stdClass;
- return $return;
- }
- else {
- $migration = Migration::currentMigration();
- $message = t('Loading of !objecturi failed:', array('!objecturi' => $item_uri));
- $migration->getMap()->saveMessage(
- array($id), $message, MigrationBase::MESSAGE_ERROR);
- return NULL;
- }
- }
- /**
- * Default file loader.
- */
- protected function loadFile($item_uri) {
- // Only try load the contents if we have this flag set.
- if ($this->getContents) {
- $data = file_get_contents($item_uri);
- }
- else {
- $data = file_exists($item_uri);
- }
- return $data;
- }
- }
|