menuLinkTree = $menu_link_tree; $this->formBuilder = $form_builder; $this->pluginManagerMigration = $plugin_manager_migration; $this->migrationAccess = $migration_access; $this->database = $database; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('menu.link_tree'), $container->get('form_builder'), $container->get('plugin.manager.migration'), $container->get('farm_import_csv.access'), $container->get('database'), ); } /** * The index of importers. * * @return array * Returns a render array. */ public function index(): array { // Load all menu links below it. $parameters = new MenuTreeParameters(); $parameters->setRoot('farm.import.csv')->excludeRoot()->setTopLevelOnly()->onlyEnabledLinks(); $tree = $this->menuLinkTree->load(NULL, $parameters); $manipulators = [ ['callable' => 'menu.default_tree_manipulators:checkAccess'], ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'], ]; $tree = $this->menuLinkTree->transform($tree, $manipulators); // Start cacheability with migrate_plus migration config entity list tag. $tree_access_cacheability = new CacheableMetadata(); $tree_access_cacheability->addCacheTags($this->entityTypeManager()->getStorage('migration')->getEntityType()->getListCacheTags()); // Build items for each csv importer. $items = []; foreach ($tree as $element) { $tree_access_cacheability->addCacheableDependency($element->access); if ($element->access->isAllowed()) { $items[] = [ 'title' => $element->link->getTitle(), 'description' => $element->link->getDescription(), 'url' => $element->link->getUrlObject(), ]; } } // Render items. if (!empty($items)) { $output = [ '#theme' => 'admin_block_content', '#content' => $items, ]; } else { $output = [ '#markup' => $this->t('You do not have any importers.'), ]; } $tree_access_cacheability->applyTo($output); return $output; } /** * Checks access for a specific CSV importer. * * @param \Drupal\Core\Session\AccountInterface $account * Run access checks for this account. * @param string $migration_id * The migration ID. * * @return \Drupal\Core\Access\AccessResultInterface * The access result. */ public function access(AccountInterface $account, string $migration_id) { // Delegate to the farm_import_csv.access service. if ($this->pluginManagerMigration->hasDefinition($migration_id)) { return $this->migrationAccess->access($account, $migration_id); } // Raise 404 if the migration does not exist. throw new ResourceNotFoundException(); } /** * Get the title of a specific CSV importer. * * @param string $migration_id * The migration ID. * * @return \Drupal\Core\StringTranslation\TranslatableMarkup * Returns the migration label. */ public function getTitle(string $migration_id) { $migration_label = $this->pluginManagerMigration->getDefinition($migration_id)['label']; return $this->t('Import @label', ['@label' => $migration_label]); } /** * Controller for individual importers. * * @param string $migration_id * The migration ID. * * @return array * Returns a render array. */ public function importer(string $migration_id): array { // Load the migration definition. $migration = $this->pluginManagerMigration->getDefinition($migration_id); // Show column descriptions, if available. if (!empty($migration['third_party_settings']['farm_import_csv']['columns'])) { // Create a collapsed fieldset. $build['columns'] = [ '#type' => 'details', '#title' => $this->t('CSV Columns'), ]; // Show a description of the columns with a link to download a template. $items = []; foreach ($migration['third_party_settings']['farm_import_csv']['columns'] as $info) { if (!empty($info['name'])) { $item = '' . $info['name'] . ''; if (!empty($info['description'])) { $item .= ': ' . $info['description']; } $items[] = Markup::create($item); } } $build['columns']['descriptions'] = [ '#theme' => 'item_list', '#items' => $items, ]; $template_link = Link::createFromRoute($this->t('Download template'), 'farm.import.csv.template', ['migration_id' => $migration_id]); $build['columns']['template'] = [ '#type' => 'html_tag', '#tag' => 'p', '#value' => $template_link->toString(), ]; } // Add the importer form. $build['form'] = $this->formBuilder->getForm('Drupal\farm_import_csv\Form\CsvImportForm', $migration_id); // If entities have been created by this importer, display a View of them. if ($this->database->select('farm_import_csv_entity', 'e')->condition('e.migration', $migration_id)->countQuery()->execute()->fetchField()) { $entity_type = str_replace('entity:', '', $migration['destination']['plugin']); $build['imported'] = [ '#type' => 'details', '#title' => $this->t('Imported records'), '#open' => TRUE, '#weight' => 100, ]; $build['imported']['view'] = views_embed_view('farm_import_csv_' . $entity_type, 'default', $migration_id); } return $build; } /** * Download a template for a CSV migration. * * @param string $migration_id * The migration ID. * * @return \Symfony\Component\HttpFoundation\Response * An application/csv file download response object. */ public function template(string $migration_id) { try { /** @var \Drupal\migrate\Plugin\MigrationInterface $migration */ $migration = $this->pluginManagerMigration->getDefinition($migration_id); } catch (PluginNotFoundException $e) { throw new ResourceNotFoundException(); } if ($migration['migration_group'] != 'farm_import_csv') { throw new ResourceNotFoundException(); } else { $filename = str_replace(':', '--', $migration_id) . '.csv'; $response = new Response(); $response->headers->set('Content-Type', 'application/csv'); $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"'); $column_names = array_filter(array_column($migration['third_party_settings']['farm_import_csv']['columns'] ?? [], 'name')); $response->setContent(implode(',', $column_names)); return $response; } } }