it-swarm.com.de

Linkfeld in benutzerdefinierter Form hinzufügen

Ich möchte ein Linkfeld (Label + URL intern/extern) in benutzerdefinierter Form hinzufügen

Das funktioniert nicht:

$form['test_ink'] = array(
  '#type' => 'link',
  '#title' => $this->t('Link title'),
  '#url' => '',
);
8
BOES

Der Renderelementtyp link ( Link ) wird verwendet, um zu rendern ein Ankerelement auf einer Seite und nicht, um ein Eingabeelement in a bereitzustellen Formular, das für URLs eingeschränkt ist.

Als Beispiel können Sie sich LinkWidget :: formElement ansehen, das zeigt, wie dieses Feld-Widget Formularelemente für ein Link-Feld erstellt. Dazu wird das Formularelement url ( rl ) verwendet, das ein Eingabeelement bereitstellt, das URLs überprüft. Stellen Sie sicher, dass die #url Eigenschaft ist ein gültiges ( rl ) Objekt.

$form['test_ink'] = [
  '#type' => 'url',
  '#title' => $this->t('Link title'),
  // Example of a Url object from a route. See the documentation
  // for more methods that may help generate a Url object.
  '#url' => Url::fromRoute('entity.node.canonical', ['node' => 1]),
];

Bearbeiten :

  1. Der Vorschlag von @ imclean wurde zur Antwort auf Lesbarkeit hinzugefügt
9
mradcliffe

Ich hatte dieses Problem, als ich einen Link (URL + Beschriftung) zum Formular für die Themeneinstellungen hinzufügen musste. Ich habe das Feld url nicht verwendet, da es einen Fehler gibt, wenn der Benutzer einen internen Link hinzufügen möchte.

So sah es auf dem CMS aus:

(enter image description here

Dies ist der Code:

/**
 * Implements hook_form_system_theme_settings_alter().
 **/
function francisco_form_system_theme_settings_alter(&$form, \Drupal\Core\Form\FormStateInterface &$form_state, $form_id = NULL) {
  // Work-around for a core bug affecting admin themes. See issue #943212.
  if (isset($form_id)) {
    return;
  }

  $form['francisco_theme_option_sidebar'] = array(
    '#type' => 'details',
    '#title' => t('Sidebar'),
    '#description' => t('Lorem ipsum.'),
    '#open' => TRUE,
  );

  $form['francisco_theme_option_sidebar']['francisco_theme_option_sidebar_footer_cta_title'] = array(
    '#type'          => 'textfield',
    '#title'         => t('Link Title'),
    '#default_value' => theme_get_setting('francisco_theme_option_sidebar_footer_cta_title'),
    '#description'   => t("Lorem ipsum."),
    '#maxlength' => 255
  );

  $form['francisco_theme_option_sidebar']['francisco_theme_option_sidebar_footer_cta_url'] = array(
    '#type'          => 'textfield',
    '#title'         => t('URL'),
    '#default_value' => theme_get_setting('francisco_theme_option_sidebar_footer_cta_url'),
    '#description'   => t("Lorem ipsum."),
    '#maxlength' => 2048,
  );

}

Ich mochte die Antwort von @ mpp, wie man ein Linkit-Feld erstellt, wenn das Linkit-Modul aktiviert ist. Sein Beispiel war nicht codeformatiert, daher ist dies nur ein Repost mit formatiertem Code, um die Lesbarkeit zu verbessern und das Kopieren und Einfügen zu vereinfachen, damit es in Ihren eigenen Projekten verwendet werden kann. Erstellen Sie ein Linkit-Feld mit Drupals Formular-API:

$form['block_link'] = [
  '#type' => 'linkit',
  '#title' => $this->t('Select link target'),
  '#description' => $this->t('Start typing to see a list of results. Click to select.'),
  '#autocomplete_route_name' => 'linkit.autocomplete',
  '#autocomplete_route_parameters' => [
    'linkit_profile_id' => 'default',
  ],
  '#default_value' => isset($config['block_link']) ? $config['block_link'] : '',
];

Beachten Sie, dass Sie "Standard" in jedes Linkit-Profil ändern können, das Sie möglicherweise in Ihrem Projekt haben. Beachten Sie auch: Mein Standardwert stammt in diesem Fall aus einem Blockkonfigurationsformular, da ich dieses Linkit-Feld zur Einstellungsseite eines Blocks hinzugefügt habe. Entfernen Sie #default_value, wenn es für Ihren Fall nicht zutreffend ist, oder ändern Sie es, je nachdem, woher Sie Ihren Wert beziehen.

0
user33560