Mercurial > hg > isophonics-drupal-site
diff modules/contrib/migrate_plus/src/Plugin/migrate/source/Url.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/contrib/migrate_plus/src/Plugin/migrate/source/Url.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,139 @@ +<?php + +namespace Drupal\migrate_plus\Plugin\migrate\source; + +use Drupal\migrate\Plugin\MigrationInterface; +use Drupal\migrate_plus\DataParserPluginInterface; + +/** + * Source plugin for retrieving data via URLs. + * + * @MigrateSource( + * id = "url" + * ) + */ +class Url extends SourcePluginExtension { + + /** + * The source URLs to retrieve. + * + * @var array + */ + protected $sourceUrls = []; + + /** + * The data parser plugin. + * + * @var \Drupal\migrate_plus\DataParserPluginInterface + */ + protected $dataParserPlugin; + + /** + * {@inheritdoc} + */ + public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration) { + if (!is_array($configuration['urls'])) { + $configuration['urls'] = [$configuration['urls']]; + } + parent::__construct($configuration, $plugin_id, $plugin_definition, $migration); + + $this->sourceUrls = $configuration['urls']; + + // Set a default Accept header. +/* $this->headers = array_merge(['Accept' => 'application/json'], + $configuration['headers'] ?: []);*/ + + // See if this is a paged response with next links. If so, add to the source_urls array. +/* foreach ( (array) $configuration['urls'] as $url) { + $this->sourceUrls += $this->getNextLinks($url); + }*/ + } + + /** + * Return a string representing the source URLs. + * + * @return string + * Comma-separated list of URLs being imported. + */ + public function __toString() { + // This could cause a problem when using a lot of urls, may need to hash. + $urls = implode(', ', $this->sourceUrls); + return $urls; + } + + /** + * Returns the initialized data parser plugin. + * + * @return \Drupal\migrate_plus\DataParserPluginInterface + * The data parser plugin. + */ + public function getDataParserPlugin() { + if (!isset($this->dataParserPlugin)) { + $this->dataParserPlugin = \Drupal::service('plugin.manager.migrate_plus.data_parser')->createInstance($this->configuration['data_parser_plugin'], $this->configuration); + } + return $this->dataParserPlugin; + } + + /** + * Creates and returns a filtered Iterator over the documents. + * + * @return \Iterator + * An iterator over the documents providing source rows that match the + * configured item_selector. + */ + protected function initializeIterator() { + return $this->getDataParserPlugin(); + } + + /** + * Collect an array of next links from a paged response. + */ +/* protected function getNextLinks($url) { + $urls = array(); + $more = TRUE; + while ($more == TRUE) { + $response = $this->dataParserPlugin->getDataFetcher()->getResponse($url); + if ($url = $this->getNextFromHeaders($response)) { + $urls[] = $url; + } + elseif ($url = $this->getNextFromLinks($response)) { + $urls[] = $url; + } + else { + $more = FALSE; + } + } + return $urls; + } +*/ + /** + * See if the next link is in a 'links' group in the response. + * + * @param \Psr\Http\Message\ResponseInterface $response + */ +/* protected function getNextFromLinks(ResponseInterface $response) { + $body = json_decode($response->getBody(), TRUE); + if (!empty($body['links']) && array_key_exists('next', $body['links'])) { + return $body['links']['next']; + } + return FALSE; + } +*/ + /** + * See if the next link is in the header. + * + * @param \Psr\Http\Message\ResponseInterface $response + */ +/* protected function getNextFromHeaders(ResponseInterface $response) { + $headers = $response->getHeader('Link'); + foreach ($headers as $header) { + $matches = array(); + preg_match('/^<(.*)>; rel="next"$/', $header, $matches); + if (!empty($matches) && !empty($matches[1])) { + return $matches[1]; + } + } + return FALSE; + } +*/ +}