字段

编辑本页

字段

字段允许显示您的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
名称空间应用程序控制器管理使用应用程序实体产品使用EasyCorpEasyAdminBundle控制器AbstractCrudControllerProductCrudController扩展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
使用EasyCorpEasyAdminBundle公共函数configureFields(字符串pageName可迭代的返回(字段::“标题”),现场::“描述”),现场::“价格”),现场::“股票”),现场::“publishedAt”),);}

选项3。返回适当的字段对象来显示每个属性:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用EasyCorpEasyAdminBundleDateTimeField使用EasyCorpEasyAdminBundleIntegerField使用EasyCorpEasyAdminBundleMoneyField使用EasyCorpEasyAdminBundleTextEditorField使用EasyCorpEasyAdminBundle文本框公共函数configureFields(字符串pageName可迭代的返回(文本框::“标题”), TextEditorField::“描述”), MoneyField::“价格”->setCurrency (“欧元”), IntegerField::“股票”), DateTimeField::“publishedAt”),);}

字段构造函数的唯一强制参数是由该字段管理的Doctrine实体属性的名称。EasyAdmin使用PropertyAccess组件为了获得属性的值,实体可以将它们的访问定义为公共属性(例如;公共firstName美元)或公共方法(例如:getFirstName()公共函数firstName()).

请注意

EasyAdmin使用Symf欧宝娱乐app下载地址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查询中。在某些情况下,您可以自己通过使用SQL计算未映射的字段内容来克服这一限制。要做到这一点,请重写createIndexQueryBuilder ()使用的方法CRUD控制器

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
名称空间应用程序控制器管理使用EasyCorpEasyAdminBundle配置Crud使用EasyCorpEasyAdminBundle控制器AbstractCrudControllerUserCrudController扩展AbstractCrudController/ /……公共函数configureFields(字符串pageName可迭代的返回(文本框::“fullName”),/ /……];}公共函数createIndexQueryBuilder(SearchDtosearchDto, EntityDtoentityDto, FieldCollection字段, FilterCollection过滤器QueryBuilderqueryBuilder::createIndexQueryBuilder (searchDtoentityDto字段过滤器);//如果未设置用户定义排序如果0= = = count (searchDto->getSort ())) {queryBuilder->addSelect (CONCAT(实体。first_name, \' \', entity.last_name) AS HIDDEN full_name'->addOrderBy (“full_name”“DESC”);}返回queryBuilder;}}

每页显示不同的字段

有几个方法可以根据当前页面有条件地显示字段:

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
使用EasyCorpEasyAdminBundle配置Crud公共函数configureFields(字符串pageName可迭代的id= IdField::“id”);firstName=文本框::“firstName”);=文本框::“姓”);电话=文本框::“电话”);电子邮件= EmailField::“电子邮件”);createdAt= DateTimeField::“createdAt”);如果(Crud::PAGE_INDEX = = =pageName){返回(idfirstName电话];}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
使用EasyCorpEasyAdminBundleDateTimeField公共函数configureFields(字符串pageName可迭代的返回(/ /…DateTimeField::“startsAt”->setColumns (6), DateTimeField::“endsAt”->setColumns (6),);}

这个例子在同一行上显示两个字段,除了xs而且sm断点,其中每个字段占用整个行(因为设备宽度太小)。

如果你需要根据设备宽度更好地控制设计,你可以通过响应式CSS类来传递一个字符串,这些类定义了不同断点上字段的宽度:

