字段
编辑本页字段
字段允许显示您的Doctrine实体的内容CRUD页面.EasyAdmin提供了内置字段来显示所有常用数据类型,但您也可以这样做创建自己的字段.
配置显示字段
如果你的CRUD控制器从AbstractCrudController
由EasyAdmin提供,字段自动配置。在指数
在页面中,您将看到一些字段,在其余的页面中,您将看到尽可能多的字段,以显示Doctrine实体的所有属性。
实现configureFields ()
方法自定义要显示的字段列表:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
名称空间应用程序\控制器\管理;使用应用程序\实体\产品;使用EasyCorp\包\EasyAdminBundle\控制器\AbstractCrudController;类ProductCrudController扩展AbstractCrudController{公共静态函数getEntityFqcn():字符串{返回产品::类;}公共函数configureFields(字符串$pageName):可迭代的{/ /……}/ /……}
有几种方法可以定义要显示的字段列表。
选项1。返回带有要显示的属性名称的字符串。EasyAdmin自动为他们创建字段,并应用默认的配置选项:
1 2 3 4 5 6 7 8 9 10
公共函数configureFields(字符串$pageName):可迭代的{返回[“标题”,“描述”,“价格”,“股票”,“publishedAt”,);}
第二个选项。返回场
为Doctrine实体属性创建的对象。EasyAdmin转换这些泛型场
对象转换为用于显示每种类型属性的特定对象:
12 3 4 5 6 7 8 9 10 11 12
使用EasyCorp\包\EasyAdminBundle\场\场;公共函数configureFields(字符串$pageName):可迭代的{返回(字段::新(“标题”),现场::新(“描述”),现场::新(“价格”),现场::新(“股票”),现场::新(“publishedAt”),);}
选项3。返回适当的字段对象来显示每个属性:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用EasyCorp\包\EasyAdminBundle\场\DateTimeField;使用EasyCorp\包\EasyAdminBundle\场\IntegerField;使用EasyCorp\包\EasyAdminBundle\场\MoneyField;使用EasyCorp\包\EasyAdminBundle\场\TextEditorField;使用EasyCorp\包\EasyAdminBundle\场\文本框;公共函数configureFields(字符串$pageName):可迭代的{返回(文本框::新(“标题”), TextEditorField::新(“描述”), MoneyField::新(“价格”)->setCurrency (“欧元”), IntegerField::新(“股票”), DateTimeField::新(“publishedAt”),);}
字段构造函数的唯一强制参数是由该字段管理的Doctrine实体属性的名称。EasyAdmin使用PropertyAccess组件为了获得属性的值,实体可以将它们的访问定义为公共属性(例如;公共firstName美元
)或公共方法(例如:getFirstName()
,公共函数firstName()
).
请注意
EasyAdmin使用Symfob娱乐下载ony Forms创建和编辑Doctrine实体。这就是为什么所有实体属性都必须为空:它们的setter需要接受零
值及其getter必须被允许返回零
.在数据库中,相关的字段不一定是可空的。
地图上未标明的字段
字段通常引用相关教义实体的属性。但是,它们也可以引用与任何属性都没有关联的实体的方法。例如,如果你客户
实体定义firstName
而且姓
属性时,您可能希望显示两个值合并的“全名”字段。
为此,向实体添加以下方法:
12 3 4 5 6 7 8 9 10 11 12
使用学说\ORM\映射作为ORM;/**@ORM实体\ * /类客户{/ /……公共函数getFullName(){返回$这->getFirstName()。' '.$这->getLastName ();}}
现在,添加一个fullName
指向这个的字段getFullName ()
方法。字段名和方法之间的转换必须遵守PropertyAccess组件(如。foo_bar
->getFooBar ()
或fooBar ()
):
1 2 3 4 5 6 7
公共函数configureFields(字符串$pageName):可迭代的{返回(文本框::新(“fullName”),/ /……];}
未映射字段的主要限制是它们是不可排序的,因为它们不能包含在Doctrine查询中。
每页显示不同的字段
有几个方法可以根据当前页面有条件地显示字段:
1 2 3 4 5 6 7 8 9 10 11
公共函数configureFields(字符串$pageName):可迭代的{返回[IdField::新(“id”)->hideOnForm(),文本框::新(“firstName”),文本框::新(“姓”),文本框::新(“电话”), EmailField::新(“电子邮件”)->DateTimeField hideOnIndex ()::新(“createdAt”)->onlyOnDetail ()];}
这些是所有可用的方法:
hideOnIndex ()
hideOnDetail ()
hideOnForm ()
(将字段都隐藏在编辑
而且新
页)hideWhenCreating ()
hideWhenUpdating ()
onlyOnIndex ()
onlyOnDetail ()
onlyOnForms ()
(隐藏除。以外的所有页面中的字段编辑
而且新
)onlyWhenCreating ()
onlyWhenUpdating ()
如果每个页面上要显示的字段完全不同,则使用给定的字段pageName美元
区分它们的参数:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用EasyCorp\包\EasyAdminBundle\配置\Crud;公共函数configureFields(字符串$pageName):可迭代的{$id= IdField::新(“id”);$firstName=文本框::新(“firstName”);$姓=文本框::新(“姓”);$电话=文本框::新(“电话”);$电子邮件= EmailField::新(“电子邮件”);$createdAt= DateTimeField::新(“createdAt”);如果(Crud::PAGE_INDEX = = =$pageName) {返回[$id,$firstName,$姓,$电话];}elseif(Crud::PAGE_DETAIL = = =$pageName) {返回[“…'];}其他的{返回[“…'];}}
如果您需要更大的控制,请考虑使用以下定义字段的方法PHP发电机:
12 3 4 5 6 7 8 9 10 11 12 13
公共函数configureFields(字符串$pageName):可迭代的{收益率IdField::新(“id”)->hideOnForm ();如果(“…某种表情……”) {收益率文本框::新(“firstName”);收益率文本框::新(“姓”);}收益率文本框::新(“电话”);收益率EmailField::新(“电子邮件”)->hideOnIndex ();收益率DateTimeField::新(“createdAt”)->onlyOnDetail ();}
现场布局
表格的行
默认情况下,EasyAdmin每行显示一个表单字段。在行中,每个字段类型使用不同的默认宽度(例如,整数字段是窄的,代码编辑器字段是非常宽的)。方法重写此行为setColumns ()
每个字段的方法。
在使用此选项之前,您必须熟悉自举网格系统,它将每行分成12个相同宽度的列引导断点,分别是xs
(设备宽度< 576px),sm
(> = 576 px),医学博士
(> = 768 px),lg
(> = 992 px),xl
(>= 1,200px)和xxl)
(> = 1400 px)。
假设您希望显示两个名为startsAt
而且endsAt
在同一行上,每一个向量都包含本行的6列。这是你如何配置布局:
1 2 3 4 5 6 7 8 9 10 11
使用EasyCorp\包\EasyAdminBundle\场\DateTimeField;公共函数configureFields(字符串$pageName):可迭代的{返回[/ /…DateTimeField::新(“startsAt”)->setColumns (6), DateTimeField::新(“endsAt”)->setColumns (6),);}
这个例子在同一行上显示两个字段,除了xs
而且sm
断点,其中每个字段占用整个行(因为设备宽度太小)。
如果你需要根据设备宽度更好地控制设计,你可以通过响应式CSS类来传递一个字符串,这些类定义了不同断点上字段的宽度:
1 2 3 4 5 6 7 8 9 10 11
使用EasyCorp\包\EasyAdminBundle\场\DateTimeField;公共函数configureFields(字符串$pageName):可迭代的{返回[/ /…DateTimeField::新(“startsAt”)->setColumns ('col-sm-6 col-lg-5 col-xxl-3'), DateTimeField::新(“endsAt”)->setColumns ('col-sm-6 col-lg-5 col-xxl-3'),);}
这个例子添加了col-sm-6
,覆盖默认的EasyAdmin行为,并在同一行中显示这两个字段sm
断点。此外,它还减少了较大断点中的列数(lg
而且xxl)
)来改善这些字段的呈现。
提示
你也可以使用与重排序和偏移相关的CSS类:
1
收益率DateTimeField::新(“endsAt”)->setColumns ('col-sm-6 col-xxl-3 offset-lg-1 order-3');
由于Bootstrap网格的工作方式,当手动配置字段列时,每一行将包含尽可能多的字段。如果一个字段有4列,下一个字段有3列,那么行仍然有12 - 4 - 3 = 5
列来呈现其他字段。如果下一个字段的列数超过5列,则在下一行上呈现。
有时您需要更好地控制这种自动布局。例如,您可能希望在同一行上显示两个或多个字段,并确保该行上没有显示其他字段,即使有足够的空间。要做到这一点,请使用addRow ()
特殊方法FormField
字段强制创建新行(下一个字段将强制呈现在新行上):
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
使用EasyCorp\包\EasyAdminBundle\场\BooleanField;使用EasyCorp\包\EasyAdminBundle\场\DateTimeField;使用EasyCorp\包\EasyAdminBundle\场\FormField;公共函数configureFields(字符串$pageName):可迭代的{返回[/ /…DateTimeField::新(“startsAt”)->setColumns ('col-sm-6 col-lg-5 col-xxl-3'), DateTimeField::新(“endsAt”)->setColumns ('col-sm-6 col-lg-5 col-xxl-3'), FormField::addRow (),//您可以传递断点的名称,以仅在特定宽度上添加行/ / FormField: addRow (xl),//该字段总是在它自己的行上呈现,即使有//在前一行的' lg ', ' xl '和' xxl '断点中有足够的空间BooleanField::新(“发布”)->setColumns (2),);}
板形式
在显示大量字段的页面中,可以使用特殊属性创建的“面板”将它们分组FormField
对象:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
使用EasyCorp\包\EasyAdminBundle\场\FormField;公共函数configureFields(字符串$pageName):可迭代的{返回[IdField::新(“id”)->hideOnForm (),//面板通常只显示标题FormField::addPanel (“用户详细信息”),文本框::新(“firstName”),文本框::新(“姓”),//没有标题的面板仅在字段之间显示分隔FormField::DateTimeField addPanel ()::新(“createdAt”)->onlyOnDetail (),//面板也可以定义他们的图标,CSS类和帮助信息FormField::addPanel (“联系信息”)->setIcon (“电话”)->addCssClass (“可选的”)->setHelp (“电话号码优先”),文本框::新(“电话”),文本框::新(“电子邮件”)->hideOnIndex (),//面板也可以折叠(如果你的表单很长,很有用)//这使面板可折叠,但默认情况下呈现展开FormField::addPanel (“联系信息”)->可折叠的(),//这将使面板可折叠,并在默认情况下使其折叠FormField::addPanel (“联系信息”)->renderCollapsed ()];}
表单标签
在显示大量字段的页面中,您可以使用特殊属性创建的“tabs”将它们划分为选项卡FormField
对象:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
使用EasyCorp\包\EasyAdminBundle\场\FormField;公共函数configureFields(字符串$pageName):可迭代的{返回[IdField::新(“id”)->hideOnForm (),//添加一个标签FormField::addTab (第一个选项卡的),//你可以在表单标签中使用表单面板FormField::addPanel (“用户详细信息”),//你的字段文本框::新(“firstName”),文本框::新(“姓”),//添加第二个表单标签//标签也可以定义他们的图标,CSS类和帮助信息FormField::addTab (“联系方式标签”)->setIcon (“电话”)->addCssClass (“可选的”)->setHelp (“电话号码优先”),文本框::新(“电话”),);}
字段类型
这些都是EasyAdmin提供的内置字段:
ArrayField
AssociationField
AvatarField
BooleanField
ChoiceField
CodeEditorField
CollectionField
ColorField
CountryField
CurrencyField
DateField
DateTimeField
EmailField
HiddenField
IdField
ImageField
IntegerField
LanguageField
LocaleField
MoneyField
NumberField
PercentField
SlugField
TelephoneField
TextareaField
TextEditorField
文本框
TimeField
TimezoneField
UrlField
字段配置
本节显示所有字段类型可用的配置选项。此外,一些字段定义了额外的配置选项,如字段引用.
标签选项
字段构造函数的第二个可选参数是label:
1 2 3 4 5 6 7 8 9 10
//不显式定义标签或将其设置为NULL意味着//标签是自动生成的(例如:'firstName' -> '名字')文本框::新(“firstName”),文本框::新(“firstName”,零),//明确地设置标签以显示该标签文本框::新(“firstName”,“名字”),//设置标签为FALSE,不显示该字段的任何标签文本框::新(“firstName”,假),
设计选项
12 3 4 5 6 7 8 9 10 11 12 13 14 15
文本框::新(“firstName”,“名字”)// CSS类/类应用于字段内容(在'index'页面)//或到包装内容的行(在'detail', 'edit'和'new'页面中)//使用此方法为EasyAdmin应用的类添加新类->addCssClass (“文字大一些文本加粗的)//如果你想删除任何由EasyAdmin添加的CSS类,使用这个方法->setCssClass (“文字大一些文本加粗的)//这定义了用于在'index'和'detail'页面中呈现该字段的Twig模板//(这不会在'edit'/'new'页面中使用,因为他们使用Symfony Forms主题)ob娱乐下载->setTemplatePath (“管理/字段/ my_template.html.twig”)//用于右对齐数字/货币值(此设置在' details '页面中被忽略)->setTextAlign (“对”)
格式化选项
的formatValue ()
方法允许在对象中呈现值之前应用一个PHP可调用对象指数
而且细节
页:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
IntegerField::新(“股票”,“股票”)//回调函数通常只接受当前值作为参数->formatValue (函数($价值){返回$价值<10?sprintf ('%d **低股票**',$价值):$价值;});TextEditorField::新(“描述”)// callables还接收整个实体实例作为第二个参数->formatValue (函数($价值,$实体){返回$实体->发表()?$价值:“快到了……”;});//在PHP 7.4和更新版本中,你可以使用箭头函数// ->formatValue(fn ($value) => $value < 10 ?sprintf('%d **LOW STOCK**', $value): $value);// ->formatValue(fn ($value, $entity) => $entity->isPublished() ?$value: '马上就来…');
混杂。选项
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
文本框::新(“firstName”,“名字”)//如果是TRUE,列表可以通过这个字段排序(默认值:TRUE)//未映射的字段和Doctrine关联不能排序->setSortable (假)//在'detail', 'edit'和'new'页面中显示该字段的帮助信息->setHelp (“…')//用于在'eob娱乐下载dit'/'new'页面中呈现该字段的Symfony Form类型//(字段有这个选项的默认值,所以你通常不配置这个)->setFormType (TextType::类)//传递给Symfony表单类型的参数数组ob娱乐下载//(这只覆盖传递的表单类型选项的值;//它保持所有其他现有类型选项不变)->setFormTypeOptions ([“option_name”= >“option_value”])
字段引用
请注意
这个部分还没有准备好。我们正在努力。同时,您可以依靠IDE自动完成来发现每个字段的所有配置选项。
创建自定义字段
字段是实现的类EasyCorp
.尽管接口只需要实现几个方法,但您可能希望在内置字段中添加所有可用的方法,以配置所有公共字段选项。您可以使用EasyCorp
的。
假设您想要创建一个自定义MapField
它为给定的邮政地址呈现完整的地图。这是你可以为字段创建的类:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
名称空间应用程序\管理\场;使用EasyCorp\包\EasyAdminBundle\合同\场\FieldInterface;使用EasyCorp\包\EasyAdminBundle\场\FieldTrait;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextareaType;最后类MapField实现了FieldInterface{使用FieldTrait;/ * * *@param字符串|false|null $label */公共静态函数新(字符串$propertyName,$标签= null):自我{返回(新自我())->setProperty ($propertyName)->setLabel ($标签)//该模板用于'index'和'detail'页面->setTemplatePath (“管理/场/ map.html.twig”)//在'edit'和'new'页面中使用,以编辑字段内容//你也可以使用自己的表单类型->setFormType (TextareaType::类)->addCssClass (“分布图”)//加载与给定Webpack Encore条目关联的CSS和JS资产//在任何CRUD页面(index/detail/edit/new)。这相当于呼叫/ / encore_entry_link_tags(“…”)和encore_entry_script_tags(……)->addWebpackEncoreEntries (“admin-field-map”)//这些方法允许定义web资产加载时//字段显示在任何CRUD页面(index/detail/edit/new)->addCssFiles (“js / admin / field-map.css”)->addJsFiles (“js / admin / field-map.js”);}}
对象中呈现字段的模板指数
而且细节
CRUD页面.模板可以使用任何树枝模板特性和以下变量:
ea
,一个EasyCorp
实例,该实例存储管理上下文它在所有后端模板中都可用;\包 \ EasyAdminBundle \上下文 \ AdminContext 场
,一个EasyCorp
存储被呈现字段的配置和值的实例;\包 \ EasyAdminBundle \ Dto \ FieldDto 实体
,一个EasyCorp
实例,用于存储该字段所属实体的实例和关于该Doctrine实体的其他有用数据。\包 \ EasyAdminBundle \ Dto \ EntityDto
请注意
中没有使用该模板编辑
而且新
CRUD页面,使用ob娱乐下载Symfony形式主题定义如何显示每个表单字段。
这是所有。你现在可以在任何CRUD控制器中使用这个字段:
1 2 3 4 5 6 7 8 9
使用应用程序\管理\MapField;公共函数configureFields(字符串$pageName):可迭代的{返回[/ /……MapField::新(“shipAddress”),);}
自定义选项
如果字段可以以任何方式进行配置,则可以为其添加自定义选项。添加选项的推荐方法是将它们的名称定义为字段对象中的公共常量,并使用setCustomOption ()
方法中定义的FieldTrait
来设定他们的价值观。
想象一下MapField
在前一节中定义的允许使用谷歌Maps或OpenStreetMap来呈现地图。您可以添加该选项如下:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
名称空间应用程序\管理\场;使用EasyCorp\包\EasyAdminBundle\合同\场\FieldInterface;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextareaType;最后类MapField实现了FieldInterface{使用FieldTrait;公共常量OPTION_MAP_PROVIDER =“mapProvider”;公共静态函数新(字符串$propertyName字符串,?$标签= null):自我{返回(新自我())/ /……->setCustomOption (自我::OPTION_MAP_PROVIDER,“公开”);}公共函数useGoogleMaps():自我{$这->setCustomOption (自我::OPTION_MAP_PROVIDER,“谷歌”);返回$这;}公共函数useOpenStreetMap():自我{$这->setCustomOption (自我::OPTION_MAP_PROVIDER,“公开”);返回$这;}}
控件访问这些选项getCustomOptions ()
场DTO方法。例如,在一个Twig模板中:
1 2 3 4 5 6 7 8 9 10 11
{# admin /场/ map.html。树枝#}{%如果'谷歌' === field.customOptions.get('mapProvider') %}{#……#}{%endif%}如果你将字段选项定义为公共常量,你也可以在模板中访问它们(尽管结果代码有点冗长){%集map_provider_option =常数(' App \ \管理\ \ MapField: OPTION_MAP_PROVIDER”)%}{%如果'谷歌' === field.customOptions.get(map_provider_option) %}{#……#}{%endif%}
场配置器
某些字段的一些默认选项取决于实体属性的值,该值仅在运行时可用。这就是为什么你可以选择定义a场配置器,这是一个在呈现字段之前更新字段配置的类。
EasyAdmin为其内置字段定义了大量配置器。您也可以创建自己的配置器(可以配置自己的字段和/或内置字段)。字段配置器是实现的类EasyCorp
.
实现之后,为您的配置器定义一个Symfony服务,并用ob娱乐下载ea.field_configurator
标签。可以选择定义优先级
标记的属性,以便在内置配置器之前或之后运行配置器。