niobi-8.x-2.0-alpha4/modules/niobi_form/src/Controller/NiobiFormReferencesListController.php
modules/niobi_form/src/Controller/NiobiFormReferencesListController.php
<?php
namespace Drupal\niobi_form\Controller;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\Config\Entity\ConfigEntityStorageInterface;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityListBuilder;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Url;
use Drupal\webform\WebformEntityReferenceManagerInterface;
use Drupal\webform\WebformInterface;
use Drupal\webform\WebformSubmissionStorageInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines a controller for niobi form references.
*
* Even though this is controller we are extending EntityListBuilder because
* the it's interface and patterns are application for display niobi form
* references.
*/
class NiobiFormReferencesListController extends EntityListBuilder implements ContainerInjectionInterface {
/**
* The date formatter service.
*
* @var \Drupal\Core\Datetime\DateFormatterInterface
*/
protected $dateFormatter;
/**
* Webform submission storage.
*
* @var \Drupal\webform\WebformSubmissionStorageInterface
*/
protected $submissionStorage;
/**
* Niobi Form type storage.
*
* @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface
*/
protected $niobiFormTypeStorage;
/**
* Field config storage.
*
* @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface
*/
protected $fieldConfigStorage;
/**
* The webform entity reference manager.
*
* @var \Drupal\webform\WebformEntityReferenceManagerInterface
*/
protected $webformEntityReferenceManager;
/**
* The webform.
*
* @var \Drupal\webform\WebformInterface
*/
protected $webform;
/**
* Webform niobi_form field names.
*
* @var array
*/
protected $fieldNames;
/**
* Webform niobi_form type.
*
* @var array
*/
protected $niobiFormTypes;
/**
* Provides the listing page for niobi form references.
*
* @return array
* A render array as expected by drupal_render().
*/
public function listing(WebformInterface $webform) {
$this->webform = $webform;
if (empty($this->fieldNames)) {
return [
'#type' => 'webform_message',
'#message_type' => 'warning',
'#message_message' => $this->t('There are no forms with webform entity references. Please create add a Webform field to content type.'),
];
}
else {
return $this->render();
}
}
/**
* Constructs a new NiobiFormReferencesListController object.
*
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
* The entity type definition.
* @param \Drupal\Core\Entity\EntityStorageInterface $storage
* The entity storage class.
* @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
* The date formatter service.
* @param \Drupal\Core\Config\Entity\ConfigEntityStorageInterface $niobi_form_type_storage
* The niobi_form type storage class.
* @param \Drupal\Core\Config\Entity\ConfigEntityStorageInterface $field_config_storage
* The field config storage class.
* @param \Drupal\webform\WebformSubmissionStorageInterface $webform_submission_storage
* The webform submission storage class.
* @param \Drupal\webform\WebformEntityReferenceManagerInterface $webform_entity_reference_manager
* The webform entity reference manager.
*/
public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, DateFormatterInterface $date_formatter, ConfigEntityStorageInterface $niobi_form_type_storage, ConfigEntityStorageInterface $field_config_storage, WebformSubmissionStorageInterface $webform_submission_storage, WebformEntityReferenceManagerInterface $webform_entity_reference_manager) {
parent::__construct($entity_type, $storage);
$this->dateFormatter = $date_formatter;
$this->niobiFormTypeStorage = $niobi_form_type_storage;
$this->fieldConfigStorage = $field_config_storage;
$this->submissionStorage = $webform_submission_storage;
$this->webformEntityReferenceManager = $webform_entity_reference_manager;
$this->niobiFormTypes = [];
$this->fieldNames = [];
/** @var \Drupal\niobi_form\Entity\NiobiFormType[] $niobi_form_types */
$niobi_form_types = $this->niobiFormTypeStorage->loadMultiple();
/** @var \Drupal\field\FieldConfigInterface[] $field_configs */
$field_configs = $this->fieldConfigStorage->loadByProperties(['entity_type' => 'niobi_form']);
foreach ($field_configs as $field_config) {
if ($field_config->get('field_type') === 'webform') {
$bundle = $field_config->get('bundle');
$this->niobiFormTypes[$bundle] = $niobi_form_types[$bundle];
$field_name = $field_config->get('field_name');
$this->fieldNames[$field_name] = $field_name;
}
}
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('entity.manager')->getDefinition('niobi_form'),
$container->get('entity.manager')->getStorage('niobi_form'),
$container->get('date.formatter'),
$container->get('entity.manager')->getStorage('niobi_form_type'),
$container->get('entity.manager')->getStorage('field_config'),
$container->get('entity.manager')->getStorage('webform_submission'),
$container->get('webform.entity_reference_manager')
);
}
/**
* {@inheritdoc}
*/
protected function getEntityIds() {
$query = $this->getStorage()->getQuery()
->sort($this->entityType->getKey('id'));
// Add field names.
$or = $query->orConditionGroup();
foreach ($this->fieldNames as $field_name) {
$or->condition($field_name . '.target_id', $this->webform->id());
}
$query->condition($or);
// Only add the pager if a limit is specified.
if ($this->limit) {
$query->pager($this->limit);
}
return $query->execute();
}
/**
* {@inheritdoc}
*/
public function buildHeader() {
$header = [];
$header['title'] = $this->t('Title');
$header['type'] = [
'data' => $this->t('Type'),
'class' => [RESPONSIVE_PRIORITY_MEDIUM],
];
$header['author'] = [
'data' => $this->t('Author'),
'class' => [RESPONSIVE_PRIORITY_LOW],
];
$header['changed'] = [
'data' => $this->t('Updated'),
'class' => [RESPONSIVE_PRIORITY_LOW],
];
$header['niobi_form_status'] = [
'data' => $this->t('Niobi Form status'),
'class' => [RESPONSIVE_PRIORITY_LOW],
];
$header['webform_status'] = [
'data' => $this->t('Webform status'),
'class' => [RESPONSIVE_PRIORITY_LOW],
];
$header['results'] = [
'data' => $this->t('Results'),
'class' => [RESPONSIVE_PRIORITY_MEDIUM],
];
return $header + parent::buildHeader();
}
/**
* {@inheritdoc}
*/
public function buildRow(EntityInterface $entity) {
/** @var \Drupal\niobi_form\Entity\NiobiFormInterface $entity */
$row['title']['data'] = [
'#type' => 'link',
'#title' => $entity->label(),
'#url' => $entity->toUrl(),
];
$row['type'] = niobi_form_get_type_label($entity);
$row['author']['data'] = [
'#theme' => 'username',
'#account' => $entity->getOwner(),
];
$row['changed'] = $this->dateFormatter->format($entity->getChangedTime(), 'short');
$row['niobi_form_status'] = $entity->isPublished() ? $this->t('Published') : $this->t('Not published');
$row['webform_status'] = $this->getWebformStatus($entity);
$result_total = $this->submissionStorage->getTotal($this->webform, $entity);
$results_access = $entity->access('submission_view_any');
$results_disabled = $this->webform->isResultsDisabled();
if ($results_disabled || !$results_access) {
$row['results'] = $result_total;
}
else {
$route_parameters = [
'niobi_form' => $entity->id(),
];
$row['results'] = [
'data' => [
'#type' => 'link',
'#title' => $result_total,
'#attributes' => [
'aria-label' => $this->formatPlural($result_total, '@count result for @label', '@count results for @label', ['@label' => $entity->label()]),
],
'#url' => Url::fromRoute('entity.niobi_form.webform.results_submissions', $route_parameters),
],
];
}
$row['operations']['data'] = $this->buildOperations($entity);
return $row + parent::buildRow($entity);
}
/**
* Get the niobi form's status.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The niobi_form.
*
* @return \Drupal\Core\StringTranslation\TranslatableMarkup|null
* The niobi form status.
*
* @see \Drupal\webform\Plugin\Field\FieldFormatter\WebformEntityReferenceFormatterBase::isOpen
*/
protected function getWebformStatus(EntityInterface $entity) {
// Get source entity's webform field.
$webform_field_name = $this->webformEntityReferenceManager->getFieldName($entity);
if (!$webform_field_name) {
return NULL;
}
if ($entity->$webform_field_name->target_id != $this->webform->id()) {
return NULL;
}
$webform_field = $entity->$webform_field_name;
if ($webform_field->status == WebformInterface::STATUS_OPEN) {
return $this->t('Open');
}
if ($webform_field->status == WebformInterface::STATUS_SCHEDULED) {
$is_opened = TRUE;
if ($webform_field->open && strtotime($webform_field->open) > time()) {
$is_opened = FALSE;
}
$is_closed = FALSE;
if ($webform_field->close && strtotime($webform_field->close) < time()) {
$is_closed = TRUE;
}
return ($is_opened && !$is_closed) ? $this->t('Open') : $this->t('Closed');
}
return $this->t('Closed');
}
/**
* {@inheritdoc}
*/
public function buildOperations(EntityInterface $entity) {
$build = [
'#type' => 'operations',
'#links' => $this->getOperations($entity),
'#prefix' => '<div class="webform-dropbutton">',
'#suffix' => '</div>',
];
return $build;
}
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$route_parameters = [
'niobi_form' => $entity->id(),
];
$operations = [];
if ($entity->access('update')) {
$operations['edit'] = [
'title' => $this->t('Edit'),
'url' => $this->ensureDestination($entity->toUrl('edit-form')),
];
}
if ($entity->access('view')) {
$operations['view'] = [
'title' => $this->t('View'),
'url' => $this->ensureDestination($entity->toUrl('canonical')),
];
}
if ($entity->access('submission_view_any') && !$this->webform->isResultsDisabled()) {
$operations['results'] = [
'title' => $this->t('Results'),
'url' => Url::fromRoute('entity.niobi_form.webform.results_submissions', $route_parameters),
];
}
if ($entity->access('delete')) {
$operations['delete'] = [
'title' => $this->t('Delete'),
'url' => $this->ensureDestination($entity->toUrl('delete-form')),
];
}
return $operations;
}
/**
* {@inheritdoc}
*/
public function render() {
$build = parent::render();
$build['table']['#sticky'] = TRUE;
// Customize the empty message.
$build['table']['#empty'] = $this->t('There are no niobi form references.');
// Must manually add local actions because we can't alter local actions and
// add query string parameter.
// @see https://www.drupal.org/node/2585169
$local_actions = [];
foreach ($this->niobiFormTypes as $bundle => $niobi_form_type) {
if ($niobi_form_type->access('create')) {
$local_actions['niobi_form.references.add_' . $bundle] = [
'#theme' => 'menu_local_action',
'#link' => [
'title' => $this->t('Add @title', ['@title' => $niobi_form_type->label()]),
'url' => Url::fromRoute('niobi_form.add', ['niobi_form_type' => $bundle], ['query' => ['webform_id' => $this->webform->id()]]),
],
];
}
}
if ($local_actions) {
$build['local_actions'] = [
'#prefix' => '<ul class="action-links">',
'#suffix' => '</ul>',
'#weight' => -100,
] + $local_actions;
}
$build['#attached']['library'][] = 'niobi_form/niobi_form.references';
return $build;
}
}