1 2 3 4 5 6 7 8 9 10 11
使用EasyCorpEasyAdminBundleDateTimeField公共函数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
使用EasyCorpEasyAdminBundleBooleanField使用EasyCorpEasyAdminBundleDateTimeField使用EasyCorpEasyAdminBundleFormField公共函数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
使用EasyCorpEasyAdminBundleFormField公共函数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
使用EasyCorpEasyAdminBundleFormField公共函数configureFields(字符串pageName可迭代的返回[IdField::“id”->hideOnForm (),//添加一个标签FormField::addTab (第一个选项卡的),//你可以在表单标签中使用表单面板FormField::addPanel (“用户详细信息”),//你的字段文本框::“firstName”),文本框::“姓”),//添加第二个表单标签//标签也可以定义他们的图标,CSS类和帮助信息FormField::addTab (“联系方式标签”->setIcon (“电话”->addCssClass (“可选的”->setHelp (“电话号码优先”),文本框::“电话”),);}

字段类型

这些都是EasyAdmin提供的内置字段:

Doctrine类型和EasyAdmin字段之间的映射

下表显示了推荐使用的EasyAdmin字段,具体取决于DBAL类型您的实体属性:

主义类型 EasyAdmin推荐字段
数组 ArrayField
ascii_string 文本框
长整型数字 文本框
二进制 (不支持)
(不支持)
布尔 BooleanField
date_immutable DateField
日期 DateField
datetime_immutable DateTimeField
datetime DateTimeField
datetimetz_immutable DateTimeField
datetimetz DateTimeField
datetinterval 文本框
小数 NumberField
浮动 NumberField
guid 文本框
整数 IntegerField
json_array ArrayField
json 文本框TextareaFieldCodeEditorField
对象 文本框TextareaFieldCodeEditorField
simple_array ArrayField
短整型 IntegerField
字符串 文本框
文本 TextareaFieldTextEditorFieldCodeEditorField
time_immutable TimeField
时间 TimeField

除此之外,EasyAdmin还为特定的值包含了其他字段类型:

  • AvatarFieldColorFieldCountryFieldCurrencyFieldEmailFieldIdFieldImageFieldLanguageFieldLocaleFieldSlugFieldTelephoneFieldTimezoneField而且UrlField与Doctrine的工作很好字符串类型。
  • MoneyField而且PercentField与Doctrine的工作很好小数浮动而且整数,这取决于您如何存储数据。
  • AssociationFieldCollectionField而且ChoiceField是否与Symfony的字段相对应欧宝娱乐app下载地址EntityTypeCollectionType而且ChoiceType分别。

提示

如果你想用Doctrine的自定义映射类型你应该创建一个Symfony的欧宝娱乐app下载地址自定义表单字段类型也是EasyAdmin的一个自定义字段.注意,对于一些自定义映射类型,如果需要,还需要自定义EasyAdmin的搜索和筛选功能。

字段配置

本节显示所有字段类型可用的配置选项。此外,一些字段定义了额外的配置选项,如字段引用

标签选项

字段构造函数的第二个可选参数是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 16 17 18 19 20 21
文本框::“firstName”“名字”//如果你的字段需要一个特定的表单主题来正确呈现,使用这个方法->addFormTheme (“@FOSCKEditor /形式/ ckeditor_widget.html.twig”//您可以使用相同的方法添加多个表单主题->addFormTheme (“theme1.html.twig”“theme2.html.twig”“theme3.html.twig”// CSS类/类应用于字段内容(在'index'页面)//或到包装内容的行(在'detail', 'edit'和'new'页面中)//使用此方法为EasyAdmin应用的类添加新类->addCssClass (“文字大一些文本加粗的//如果你想删除任何由EasyAdmin添加的CSS类,使用这个方法->setCssClass (“文字大一些文本加粗的//这定义了用于在'index'和'detail'页面中呈现该字段的Twig模板//(这不会在'edit'/'new'页面中使用,因为他们使用Symfony Forms主题)欧宝娱乐app下载地址->setTemplatePath (“管理/字段/ my_template.html.twig”//用于右对齐数字/货币值(此设置在' details '页面中被忽略)->setTextAlign (“对”);

类似于CRUD设计选项,字段还可以加载CSS文件、Javascript文件和Webpack Encore条目,并将HTML内容添加到< >头和/或<身体>后台页面的元素:

1 2 3 4 5 6 7
文本框::“firstName”“名字”->addCssFiles (“包/某些包/ foo.css”“some-custom-styles.css”->addJsFiles (“管理/ some-custom-code.js”->addWebpackEncoreEntry (“admin-maps”->addHtmlContentToHead (''->addHtmlContentToBody (“< !——生成于'.time()。“- >”);

默认情况下,这些web资产加载在所有后端页面。如果需要更精确的控制,请使用资产类来定义资产:

1 2 3 4 5 6 7 8 9 10
使用EasyCorpEasyAdminBundle配置资产/ /……文本框::“firstName”“名字”->addCssFiles(资产::“包/某些包/ foo.css”->ignoreOnForms ()->htmlAttr (“媒体”“打印”))->addJsFiles(资产::“管理/ some-custom-code.js”->onlyOnIndex ()->推迟())->addWebpackEncoreEntry(资产::“admin-maps”->onlyWhenCreating ()->预加载())//您甚至可以定义资产所属的Symfony Asset欧宝娱乐app下载地址包->addCssFiles(资产::“一些路径/ bar.css”->包(“legacy_assets”));

格式化选项

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 16 17 18 19 20
文本框::“firstName”“名字”//如果是TRUE,列表可以通过这个字段排序(默认值:TRUE)//未映射的字段和Doctrine关联不能排序->setSortable (//在'detail', 'edit'和'new'页面中显示该字段的帮助信息->setHelp (“…'//设置Symfony表单中' empty_data '选项的值欧宝娱乐app下载地址//见https://symf欧宝娱乐app下载地址ony.com/doc/current/reference/forms/types/form.html#empty-data->setEmptyData (“简”//用于在'e欧宝娱乐app下载地址dit'/'new'页面中呈现该字段的Symfony Form类型//(字段有这个选项的默认值,所以你通常不配置这个)->setFormType (TextType::类)//传递给Symfony表单类型的参数数组欧宝娱乐app下载地址//(这只覆盖传递的表单类型选项的值;//它保持所有其他现有类型选项不变)->setFormTypeOptions ([“option_name”= >“option_value”])

创建自定义字段

字段是实现的类EasyCorp\包\ EasyAdminBundle\合同\领域\ FieldInterface.尽管接口只需要实现几个方法,但您可能希望在内置字段中添加所有可用的方法,以配置所有公共字段选项。您可以使用EasyCorp\包\ EasyAdminBundle\领域\ FieldTrait的。

假设您想要创建一个自定义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
名称空间应用程序管理使用EasyCorpEasyAdminBundle合同FieldInterface使用EasyCorpEasyAdminBundleFieldTrait使用欧宝娱乐app下载地址组件形式扩展核心类型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\包\ EasyAdminBundle\ Dto\ EntityDto实例,用于存储该字段所属实体的实例和关于该Doctrine实体的其他有用数据。

请注意

中没有使用该模板编辑而且CRUD页面,使用欧宝娱乐app下载地址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
名称空间应用程序管理使用EasyCorpEasyAdminBundle合同FieldInterface使用欧宝娱乐app下载地址组件形式扩展核心类型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\包\ EasyAdminBundle\合同\领域\ FieldConfiguratorInterface

实现之后,为您的配置器定义一个Symfony服务,并用欧宝娱乐app下载地址ea.field_configurator标签。可以选择定义优先级标记的属性,以便在内置配置器之前或之后运行配置器。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。