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


8

カスタムフォームにリンクフィールド(ラベル+ url internal / external)を追加したい

これは機能しません:

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

回答:


9

linkリンク)レンダリング要素型をするために使用されるレンダリングページのアンカー要素を、そしてURLの拘束された形態で入力要素を提供するために使用されません。

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

編集

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

3
内部リンクの場合、urlタイプではなくが使用されることに注意してくださいentity_autocomplete
Tim

1
linkitモジュールがある場合は、linkit要素も使用できることに注意してください(drupal.org/project/linkitを参照):$ form ['test_ink'] = ['#type' => 'linkit'、 '#autocomplete_route_name' = > 'linkit.autocomplete'、 '#autocomplete_route_parameters' => ['linkit_profile_id' => 'default'、]、]
mpp

1
URLがURLオブジェクトであることを確認してください。そうでないと機能しません。例: use Drupal\Core\Url; $element['test_link'] = [ '#type' => 'link', '#title' => t('Link title'), '#url' => Url::fromRoute('entity.node_type.collection'), ];
imclean

0

テーマ設定フォームにリンク(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,
  );

}

0

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を変更してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.