<?php namespace Drupal\uw_cfg_common\Controller; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\path_alias\AliasManager; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Response; /** * Provides CSV files for specific UW sites. */ class UwDownloadCsvController extends ControllerBase { /** * Entity type manager from the core. * * @var Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * The path alias. * * @var \Drupal\path_alias\AliasManager */ protected $pathAlias; /** * CSV Report constructor. * * @param Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager * The entity type manager. * @param Drupal\path_alias\AliasManager $pathAlias * The path alias. */ public function __construct( EntityTypeManagerInterface $entityTypeManager, AliasManager $pathAlias ) { $this->entityTypeManager = $entityTypeManager; $this->pathAlias = $pathAlias; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager'), $container->get('path_alias.manager') ); } /** * Provides a CSV file for content on a site. * * @return Symfony\Component\HttpFoundation\Response * The page response. * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException */ public function uwContentReport() { // Get all the nodes. $nodes = $this->entityTypeManager->getStorage('node')->loadMultiple(); // Just in case there are no nodes, there should always // be a home page though, this is just to ensure no errors. $response = NULL; if ($nodes) { // The header of the CSV. $data = [ $this->t('Node ID'), $this->t('Title'), $this->t('Content type'), $this->t('Path'), $this->t('Published'), $this->t('Created'), $this->t('Last updated'), ]; // Put header for CSV into format to be used in CSV. $rows[] = implode(',', $data); // Step through each of the nodes and get the info. foreach ($nodes as $node) { // Pull out the info about the node. $data = [ 'nid' => $node->id(), 'title' => '"' . $node->getTitle() . '"', 'type' => $node->type->entity->label(), 'path' => $this->pathAlias->getAliasByPath('/node/' . $node->id()), 'published' => $node->status->value, 'created' => date('Y-d-m G:i', $node->getCreatedTime()), 'updated' => date('Y-d-m G:i', $node->getChangedTime()), ]; // Store the node info for use later in the CSV. $rows[] = implode(',', $data); } // Put the info into a large CSV format. $content = implode("\n", $rows); // Create the response for the CSV page. $response = new Response($content); // Set the headers for the CSV. $response->headers->set('Content-Type', 'text/csv'); $response->headers->set('Content-Disposition', 'attachment; filename="content_report.csv"'); } return $response; } }