You are here

public function CclAddForm::buildForm in Custom Contextual Links 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 FormInterface::buildForm

File

src/Form/CclAddForm.php, line 23
Contains \Drupal\ccl\Form\CclAddForm.

Class

CclAddForm

Namespace

Drupal\ccl\Form

Code

public function buildForm(array $form, \Drupal\Core\Form\FormStateInterface $form_state, $clid = NULL) {

  // Check if we are in edit mode and load the link values.
  if ($clid) {
    $link = db_query('SELECT * FROM {ccl} WHERE clid = :clid', [
      ':clid' => $clid,
    ])
      ->fetchObject();
    $form_state
      ->set([
      'clid',
    ], $clid);
    $form_state
      ->set([
      'link',
    ], $link);

    // Unserialize options.
    $link->options = unserialize($link->options);
    $node_options = $link->options['node_options'];
    if ($node_options == 'node') {
      $title = db_query('SELECT title FROM {node} WHERE nid = :nid', [
        ':nid' => $link->options['node_id'],
      ])
        ->fetchField();
      $nid_text = $title . ' [nid:' . $link->options['node_id'] . ']';
    }
  }
  $form = [];

  // Pull in library, js and css for the form.
  $form['#attached']['library'][] = [
    'system',
    'ui.button',
  ];
  $form['#attached']['js'][] = drupal_get_path('module', 'ccl') . '/ccl.js';
  $form['#attached']['css'][] = drupal_get_path('module', 'ccl') . '/ccl.css';
  $form['link_group'] = [
    '#type' => 'fieldset',
    '#title' => t('Link'),
    '#collapsible' => TRUE,
  ];
  $form['link_group']['ccl_title'] = [
    '#type' => 'textfield',
    '#title' => t('Title'),
    '#description' => t('The title of this link as it will be displayed in the contextual widget.'),
    '#size' => 40,
    '#default_value' => $clid ? $link->title : '',
    '#maxlength' => 255,
    '#required' => TRUE,
  ];
  $form['link_group']['ccl_link'] = [
    '#type' => 'textfield',
    '#title' => t('URL'),
    '#default_value' => $clid ? $link->link : '',
    '#description' => t('The URL of this link.'),
    '#size' => 40,
    '#maxlength' => 255,
    '#required' => TRUE,
  ];
  $form['link_group']['advanced'] = [
    '#type' => 'fieldset',
    '#title' => t('Advanced Options'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  ];
  $form['link_group']['advanced']['advanced_css'] = [
    '#type' => 'textfield',
    '#title' => t('CSS Class'),
    '#default_value' => $clid && isset($link->options['advanced_css']) ? $link->options['advanced_css'] : '',
    '#description' => t('Add class name(s) to the link. Multiple classes should be seperated by a space. Example: "%example".', [
      '%example' => "colorbox-load extra-class",
    ]),
    '#size' => 40,
    '#maxlength' => 255,
  ];
  $form['link_group']['advanced']['advanced_anchor'] = [
    '#type' => 'textfield',
    '#title' => t('Anchor'),
    '#default_value' => $clid && isset($link->options['advanced_anchor']) ? $link->options['advanced_anchor'] : '',
    '#description' => t('Append an anchor string to the end of the link. Do not use the "#" at the beginning of the string.'),
    '#size' => 40,
    '#maxlength' => 255,
  ];
  $form['link_group']['advanced']['advanced_query'] = [
    '#type' => 'textfield',
    '#title' => t('Query String'),
    '#default_value' => $clid && isset($link->options['advanced_query']) ? $link->options['advanced_query'] : '',
    '#description' => t('Append a query string to the end of the link. Do not use the "?" at the beginning of the query. Tokens can be used for this field as well.<br />Example: "%example".', [
      '%example' => "width=500&height=500&iframe=true&user=[current-user:uid]",
    ]),
    '#size' => 40,
    '#maxlength' => 255,
  ];
  $form['link_group']['advanced']['advanced_target'] = [
    '#type' => 'select',
    '#title' => t('Link Target'),
    '#options' => [
      'default' => t('Default (no target attribute)'),
      '_top' => t('Open link in window root'),
      '_blank' => t('Open link in new window'),
    ],
    '#default_value' => $clid && isset($link->options['advanced_target']) ? $link->options['advanced_target'] : '',
    '#description' => t('Set a target attribute for the link.'),
  ];
  $form['link_group']['advanced']['advanced_destination'] = [
    '#type' => 'checkbox',
    '#title' => t('Include destination parameter in Link'),
    '#default_value' => $clid && isset($link->options['advanced_destination']) ? $link->options['advanced_destination'] : TRUE,
    '#description' => t('If checked, the current page path will be added to the link\'s "destination" parameter (which will return the user to this page if they submit a form from the link target).'),
  ];
  $form['link_group']['token_group'] = [
    '#type' => 'fieldset',
    '#title' => t('Tokens'),
    '#description' => t("Token replacements will be performed for the link title and for the URL. Note that 'Node' tokens will not be replaced for links that are added to blocks."),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  ];
  if (\Drupal::moduleHandler()
    ->moduleExists('token')) {
    $form['link_group']['token_group']['tokens'] = [
      '#theme' => 'token_tree',
      '#token_types' => [
        'node',
      ],
      '#global_types' => TRUE,
      '#click_insert' => TRUE,
    ];
  }
  else {
    $form['link_group']['token_group']['token_tree'] = [
      '#markup' => '<p>' . t('Enable the <a href="@drupal-token">Token module</a> to view the available token browser.', [
        '@drupal-token' => 'http://drupal.org/project/token',
      ]) . '</p>',
    ];
  }
  $form['options_group'] = [
    '#type' => 'fieldset',
    '#title' => t('Options'),
    '#collapsible' => TRUE,
  ];
  $form['options_group']['ccl_type'] = [
    '#type' => 'radios',
    '#title' => t('Link Type'),
    '#description' => t('Select if this link should be displayed for a node or for a block.'),
    '#options' => [
      'node' => t('Node'),
    ],
    '#default_value' => $clid ? $link->type : 'node',
  ];
  $form['options_group']['node_options'] = [
    '#type' => 'radios',
    '#title' => t('Show link for'),
    '#description' => t('Select if this link should be displayed for all nodes, all nodes of a content type or a specific node.'),
    '#options' => [
      'node' => t('Single node'),
      'ct' => t('Content type'),
      'global' => t('All nodes'),
    ],
    '#default_value' => isset($node_options) ? $node_options : 'node',
    '#states' => [
      'visible' => [
        ':input[name="ccl_type"]' => [
          'value' => 'node',
        ],
      ],
    ],
  ];

  // Load the content type names.
  $types = node_type_get_names();
  $form['options_group']['node_type'] = [
    '#type' => 'select',
    '#title' => t('Content Type'),
    '#description' => t('The content type this link will be displayed for.'),
    '#options' => $types,
    '#default_value' => $clid ? $link->options['node_type'] : -1,
    '#states' => [
      'visible' => [
        ':input[name="node_options"]' => [
          'value' => 'ct',
        ],
        ':input[name="ccl_type"]' => [
          'value' => 'node',
        ],
      ],
    ],
  ];
  $form['options_group']['node_id'] = [
    '#type' => 'textfield',
    '#title' => t('Node ID'),
    '#description' => t('Enter the title of the node or the id of the node this link should be added to.'),
    '#size' => 40,
    '#maxlength' => 128,
    '#default_value' => isset($nid_text) ? $nid_text : '',
    '#autocomplete_path' => 'admin/config/user-interface/ccl/autocomplete',
    '#states' => [
      'visible' => [
        ':input[name="node_options"]' => [
          'value' => 'node',
        ],
        ':input[name="ccl_type"]' => [
          'value' => 'node',
        ],
      ],
    ],
  ];
  $form['ccl_save_link'] = [
    '#type' => 'submit',
    '#value' => t('Save Link'),
  ];
  return $form;
}