回答:
link
(リンク)レンダリング要素型をするために使用されるレンダリングページのアンカー要素を、そしてURLの拘束された形態で入力要素を提供するために使用されません。
例として、LinkWidget :: formElementを見ると、そのフィールドウィジェットがリンクフィールドのフォーム要素を作成する方法がわかります。これを行う方法は、url
(Url)フォーム要素を使用することです。これは、URLを検証する入力要素を提供します。#url
プロパティが有効な(Url)オブジェクトであることを確認してください。
$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]),
];
編集:
use Drupal\Core\Url; $element['test_link'] = [ '#type' => 'link', '#title' => t('Link title'), '#url' => Url::fromRoute('entity.node_type.collection'), ];
テーマ設定フォームにリンク(url + label)を追加する必要があるときにこの問題に直面していました。urlフィールドを使用しなかったのは、ユーザーが内部リンクを追加したい場合にバグが発生するためです。
これは、CMSでの表示方法です。
これはコードです:
/**
* 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,
);
}
Linkitモジュールを有効にしている場合にlinkitフィールドを作成する方法に関する@mppの回答が気に入りました。彼の例はコードでフォーマットされていなかったため、これはフォーマットされたコードを使用した再投稿であり、読みやすく、コピーして貼り付けて自分のプロジェクトで簡単に使用できるようにしています。DrupalのフォームAPIを使用してlinkitフィールドを作成します。
$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'] : '',
];
「デフォルト」をプロジェクトにある可能性のある任意のlinkitプロファイルに変更できることに注意してください。また、このlinkitフィールドをブロックの設定ページに追加したため、この場合のデフォルト値はブロック構成フォームから取得されます。#default_valueをケースに適用できない場合は削除するか、値の取得元に応じて#default_valueを変更してください。
url
タイプではなくが使用されることに注意してくださいentity_autocomplete
。