entity_agree-2.0.x-dev/src/Plugin/Field/FieldFormatter/AgreementFormFormatter.php

src/Plugin/Field/FieldFormatter/AgreementFormFormatter.php
<?php

namespace Drupal\entity_agree\Plugin\Field\FieldFormatter;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\entity_agree\Form\AgreementForm;
use Drupal\entity_agree\Plugin\Field\FieldType\AgreementItem;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Formatter for entity agreement form.
 *
 * @FieldFormatter(
 *   id = "entity_agree_form",
 *   label = @Translation("Agreement form"),
 *   field_types = {
 *     "entity_agree",
 *   }
 * )
 */
class AgreementFormFormatter extends FormatterBase {

  /**
   * Agreement manager.
   *
   * @var \Drupal\entity_agree\AgreementManager
   */
  protected $agreementManager;

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

  /**
   * The date formatter service.
   *
   * @var \Drupal\Core\Datetime\DateFormatterInterface
   */
  protected $dateFormatter;

  /**
   * Form builder.
   *
   * @var \Drupal\Core\Form\FormBuilderInterface
   */
  protected $formBuilder;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $formatter = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $formatter->agreementManager = $container->get('entity_agree.agreement_manager');
    $formatter->currentUser = $container->get('current_user');
    $formatter->dateFormatter = $container->get('date.formatter');
    $formatter->formBuilder = $container->get('form_builder');
    return $formatter;
  }

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = [];

    foreach ($items as $delta => $item) {
      /** @var \Drupal\entity_agree\Plugin\Field\FieldType\AgreementItem $item */
      if ($item->value != AgreementItem::ENTITY_AGREE_STATUS_ACTIVE) {
        continue;
      }

      if ($agreement = $this->agreementManager->userCurrentAgreement($items->getEntity(), $this->currentUser)) {
        $elements[$delta] = [
          '#plain_text' => $this->t('You agreed on :timestamp', [
            ':timestamp' => $this->dateFormatter->format($agreement->getCreatedTime()),
          ]),
        ];
        continue;
      }

      if (!$this->agreementManager->userNeedsAgreement($items->getEntity(), $this->currentUser)) {
        continue;
      }

      if (!$this->agreementManager->agreementApplies($items->getEntity())) {
        continue;
      }

      $plugin = AgreementItem::getFieldItemAgreementPlugins($item)['entity_agree_entity_form'] ?? NULL;
      if (!$plugin) {
        continue;
      }

      $config = $plugin->getConfiguration();
      $config += ['view_mode' => $this->viewMode];
      $elements[$delta] = $this->formBuilder->getForm(AgreementForm::class, $item->getEntity(), $config);
    }

    $elements['#cache']['contexts'][] = 'user';
    $elements['#cache']['tags'][] = 'entity_agree';
    $elements['#cache']['tags'][] = "{$items->getEntity()->getEntityTypeId()}:{$items->getEntity()->id()}";
    $elements['#cache']['tags'][] = "entity_agree:user:{$this->currentUser->id()}";

    return $elements;
  }

}

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

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