跳到內容

LanguageType 欄位

編輯此頁面

LanguageTypeChoiceType 的子集,讓使用者可以從大量的語言列表中選擇。額外的好處是,語言名稱會以使用者的語言顯示。

每個語言的「值」是在 Unicode 國際組件 (International Components for Unicode) 中使用的Unicode 語言識別碼 (例如 frzh_Hant)。

注意

您使用者的語系是使用 Locale::getDefault() 推測出來的,這需要安裝並啟用 intl PHP 擴充套件。

ChoiceType 不同,您不需要指定 choices 選項,因為欄位類型會自動使用大量的語言列表。您可以手動指定選項,但這樣的話您應該直接使用 ChoiceType

呈現為 可以是各種標籤 (請參閱 ChoiceType 欄位 (下拉式選單、單選按鈕和核取方塊))
預設的無效訊息 請選擇有效的語言。
父類型 ChoiceType
類別 LanguageType

提示

此表單類型定義和繼承的完整選項列表,可透過在您的應用程式中執行此命令來取得

1
2
# replace 'FooType' by the class name of your form type
$ php bin/console debug:form FooType

欄位選項

alpha3

類型boolean 預設值false

如果此選項為 true,則選項值會使用 ISO 639-2 alpha-3 (2T) 三字母代碼 (例如,法文 = fra),而不是預設的 ISO 639-1 alpha-2 雙字母代碼 (例如,法文 = fr)。

choice_self_translation

類型boolean 預設值false

預設情況下,語言名稱會翻譯成應用程式目前的語系。例如,當以英文瀏覽應用程式時,您會得到一個類似 [..., 'cs' => 'Czech', ..., 'es' => 'Spanish', ..., 'zh' => 'Chinese'] 的陣列,而當以法文瀏覽時,您會得到以下陣列:[..., 'cs' => 'tchèque', ..., 'es' => 'espagnol', ..., 'zh' => 'chinois']

如果此選項為 true,則每個語言都會翻譯成其自己的語言,而與目前應用程式的語系無關:[..., 'cs' => 'čeština', ..., 'es' => 'español', ..., 'zh' => '中文']

choice_translation_locale

類型stringnull 預設值null

此選項決定選項值是否應翻譯成與目前語系不同的語系。

choice_translation_locale 選項的值可以是 null (重複使用目前的翻譯語系) 或代表要使用的確切翻譯語系的字串。

覆寫的選項

choices

預設值Symfony\Component\Intl\Languages::getNames()

choices 選項預設為所有語言。預設語系用於翻譯語言名稱。

警告

如果您想要覆寫語言類型的內建選項,您也必須將 choice_loader 選項設定為 null

choice_translation_domain

類型stringbooleannull 預設值false

此選項決定選項值是否應翻譯以及在哪個翻譯網域中翻譯。

choice_translation_domain 選項的值可以是 true (重複使用目前的翻譯網域)、false (停用翻譯)、null (使用父翻譯網域或預設網域) 或代表要使用的確切翻譯網域的字串。

invalid_message

類型string 預設值This value is not valid

如果輸入到此欄位的資料沒有意義 (即驗證失敗),則會使用此驗證錯誤訊息。

例如,如果使用者在 TimeType 欄位中輸入無法轉換為真實時間的無意義字串,或者如果使用者在數字欄位中輸入字串 (例如 apple),則可能會發生這種情況。

正常的 (商業邏輯) 驗證 (例如設定欄位的最小長度) 應使用驗證規則的驗證訊息 (參考) 來設定。

繼承的選項

這些選項繼承自 ChoiceType

duplicate_preferred_choices

類型boolean 預設值true

當使用 preferred_choices 選項時,預設情況下,這些偏好選項會顯示兩次:在列表的頂部和下面的完整列表中。將此選項設定為 false,僅在列表頂部顯示偏好選項

1
2
3
4
5
6
7
8
9
10
11
12
13
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('language', ChoiceType::class, [
    'choices' => [
        'English' => 'en',
        'Spanish' => 'es',
        'Bork' => 'muppets',
        'Pirate' => 'arr',
    ],
    'preferred_choices' => ['muppets', 'arr'],
    'duplicate_preferred_choices' => false,
]);

error_bubbling

類型boolean 預設值false,除非表單是 compound

如果 true,則此欄位的任何錯誤都會傳遞給父欄位或表單。例如,如果在一般欄位上設定為 true,則該欄位的任何錯誤都會附加到主表單,而不是附加到特定欄位。

