Je veux ajouter un champ de lien (étiquette + URL interne/externe) sous forme personnalisée
Cela ne fonctionne pas:
$form['test_ink'] = array(
'#type' => 'link',
'#title' => $this->t('Link title'),
'#url' => '',
);
Le type d'élément de rendu link
( Link ) est utilisé pour render un élément d'ancrage sur une page, et non pour fournir un élément d'entrée dans un formulaire qui est contraint pour les URL.
Par exemple, vous pouvez regarder LinkWidget :: formElement , qui montre comment ce widget de champ crée des éléments de formulaire pour un champ Lien. Et la manière de procéder consiste à utiliser l'élément de formulaire url
( rl ), qui fournira un élément d'entrée qui valide les URL. Assurez-vous que la propriété #url
Est un objet valide ( rl ).
$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]),
];
Modifier :
J'étais confronté à ce problème lorsque j'avais besoin d'ajouter un lien (URL + étiquette) au formulaire de paramètres de thème. Je n'ai pas utilisé le champ url car il contient un bug si l'utilisateur souhaite ajouter un lien interne.
Voici à quoi cela ressemblait sur le CMS:
Voici le 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,
);
}
J'ai aimé la réponse de @ mpp sur la façon de créer un champ linkit si le module Linkit est activé. Son exemple n'a pas été formaté en code, il ne s'agit donc que d'une nouvelle publication utilisant du code formaté pour une meilleure lisibilité et pour faciliter le copier-coller à utiliser dans vos propres projets. Créez un champ linkit avec l'API de formulaire de Drupal:
$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'] : '',
];
Notez que vous pouvez remplacer "par défaut" par n'importe quel profil linkit que vous pourriez avoir dans votre projet. Notez également: ma valeur par défaut dans ce cas provient d'un formulaire de configuration de bloc car j'ai ajouté ce champ linkit à la page des paramètres d'un bloc. Supprimez #default_value s'il ne s'applique pas à votre cas ou modifiez-le en fonction de l'origine de votre valeur.