web-dev-qa-db-ja.com

カスタムフォームにリンクフィールドを追加する

カスタムフォームにリンクフィールド(ラベル+ URL内部/外部)を追加したい

これは機能しません:

$form['test_ink'] = array(
  '#type' => 'link',
  '#title' => $this->t('Link title'),
  '#url' => '',
);
8
BOES

linkLink )レンダリング要素タイプは、ページ上のアンカー要素のrenderに使用され、入力の提供には使用されませんURLに制約されたフォームの要素。

例として LinkWidget :: formElement を見ると、そのフィールドウィジェットがリンクフィールドのフォーム要素を作成する方法がわかります。そして、これを行う方法は、urlrl )フォーム要素を使用することです。これは、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]),
];

編集

  1. 読みやすさのために回答に@imcleanの提案を追加
9
mradcliffe

テーマ設定フォームにリンク(url + label)を追加する必要があるときにこの問題に直面していました。 urlフィールドを使用しなかったのは、ユーザーが内部リンクを追加したい場合にバグが発生するためです。

これは、CMSでの表示方法です。

enter image description here

これはコードです:

/**
 * 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を変更します。

0
user33560