You are here

public function AddToAnySettingsForm::buildForm in AddToAny Share Buttons 8

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides ConfigFormBase::buildForm

File

src/Form/AddToAnySettingsForm.php, line 62

Class

AddToAnySettingsForm
Configure AddToAny settings for this site.

Namespace

Drupal\addtoany\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  global $base_path;
  $addtoany_settings = $this
    ->config('addtoany.settings');
  $button_img = '<img src="' . $base_path . drupal_get_path('module', 'addtoany') . '/images/%s" width="%d" height="%d"%s />';
  $button_options = [
    'default' => sprintf($button_img, 'a2a_32_32.svg', 32, 32, ' class="addtoany-round-icon"'),
    'custom' => $this
      ->t('Custom button'),
    'none' => $this
      ->t('None'),
  ];
  $attributes_for_code = [
    'autocapitalize' => [
      'off',
    ],
    'autocomplete' => [
      'off',
    ],
    'autocorrect' => [
      'off',
    ],
    'spellcheck' => [
      'false',
    ],
  ];

  // Attach CSS and JS.
  $form['#attached']['library'][] = 'addtoany/addtoany.admin';
  $form['addtoany_button_settings'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Buttons'),
    '#open' => TRUE,
  ];
  $form['addtoany_button_settings']['addtoany_buttons_size'] = [
    '#type' => 'number',
    '#title' => $this
      ->t('Icon size'),
    '#field_suffix' => ' ' . $this
      ->t('pixels'),
    '#default_value' => $addtoany_settings
      ->get('buttons_size'),
    '#size' => 10,
    '#maxlength' => 3,
    '#min' => 8,
    '#max' => 999,
    '#required' => TRUE,
  ];
  $form['addtoany_button_settings']['addtoany_service_button_settings'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Service Buttons'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  ];
  $form['addtoany_button_settings']['addtoany_service_button_settings']['addtoany_additional_html'] = [
    '#type' => 'textarea',
    '#title' => $this
      ->t('Service Buttons HTML code'),
    '#default_value' => $addtoany_settings
      ->get('additional_html'),
    '#description' => $this
      ->t('You can add HTML code to display customized <a href="https://www.addtoany.com/buttons/customize/drupal/standalone_services" target="_blank">standalone service buttons</a> next to each universal share button. For example: <br /> <code>&lt;a class=&quot;a2a_button_facebook&quot;&gt;&lt;/a&gt;<br />&lt;a class=&quot;a2a_button_twitter&quot;&gt;&lt;/a&gt;<br />&lt;a class=&quot;a2a_button_pinterest&quot;&gt;&lt;/a&gt;</code>
      '),
    '#attributes' => $attributes_for_code,
  ];
  $form['addtoany_button_settings']['universal_button'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Universal Button'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  ];
  $form['addtoany_button_settings']['universal_button']['addtoany_universal_button'] = [
    '#type' => 'radios',
    '#title' => $this
      ->t('Button'),
    '#default_value' => $addtoany_settings
      ->get('universal_button'),
    '#attributes' => [
      'class' => [
        'addtoany-universal-button-option',
      ],
    ],
    '#options' => $button_options,
  ];
  $form['addtoany_button_settings']['universal_button']['addtoany_custom_universal_button'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Custom button URL'),
    '#default_value' => $addtoany_settings
      ->get('custom_universal_button'),
    '#description' => $this
      ->t('URL of the button image. Example: http://example.com/share.png'),
    '#states' => [
      // Show only if custom button is selected.
      'visible' => [
        ':input[name="addtoany_universal_button"]' => [
          'value' => 'custom',
        ],
      ],
    ],
  ];
  $form['addtoany_button_settings']['universal_button']['addtoany_universal_button_placement'] = [
    '#type' => 'radios',
    '#title' => $this
      ->t('Button placement'),
    '#default_value' => $addtoany_settings
      ->get('universal_button_placement'),
    '#options' => [
      'after' => $this
        ->t('After the service buttons'),
      'before' => $this
        ->t('Before the service buttons'),
    ],
    '#states' => [
      // Hide when universal sharing is disabled.
      'invisible' => [
        ':input[name="addtoany_universal_button"]' => [
          'value' => 'none',
        ],
      ],
    ],
  ];
  $form['addtoany_additional_settings'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Additional options'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  ];
  $form['addtoany_additional_settings']['addtoany_additional_js'] = [
    '#type' => 'textarea',
    '#title' => $this
      ->t('Additional JavaScript'),
    '#default_value' => $addtoany_settings
      ->get('additional_js'),
    '#description' => $this
      ->t('You can add special JavaScript code for AddToAny. See <a href="https://www.addtoany.com/buttons/customize/drupal" target="_blank">AddToAny documentation</a>.'),
    '#attributes' => $attributes_for_code,
  ];
  $form['addtoany_additional_settings']['addtoany_additional_css'] = [
    '#type' => 'textarea',
    '#title' => $this
      ->t('Additional CSS'),
    '#default_value' => $addtoany_settings
      ->get('additional_css'),
    '#description' => $this
      ->t('You can add special CSS code for AddToAny. See <a href="https://www.addtoany.com/buttons/customize/drupal" target="_blank">AddToAny documentation</a>.'),
    '#attributes' => $attributes_for_code,
  ];
  if ($this->moduleHandler
    ->moduleExists('token')) {
    $form['tokens'] = [
      '#theme' => 'token_tree_link',
      '#token_types' => [
        'node',
      ],
      '#global_types' => TRUE,
      '#click_insert' => TRUE,
      '#show_restricted' => FALSE,
      '#recursion_limit' => 3,
      '#text' => $this
        ->t('Browse available tokens'),
    ];
  }
  $form['addtoany_entity_settings'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Entities'),
  ];
  $form['addtoany_entity_settings']['addtoany_entity_tip_1'] = [
    '#type' => 'html_tag',
    '#tag' => 'p',
    '#value' => $this
      ->t('AddToAny is available on the &quot;Manage display&quot; pages of enabled entities, e.g. Structure &gt; Content types &gt; Article &gt; Manage display.'),
  ];
  $entities = self::getContentEntities();

  // Allow modules to alter the entity types.
  \Drupal::moduleHandler()
    ->alter('addtoany_entity_types', $entities);

  // Whitelist the entity IDs that let us link to each bundle's Manage Display page.
  $linkableEntities = [
    'block_content',
    'comment',
    'commerce_product',
    'commerce_store',
    'contact_message',
    'media',
    'node',
    'paragraph',
  ];
  foreach ($entities as $entity) {
    $entityId = $entity
      ->id();
    $entityType = $entity
      ->getBundleEntityType();

    // Get all available bundles for the current entity.
    $bundles = \Drupal::service('entity_type.bundle.info')
      ->getBundleInfo($entityId);
    $links = [];
    foreach ($bundles as $machine_name => $bundle) {
      $label = $bundle['label'];

      // Some labels are TranslatableMarkup objects (such as the File entity).
      if ($label instanceof TranslatableMarkup) {
        $label = $label
          ->render();
      }

      // Check if Field UI module enabled.
      if ($this->moduleHandler
        ->moduleExists('field_ui')) {

        // Link to the bundle's Manage Display page if the entity ID supports the route pattern.
        if (in_array($entityId, $linkableEntities) && $entityType) {
          $links[] = Link::createFromRoute(t($label), "entity.entity_view_display.{$entityId}.default", [
            $entityType => $machine_name,
          ])
            ->toString();
        }
      }
    }
    $description = empty($links) ? '' : '( ' . implode(' | ', $links) . ' )';
    $form['addtoany_entity_settings'][$entityId] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('@entity', [
        '@entity' => $entity
          ->getLabel(),
      ]),
      '#default_value' => $addtoany_settings
        ->get("entities.{$entityId}"),
      '#description' => $description,
      '#attributes' => [
        'class' => [
          'addtoany-entity-checkbox',
        ],
      ],
    ];
  }
  $form['addtoany_entity_settings']['addtoany_entity_tip_2'] = [
    '#type' => 'html_tag',
    '#tag' => 'p',
    '#value' => $this
      ->t('A cache rebuild may be required before changes take effect.'),
  ];
  return parent::buildForm($form, $form_state);
}