error_mapping

類型array 預設值[]

此選項可讓您修改驗證錯誤的目標。

假設您有一個名為 matchingCityAndZipCode() 的自訂方法,用於驗證城市和郵遞區號是否匹配。不幸的是,您的表單中沒有 matchingCityAndZipCode 欄位,因此 Symfony 只能在表單頂部顯示錯誤。

透過自訂錯誤映射,您可以做得更好:將錯誤映射到城市欄位,以便將其顯示在上方

1
2
3
4
5
6
7
8
public function configureOptions(OptionsResolver $resolver): void
{
    $resolver->setDefaults([
        'error_mapping' => [
            'matchingCityAndZipCode' => 'city',
        ],
    ]);
}

以下是映射左側和右側的規則

  • 左側包含屬性路徑;
  • 如果違規是在類別的屬性或方法上產生的,則其路徑為 propertyName
  • 如果違規是在 arrayArrayAccess 物件的項目上產生的,則屬性路徑為 [indexName]
  • 您可以透過串連巢狀屬性路徑來建構它們,並以點分隔屬性。例如:addresses[work].matchingCityAndZipCode
  • 右側包含表單中欄位的名稱。

預設情況下,任何未映射屬性的錯誤都會向上冒泡到父表單。您可以使用左側的點 (.) 將所有未映射屬性的錯誤映射到特定欄位。例如,若要將所有這些錯誤映射到 city 欄位,請使用

1
2
3
4
5
$resolver->setDefaults([
    'error_mapping' => [
        '.' => 'city',
    ],
]);

expanded

類型boolean 預設值false

如果設定為 true,將會呈現單選按鈕或核取方塊 (取決於 multiple 值)。如果為 false,則會呈現 select 元素。

multiple

類型boolean 預設值false

如果為 true,使用者將能夠選擇多個選項 (而不是僅選擇一個選項)。根據 expanded 選項的值,如果為 true,則會呈現 select 標籤或核取方塊,如果為 false,則會呈現 select 標籤或單選按鈕。傳回的值將會是一個陣列。

placeholder

類型stringTranslatableMessageboolean

此選項決定是否會在 select 小工具的頂端顯示特殊的「空」選項 (例如「選擇一個選項」)。此選項僅在 multiple 選項設定為 false 時適用。

  • 新增一個空白值,文字為「選擇一個選項」

    1
    2
    3
    4
    5
    6
    7
    8
    9
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    // ...
    
    $builder->add('states', ChoiceType::class, [
        'placeholder' => 'Choose an option',
    
        // or if you want to translate the text
        'placeholder' => new TranslatableMessage('form.placeholder.select_option', [], 'form'),
    ]);
  • 保證不顯示「空」值選項

    1
    2
    3
    4
    5
    6
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    // ...
    
    $builder->add('states', ChoiceType::class, [
        'placeholder' => false,
    ]);

如果您將 placeholder 選項保持未設定狀態,則僅當 required 選項為 false 時,才會自動新增空白 (沒有文字) 選項

1
2
3
4
5
6
7
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

// a blank (with no text) option will be added
$builder->add('states', ChoiceType::class, [
    'required' => false,
]);

placeholder_attr

類型array 預設值[]

使用此選項可將額外的 HTML 屬性新增至 placeholder 選項

1
2
3
4
5
6
7
8
9
10
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('fruits', ChoiceType::class, [
    // ...
    'placeholder' => '...',
    'placeholder_attr' => [
        ['title' => 'Choose an option'],
    ],
]);

preferred_choices

類型arraycallablestringPropertyPath 預設值[]

此選項可讓您在列表頂端顯示某些選項,並在它們與完整的選項列表之間加上視覺分隔符號。如果您有一個語言表單,您可以將最受歡迎的語言列在頂端,例如 Bork 和 Pirate

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('language', ChoiceType::class, [
    'choices' => [
        'English' => 'en',
        'Spanish' => 'es',
        'Bork' => 'muppets',
        'Pirate' => 'arr',
    ],
    'preferred_choices' => ['muppets', 'arr'],
]);

此選項也可以是一個回呼函式,為您提供更大的彈性。如果您的值是物件,這可能會特別有用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...

