openquestions-1.0.x-dev/src/Plugin/Block/OQUserApplicationBlock.php

src/Plugin/Block/OQUserApplicationBlock.php
<?php

namespace Drupal\openquestions\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Logger\LoggerChannelInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\Core\Utility\LinkGeneratorInterface;
use Drupal\Core\Session\AccountProxy;
use Drupal\Core\Entity\EntityTypeManager;
use Drupal\Component\Render\FormattableMarkup;

/**
 * OpenQuestions user application block.
 *
 * Shows a link to submit an application, or the current application disposition,
 * on the user view/edit pages.
 *
 * "entity:oq_item" is available due to OQItemRouteContext.
 *
 * @Block(
 *  id = "oq_user_application_block",
 *  admin_label = @Translation("OQ user application"),
 *  category = @Translation("OpenQuestions"),
 *  context_definitions = {
 *    "user" = @ContextDefinition("entity:user", label = @Translation("User"))
 *  }
 * )
 */
class OQUserApplicationBlock extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * To generate links.
   *
   * @var \Drupal\Core\Utility\LinkGeneratorInterface
   */
  protected $linkGenerator;

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountProxy
   */
  protected $currentUser;

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManager
   */
  protected $entityTypeManager;

  /**
   * Our logger.
   *
   * @var \Drupal\Core\Logger\LoggerChannelInterface
   */
  protected $logger;

  /**
   * Constructs a OQScoreboardBlock.
   */
  public function __construct(array $configuration,
                  $plugin_id,
                  $plugin_definition,
                  LinkGeneratorInterface $linkGenerator,
                  AccountProxy $currentUser,
                  EntityTypeManager $entityTypeManager,
                  LoggerChannelInterface $logger) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);

    $this->linkGenerator = $linkGenerator;
    $this->currentUser = $currentUser;
    $this->entityTypeManager = $entityTypeManager;
    $this->logger = $logger;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('link_generator'),
      $container->get('current_user'),
      $container->get('entity_type.manager'),
      $container->get('openquestions.logger.channel.openquestions')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'expand_all' => 1,
      'expand_questions' => 1,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function build() {
    $account = $this->getContextValue('user');
    if (!$account || !$account->id() || $account->id() != $this->currentUser->id() || $account->hasRole('oq_voter')) {
      return NULL;
    }

    $applications = $this->entityTypeManager->getStorage('oq_application')->loadByProperties([
      'uid' => $account->id(),
    ]);

    if ($applications && count($applications) > 0) {
      $application = array_shift($applications);
      if ($application) {
        $dispositions = $application->get('disposition')->referencedEntities();
        $disposition = $dispositions && count($dispositions) > 0 ? array_shift($dispositions) : NULL;
        if ($disposition) {
          $url = $application->toUrl()->toString();
          return [
            '#markup' => $this->t('Your <a href=":url">application</a> is in the @disposition state.', [
              ':url' => $url,
              '@disposition' => $disposition->getName(),
            ]),
          ];
        }
      }
    }

    if (!$account->hasPermission('create oq application')) {
      return NULL;
    }

    $url = Url::fromRoute('entity.oq_application.add_form')->toString();

    return [
      '#markup' => $this->t('You can apply to vote on questions <a href=":url">here</a>.', [':url' => $url]),
    ];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc