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]),
];
}
}
