Antworten:
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 #url
Eigenschaft 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 :
use Drupal\Core\Url; $element['test_link'] = [ '#type' => 'link', '#title' => t('Link title'), '#url' => Url::fromRoute('entity.node_type.collection'), ];
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:
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.
url
Typ wird nicht verwendet, sondern dieentity_autocomplete
.