$builder->add('publishAt', ChoiceType::class, [
    'choices' => [
        'now' => new \DateTime('now'),
        'tomorrow' => new \DateTime('+1 day'),
        '1 week' => new \DateTime('+1 week'),
        '1 month' => new \DateTime('+1 month'),
    ],
    'preferred_choices' => function ($choice, $key, $value): bool {
        // prefer options within 3 days
        return $choice <= new \DateTime('+3 days');
    },
]);

這只會「偏好」 「now」 和 「tomorrow」 選項

A choice list with "now" and "tomorrow" on top, separated by a line from "1 week" and "1 month".

最後,如果您的值是物件,您也可以在物件上指定一個屬性路徑字串,該字串將傳回 true 或 false。

偏好選項僅在呈現 select 元素時才有意義 (即 expanded 為 false)。偏好選項和一般選項在視覺上以一組虛線分隔 (即 -------------------)。這可以在呈現欄位時自訂

1
{{ form_widget(form.publishAt, { 'separator': '=====' }) }}

提示

當定義自訂類型時,您應該使用 ChoiceList 類別輔助程式

1
2
3
4
5
6
use Symfony\Component\Form\ChoiceList\ChoiceList;

// ...
$builder->add('choices', ChoiceType::class, [
    'preferred_choices' => ChoiceList::preferred($this, 'taggedAsFavorite'),
]);

請參閱 「choice_loader」選項文件

trim

類型boolean 預設值false

預設情況下會停用修剪,因為選取的值或值必須與給定的選項值完全匹配 (而且它們可能包含空格)。

這些選項繼承自 FormType

attr

類型array 預設值[]

如果您想要將額外的屬性新增至 HTML 欄位表示法,您可以使用 attr 選項。它是一個關聯陣列,HTML 屬性作為鍵。當您需要為某些小工具設定自訂類別時,這會很有用

1
2
3
$builder->add('body', TextareaType::class, [
    'attr' => ['class' => 'tinymce'],
]);

另請參閱

如果您想要將這些屬性新增至 表單類型列 元素,請使用 row_attr 選項。

data

類型mixed 預設值:預設為底層結構的欄位。

當您建立表單時,每個欄位最初都會顯示表單網域資料的對應屬性的值 (例如,如果您將物件繫結到表單)。如果您想要覆寫表單或個別欄位的此初始值,您可以在 data 選項中設定它

1
2
3
4
5
6
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
// ...

$builder->add('token', HiddenType::class, [
    'data' => 'abcdef',
]);

警告

當呈現時,data 選項總是會覆寫從網域資料 (物件) 中取得的值。這表示當表單編輯已持續存在的物件時,物件值也會被覆寫,導致物件在提交表單時遺失其持續存在的值。

disabled

類型boolean 預設值false

如果您不希望使用者修改欄位的值,您可以將 disabled 選項設定為 true。任何提交的值都會被忽略。

empty_data

類型mixed

此選項的實際預設值取決於其他欄位選項

  • 如果 multiplefalseexpandedfalse,則為 '' (空字串);
  • 否則為 [] (空陣列)。

此選項決定當提交的值為空 (或遺失) 時,欄位將傳回的值。如果未在視圖中呈現表單時提供初始值,則此選項不會設定初始值。

這表示它可以協助您處理具有空白欄位的表單提交。例如,如果您希望在未選取任何值時,將 name 欄位明確設定為 John Doe,您可以這樣做

1
2
3
4
$builder->add('name', null, [
    'required'   => false,
    'empty_data' => 'John Doe',
]);

這仍然會呈現一個空的文字框,但是提交後,John Doe 值將會被設定。使用 dataplaceholder 選項來在呈現的表單中顯示這個初始值。

注意

如果表單是複合的,您可以將 empty_data 設定為陣列、物件或閉包。這個選項可以為您的整個表單類別設定,請參閱 如何為表單類別配置空資料 文章以了解更多關於這些選項的詳細資訊。

警告

表單資料轉換器 仍然會應用於 empty_data 值。這表示空字串將會被轉換為 null。如果您明確地想要回傳空字串,請使用自訂的資料轉換器。

help

type: stringTranslatableInterface default: null

允許您為表單欄位定義說明訊息,預設情況下,說明訊息會呈現在欄位下方

1
2
3
4
5
6
7
8
9
10
11
12
13
use Symfony\Component\Translation\TranslatableMessage;

