亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Symfony 表單:如何將不同的主題/小部件應用于特定的表單字段?

Symfony 表單:如何將不同的主題/小部件應用于特定的表單字段?

PHP
慕桂英546537 2023-03-04 11:01:21
基于 Symfony 3.4 的表單包含多個CheckboxType字段。其中一些字段應顯示為普通復選框(= 使用默認復選框小部件),而其他一些應顯示為開/關開關(如 iOS UISwitche)。因此,在相同類型的相同表單字段中 ( CheckboxType) 應該使用不同的小部件。我怎樣才能做到這一點?解決方案 1:當然我可以將自定義應用form_theme到完整的表單 ( {% form_theme form 'AppBundle:Form:myTheme.html.twig' %})。但這會影響表單中的所有復選框,而不僅僅是一個。所以這不是解決方案。解決方案 2:一種可行的解決方案是使用其 id 將不同的小部件應用于一個特定字段:{% block _user_registration_form_someCheckBoxRow %}     ... {% endblock %}雖然此解決方案有效,但我將不得不為所有受影響的表單中的所有受影響的字段創建/覆蓋相同的塊。這非常麻煩,因此不是一個好的解決方案。解決方案 3:另一個可行的解決方案是創建一個自定義項,FormType供應顯示為開關的復選框使用。此表單類型將擴展CheckboxType并且除了重寫blockPrefix.雖然這非常接近于一個好的解決方案,但有一個主要缺點:假設復選框開關有不同的主題/小部件。一個標簽在頂部,一個標簽在開關旁邊,等等。這些樣式中的每一個不僅需要自己的小部件,還需要自己的表單類型,需要在 等中注冊。這當然可以FormPass.php工作但也相當麻煩且容易出錯。所以,這將是解決方案,但不是nice一個。難道沒有更好的辦法嗎?我正在尋找類似的東西{{ form_row(form.someCheckbox, 'someWidget') }}。每個主題只有一個額外的文件,并且可以準確地分辨出哪個字段使用哪個主題。不需要額外的類、配置等。我以這種方式一無所獲。使用虛擬表單類型真的是最好的解決方案嗎?
查看完整描述

2 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

以下內容適用于 Symfony 5.0.x(盡管 3.4 不需要進行重大更改,可能只需要一些額外的配置):


要抽象主題處理,請定義您自己的復選框類型,如下(例如):


<?php

declare(strict_types=1);


namespace App\Form\Type;


use Symfony\Component\Form\AbstractType;

use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

use Symfony\Component\OptionsResolver\Options;

use Symfony\Component\OptionsResolver\OptionsResolver;


class ThemedCheckboxType extends AbstractType

{

? ? /**

? ? ?* @param OptionsResolver $resolver

? ? ?*/

? ? public function configureOptions(OptionsResolver $resolver): void

? ? {

? ? ? ? $resolver

? ? ? ? ? ? ->setDefaults([

? ? ? ? ? ? ? ? 'theme' => 'default',

? ? ? ? ? ? ? ? 'block_prefix' => static function (Options $options): ?string {

? ? ? ? ? ? ? ? ? ? return [

? ? ? ? ? ? ? ? ? ? ? ? 'default' => null,

? ? ? ? ? ? ? ? ? ? ? ? 'theme-a' => 'theme_a_checkbox',

? ? ? ? ? ? ? ? ? ? ? ? 'theme-b' => 'theme_b_checkbox',

? ? ? ? ? ? ? ? ? ? ][$options['theme']];

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ])

? ? ? ? ? ? ->setAllowedValues('theme', ['default', 'theme-a', 'theme-b']);

? ? }


? ? /**

? ? ?* @inheritDoc

? ? ?*/

? ? public function getParent(): string

? ? {

? ? ? ? return CheckboxType::class;

? ? }

}

然后在需要的地方簡單地使用它,例如:


$builder->add('test_a1', ThemedCheckboxType::class, [

? ? 'theme' => 'theme-a', // or others

]);

這樣,您可以注入自己的表單主題,在需要時直接操作復選框,例如


{% block theme_a_checkbox_widget %}

? ? <em>Theme-A</em>

? ? {{ block('checkbox_widget') }}

{% endblock %}


{% block theme_b_checkbox_widget %}

? ? <em>Theme-B</em>

? ? {{ block('checkbox_widget') }}

{% endblock %}

如果您不想使用額外的表單類型,可以使用自定義表單擴展來為默認復選框類型添加選項來實現同樣的效果。請參閱: https: //symfony.com/doc/current/form/create_form_type_extension.html


例如:


<?php

declare(strict_types=1);


namespace App\Form\Extension;


use Symfony\Component\Form\AbstractTypeExtension;

use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

use Symfony\Component\OptionsResolver\Options;

use Symfony\Component\OptionsResolver\OptionsResolver;


class CheckboxTypeExtension extends AbstractTypeExtension

{

? ? /**

? ? ?* @inheritDoc

? ? ?*/

? ? public static function getExtendedTypes(): iterable

? ? {

? ? ? ? return [CheckboxType::class];

? ? }


? ? /**

? ? ?* @inheritDoc

? ? ?*/

? ? public function configureOptions(OptionsResolver $resolver): void

? ? {

? ? ? ? $resolver

? ? ? ? ? ? ->setDefaults([

? ? ? ? ? ? ? ? 'theme' => 'default',

? ? ? ? ? ? ? ? 'block_prefix' => static function (Options $options): ?string {

? ? ? ? ? ? ? ? ? ? return [

? ? ? ? ? ? ? ? ? ? ? ? 'default' => null,

? ? ? ? ? ? ? ? ? ? ? ? 'theme-a' => 'theme_a_checkbox',

? ? ? ? ? ? ? ? ? ? ? ? 'theme-b' => 'theme_b_checkbox',

? ? ? ? ? ? ? ? ? ? ][$options['theme']];

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ])

? ? ? ? ? ? ->setAllowedValues('theme', ['default', 'theme-a', 'theme-b']);

? ? }

}

這允許:


$builder->add('test_a1', CheckboxType::class, [

? ? 'theme' => 'theme-a',

]);


查看完整回答
反對 回復 2023-03-04
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

您可以將主題應用于單個復選框:

{%?form_theme?form.my_special_checkbox?'Form/Theme/special_checkbox.html.twig'?%}

或者,如果您不需要單獨的主題(單個用例),您可以在當前 Twig 文件中編寫塊:

{%?block?_my_checkbox_widget_block?%}
????{#?the?theme?#}
????{%?endblock?%}

{%?form_theme?form.my_special_checkbox?_self?%}

我會使用自定義塊名稱創建自定義復選框組件并將其放入全局表單主題中,以便我可以在整個應用程序中重用它。


查看完整回答
反對 回復 2023-03-04
  • 2 回答
  • 0 關注
  • 156 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號