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; } }