Linkfeld in benutzerdefinierter Form hinzufügen

8

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' => '',
);
BOES
quelle

Antworten:

9

Der Renderelementtyplink ( Link ) wird zum Rendern eines Ankerelements auf einer Seite verwendet und nicht zum Bereitstellen eines Eingabeelements in einer Form, die 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( URL ) verwendet, das ein Eingabeelement bereitstellt, mit dem URLs überprüft werden. Stellen Sie sicher, dass die #urlEigenschaft ein gültiges ( URL- ) Objekt ist.

$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
mradcliffe
quelle
3
Beachten Sie, dass für interne Links der urlTyp wird nicht verwendet, sondern die entity_autocomplete.
Tim
1
Beachten Sie, dass Sie das linkit-Element auch verwenden können, wenn Sie über das linkit-Modul verfügen (siehe drupal.org/project/linkit ): $ form ['test_ink'] = ['#type' => 'linkit', '#autocomplete_route_name' = > 'linkit.autocomplete', '#autocomplete_route_parameters' => ['linkit_profile_id' => 'default',],]
mpp
1
Stellen Sie sicher, dass die URL ein URL-Objekt ist, da sie sonst einfach nicht funktioniert. Zum Beispiel: use Drupal\Core\Url; $element['test_link'] = [ '#type' => 'link', '#title' => t('Link title'), '#url' => Url::fromRoute('entity.node_type.collection'), ];
unrein
0

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

So sah es auf dem CMS aus:

Geben Sie hier die Bildbeschreibung ein

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,
  );

}
Francisco Corrales Morales
quelle
0

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.

user33560
quelle