paid_ads-8.x-1.x-dev/src/Plugin/Field/FieldFormatter/PaidFormatter.php
src/Plugin/Field/FieldFormatter/PaidFormatter.php
<?php namespace Drupal\paid_ads\Plugin\Field\FieldFormatter; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FormatterBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\paid_ads\PaidService; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Plugin implementation of the 'paid' formatter. * * @FieldFormatter( * id = "paid_boolean", * label = @Translation("Paid(boolean)"), * field_types = { * "paid_boolean", * } * ) */ class PaidFormatter extends FormatterBase implements ContainerFactoryPluginInterface { /** * PaidService injection. * * @var \Drupal\paid_ads\PaidService */ private $paidService; /** * {@inheritdoc} */ public function __construct(string $plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, string $label, string $view_mode, array $third_party_settings, PaidService $service) { parent::__construct( $plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings ); $this->paidService = $service; } /** * {@inheritdoc} */ public static function defaultSettings() { $settings = parent::defaultSettings(); $settings['paid_display'] = 'Paid'; $settings['not_paid_display'] = ''; $settings['button_settings'] = []; return $settings; } /** * {@inheritdoc} */ public function settingsForm(array $form, FormStateInterface $form_state) { $form = parent::settingsForm($form, $form_state); $btn_settings = $this->getSetting('button_settings'); $form['not_paid_display'] = [ '#type' => 'textarea', '#title' => $this->t('Text for non paid payment'), '#default_value' => $this->getSetting('not_paid_display'), ]; $form['paid_display'] = [ '#type' => 'textarea', '#title' => $this->t('Text for non paid payment'), '#default_value' => $this->getSetting('paid_display'), ]; $form['button_settings'] = [ '#type' => 'collapsible', '#title' => $this->t('Button Settings'), '#description' => $this->t( 'PayPal buttons customization. See @url for examples', [ '@url' => 'https://developer.paypal.com/docs/checkout/integration-features/customize-button/', ] ), ]; $form['button_settings']['layout'] = [ '#type' => 'select', '#options' => [ 'horizontal' => $this->t('Horizontal'), 'vertical' => $this->t('Vertical'), '' => $this->t('Not Set'), ], '#default_value' => $btn_settings['layout'] ?? '', ]; $form['button_settings']['color'] = [ '#type' => 'select', '#title' => $this->t('Color'), '#options' => [ 'gold' => $this->t('Gold (Recommended)'), 'blue' => $this->t('Blue (First Alternative)'), 'silver' => $this->t('Silver'), 'white' => $this->t('White'), 'black' => $this->t('Black'), '' => $this->t('Not Set'), ], '#default_value' => $btn_settings['color'] ?? '', ]; $form['button_settings']['shape'] = [ '#type' => 'select', '#title' => $this->t('Shape'), '#options' => [ 'rect' => $this->t('Rect'), 'pill' => $this->t('Pill'), '' => $this->t('Not Set'), ], '#default_value' => $btn_settings['shape'] ?? '', ]; $form['button_settings']['label'] = [ '#type' => 'select', '#title' => $this->t('Label'), '#options' => [ 'paypal' => $this->t('Paypal'), 'checkout' => $this->t('Checkout'), 'buynow' => $this->t('BuyNow'), 'pay' => $this->t('Pay'), '' => $this->t('Not Set'), ], '#default_value' => $btn_settings['label'] ?? '', ]; $form['button_settings']['tagline'] = [ '#type' => 'checkbox', '#title' => $this->t('Show tagline text'), '#return_value' => 1, '#default_value' => $btn_settings['tagline'] ?? 1, '#description' => $this->t( 'CAUTION! Can fail the script with vertical layout' ), ]; return $form; } /** * {@inheritdoc} */ public function settingsSummary() { $settings = array_filter($this->getSetting('button_settings')); if (isset($settings['tagline'])) { $settings['tagline'] = 'Tagline'; } if ($settings['label'] !== 'installment') { unset($settings['period']); } return [implode(', ', $settings)]; } /** * {@inheritdoc} */ public function viewElements(FieldItemListInterface $items, $langcode) { if (!$items->first()->value) { $pluginId = $items->getSetting('type'); $form['label'] = [ '#markup' => $this->getSetting('not_paid_display'), ]; $form['plugin'] = $this->paidService->buildFormByPluginId( $pluginId, [ 'amount' => $items->getSetting('amount'), ] ); $id = implode( '_', [ $items->getFieldDefinition() ->getTargetEntityTypeId(), $items->getFieldDefinition() ->getTargetBundle(), $items->getFieldDefinition() ->getName(), $items->getEntity() ->id(), 1, ] ); $form['plugin']['#attributes'] = array_merge( $form['plugin']['#attributes'] ?? [], [ 'data-entity-type' => $items->getFieldDefinition() ->getTargetEntityTypeId(), 'data-bundle' => $items->getFieldDefinition() ->getTargetBundle(), 'data-field' => $items->getFieldDefinition() ->getName(), 'data-entity-id' => $items->getEntity() ->id(), 'data-field-value' => 1, 'id' => $id, ] ); $form['#attached']['drupalSettings']['paypal_buttons'] = $this->getSetting( 'button_settings' ) ?? []; return [$form]; } else { return [ [ '#theme' => 'paid_boolean_paid', '#item' => $items->first()->value, '#text' => $this->getSetting('paid_display'), ], ]; } } /** * Creates an instance of the plugin. * * @param \Symfony\Component\DependencyInjection\ContainerInterface $container * The container to pull out services used in the plugin. * @param array $configuration * A configuration array containing information about the plugin instance. * @param string $plugin_id * The plugin ID for the plugin instance. * @param mixed $plugin_definition * The plugin implementation definition. * * @return static * Returns an instance of this plugin. */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings'], $container->get('paid_ads.service') ); } }