カスタムフォームにリンクフィールド(ラベル+ URL内部/外部)を追加したい
これは機能しません:
$form['test_ink'] = array(
'#type' => 'link',
'#title' => $this->t('Link title'),
'#url' => '',
);
link
( Link )レンダリング要素タイプは、ページ上のアンカー要素のrenderに使用され、入力の提供には使用されませんURLに制約されたフォームの要素。
例として LinkWidget :: formElement を見ると、そのフィールドウィジェットがリンクフィールドのフォーム要素を作成する方法がわかります。そして、これを行う方法は、url
( rl )フォーム要素を使用することです。これは、URLを検証する入力要素を提供します。 #url
プロパティは有効な( 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]),
];
編集:
テーマ設定フォームにリンク(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を変更します。