$builder
    ->add('zipCode', null, [
        'help' => 'The ZIP/Postal code for your credit card\'s billing address.',
    ])

    // ...

    ->add('status', null, [
        'help' => new TranslatableMessage('order.status', ['%order_id%' => $order->getId()], 'store'),
    ])
;

help_attr

類型array 預設值[]

設定用於顯示表單欄位說明訊息的 HTML 元素的 HTML 屬性。其值為一個關聯陣列,鍵為 HTML 屬性名稱。這些屬性也可以在範本中設定

1
2
3
{{ form_help(form.name, 'Your name', {
    'help_attr': {'class': 'CUSTOM_LABEL_CLASS'}
}) }}

help_html

類型boolean 預設值false

預設情況下,help 選項的內容在範本中呈現之前會被跳脫。將此選項設定為 true 以不跳脫它們,當說明包含 HTML 元素時,這非常有用。

label

type: stringTranslatableMessage default: 標籤是從欄位名稱「猜測」而來的

設定在呈現欄位時將使用的標籤。設定為 false 將會抑制標籤

1
2
3
4
5
6
7
8
use Symfony\Component\Translation\TranslatableMessage;

$builder
    ->add('zipCode', null, [
        'label' => 'The ZIP/Postal code',
        // optionally, you can use TranslatableMessage objects as the label content
        'label' => new TranslatableMessage('address.zipCode', ['%country%' => $country], 'address'),
    ])

標籤也可以在範本中設定

1
{{ form_label(form.name, 'Your name') }}

label_attr

類型array 預設值[]

設定 <label> 元素的 HTML 屬性,這將在呈現欄位的標籤時使用。它是一個以 HTML 屬性作為鍵的關聯陣列。這些屬性也可以直接在範本內設定

1
2
3
{{ form_label(form.name, 'Your name', {
    'label_attr': {'class': 'CUSTOM_LABEL_CLASS'}
}) }}

label_html

類型boolean 預設值false

預設情況下,label 選項的內容在範本中呈現之前會被跳脫。將此選項設定為 true 以不跳脫它們,當標籤包含 HTML 元素時,這非常有用。

label_format

type: string default: null

設定用作欄位標籤的字串,以防 label 選項未被設定。當使用 關鍵字翻譯訊息 時,這非常有用。

如果您使用關鍵字翻譯訊息作為標籤,您通常會為同一個標籤產生多個關鍵字訊息(例如,profile_address_street, invoice_address_street)。這是因為標籤是為每個欄位的「路徑」建立的。為了避免重複的關鍵字訊息,您可以將標籤格式配置為靜態值,例如

1
2
3
4
5
6
7
8
// ...
$profileFormBuilder->add('address', AddressType::class, [
    'label_format' => 'form.address.%name%',
]);

$invoiceFormBuilder->add('invoice', AddressType::class, [
    'label_format' => 'form.address.%name%',
]);

此選項由子類型繼承。使用上面的程式碼,兩個表單的 street 欄位的標籤都將使用 form.address.street 關鍵字訊息。

標籤格式中有兩個變數可用

%id%
欄位的唯一識別符,包含欄位的完整路徑和欄位名稱(例如,profile_address_street);
%name%
欄位名稱(例如,street)。

預設值 (null) 會產生欄位名稱的 「人性化」版本

注意

label_format 選項在表單主題中評估。如果您 自訂了表單主題,請務必更新您的範本。

mapped

類型boolean 預設值true

如果您希望在讀取或寫入物件時忽略該欄位,您可以將 mapped 選項設定為 false

required

類型boolean 預設值true

如果為 true,將會呈現 HTML5 required 屬性。對應的 label 也會以 required 類別呈現。

這是表面上的,並且獨立於驗證。在最好的情況下,如果您讓 Symfony 猜測您的欄位類型,那麼此選項的值將會從您的驗證資訊中猜測出來。

注意

required 選項也會影響如何處理每個欄位的空資料。有關更多詳細資訊,請參閱 empty_data 選項。

row_attr

類型array 預設值[]

HTML 屬性的關聯陣列,這些屬性會新增到用於呈現 表單類型列 的元素

1
2
3
$builder->add('body', TextareaType::class, [
    'row_attr' => ['class' => 'text-editor', 'id' => '...'],
]);

另請參閱

如果您想將這些屬性新增到 表單類型小部件 元素,請使用 attr 選項。

這項作品,包括程式碼範例,根據 Creative Commons BY-SA 3.0 授權條款授權。
TOC
    版本