字段

未匹配的标注

定义字段

每个 Nova 资源均包含一个fields方法。此方法返回一个字段数组,每个字段通常继承了Laravel\Nova\Fields\{Field}类。Nova 提供了各种开箱即用的字段,包括文本输入、布尔、日期、文件上传、 Markdown 等多种字段。

要向资源添加字段,我们只需将它加入到资源的fields方法内。此方法会接受几个参数;但是,通常只需传递一个「易于阅读的」字段名称。Nova 对此名称应用「蛇形命名法(下划线命名法)」以确定对应的底层数据库列:

use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;

/**
 * 获取资源显示的字段。
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        Text::make('Name')->sortable(),
    ];
}

字段列名约定

如上所述,Nova 对字段的展示名称应用「蛇形命名法(下划线命名法)」 ,以确定底层的数据库列。但如果需要,你可以将列名作为第二个参数传递给字段的make方法:

Text::make('Name', 'name_column')

显示 / 隐藏字段

你经常会在某些场景下只想显示某个字段。例如,你通常有一个在查询列表中无需显示的Password字段。同样地,你也想在「创建 / 更新表单」里只显示Created At字段。Nova 可以轻松实现在屏幕上显示 / 隐藏字段。

下面的方法可在显示的上下文里展示 / 隐藏字段:

  • hideFromIndex
  • hideFromDetail
  • hideWhenCreating
  • hideWhenUpdating
  • onlyOnIndex
  • onlyOnDetail
  • onlyOnForms
  • exceptOnForms

你可以在字段定义时链式调用这些方法,以指示 Nova 在哪里可以显示 / 隐藏字段:

Text::make('Name')->hideFromIndex()

字段面板

如果你的资源包含很多字段,屏幕上资源的「详情页」会很拥挤。鉴于此,你可以选择把字段组拆分到它们自己的「面板」里:

Field Panel Example

你也可以通过在资源的fields方法里创建一个Panel实例实现此目的。每个Panel实例需要一个名称和一个属于它的字段数组:

use Laravel\Nova\Panel;

/**
 * 获取资源要展示的字段。
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function fields(Request $request)
{
    return [
        ID::make()->sortable(),

        new Panel('Address Information', $this->addressFields()),
    ];
}

/**
 * 获取资源的所有地址字段。
 *
 * @return array
 */
protected function addressFields()
{
    return [
        Place::make('Address', 'address_line_1')->hideFromIndex(),
        Text::make('Address Line 2')->hideFromIndex(),
        Text::make('City')->hideFromIndex(),
        Text::make('State')->hideFromIndex(),
        Text::make('Postal Code')->hideFromIndex(),
        Country::make('Country')->hideFromIndex(),
    ];
}

可排序字段

当向资源添加一个字段时,你可以使用sortable方法指示资源列表可以按照给定的字段排序:

Text::make('Name', 'name_column')->sortable()

字段类型

关联字段

这部分文档只讨论非关联字段。想了解关联字段的更多信息,请查看 模型关联

Nova 提供了丰富的字段类型。那么,让我们浏览一下所有的类型和相应选项:

Avatar 字段

Avatar字段继承了 Image 字段 ,接受相同配置选项:

use Laravel\Nova\Fields\Avatar;

Avatar::make('Avatar')

如果一个资源包含Avatar字段,此字段会展示在搜索结果的资源标题旁边:

Avatar Search Results

Boolean 字段

Boolean字段可以用来表示布尔或「短整数」型的数据库列。例如,假设你的数据库有一个叫做active的布尔型列,你就可以给资源添加一个Boolean字段,就像这样:

use Laravel\Nova\Fields\Boolean;

Boolean::make('Active')

自定义 True / False 值

如果使用truefalse10以外的值来表示「true」或「false」,可以指示 Nova 使用应用程序可识别的自定义值。为此,请在定义Boolean字段时链式调用trueValuefalseValue方法:

Boolean::make('Active')
        ->trueValue('On')
        ->falseValue('Off');

Code 字段

Code字段为 Nova 后台管理面板提供了一个漂亮的代码编辑器。通常,Code字段应该添加在Text型的数据库列上。然而,也可以把它添加在JSON型的数据库列上:

use Laravel\Nova\Fields\Code;

Code::make('Snippet')

查询列表里的 Code 字段

默认地,Nova 在资源的查询列表里不显示Code字段。

编辑 JSON

如果打算对给定的一个Code字段实例只编辑 JSON,可以在字段定义时链式调用json方法:

Code::make('Options')->json()

语法高亮

你可以使用language方法自定义Code字段相应语言的语法高亮:

Code::make('Snippet')->language('php')

Code字段当前支持高亮的语言是:

  • dockerfile
  • javascript
  • markdown
  • nginx
  • php
  • ruby
  • sass
  • shell
  • vue
  • xml
  • yaml

Country 字段

Country 字段会生成一个包含了所有国家列表的 Select 字段 。这个字段存储的是指代具体国家的二维数字码。

use Laravel\Nova\Fields\Country;

Country::make('Country', 'country_code')

Currency 字段

Currency 字段会生成一个Number 字段,使用 PHP 的 money_format 函数自动展示 。 你也可以使用 format 方法指定显示格式; 否者默认使用 %i 格式:

use Laravel\Nova\Fields\Currency;

Currency::make('Price')

Currency::make('Price')->format('%.2n');

Date 字段

Date 存储日期值(不包括时间)。有关 Nova 内日期和时区的更多信息, 参阅 日期 / 时区文档:

use Laravel\Nova\Fields\Date;

Date::make('Birthday')

DateTime 字段

DateTime字段可以用来存储日期时间值。想了解 Nova 中日期和时区的更多信息,请查看 日期字段

use Laravel\Nova\Fields\DateTime;

DateTime::make('Updated At')->hideFromIndex()

File 字段

想了解有关定义File字段和处理上传的更多信息,请查看 文件字段

use Laravel\Nova\Fields\File;

File::make('Attachment')

Gravatar 字段

Gravatar字段不对应于应用程序数据库的任何一种列类型。相反,它可以显示与模型关联的「Gravatar」头像。

默认地,Gravatar URL 基于模型的email列生成。但是,如果用户的邮箱地址不存储在email列,你可以给字段的make方法传递一个自定义列名:

use Laravel\Nova\Fields\Gravatar;

// 使用「email」列……
Gravatar::make()

// 使用「email_address」列……
Gravatar::make('Avatar', 'email_address')

ID 字段

ID 表示资源的数据库表主键。通常你定义的每个 Nova 资源都应该包含 ID 字段。默认情况下,ID 字段假定基础数据库列名为 id:

use Laravel\Nova\Fields\ID;

// 使用 "id" 作为列名...
ID::make()

// 使用 "id_column" 作为列名...
ID::make('ID', 'id_column')

Image 字段

Image 字段继承于 File 字段 ,接受相同的参数和配置。与 File 字段的区别在于, Image 字段将在查看资源时显示基础图像的缩列图预览:

use Laravel\Nova\Fields\Image;

Image::make('Photo')

File 字段

了解更多定义文件字段和处理上传的方法,参阅 file 字段文档

Markdown 字段

Markdown字段为它对应的数据库列提供了一个「所见即所得」的 Markdown 编辑器。通常,该字段对应一个TEXT型的数据库列。Markdown字段将在与其对应的数据库列里存储原生 Markdown 文本:

use Laravel\Nova\Fields\Markdown;

Markdown::make('Biography')

Number 字段

Number字段提供了一个input控件,其type属性值为number

use Laravel\Nova\Fields\Number;

Number::make('price')

你可以在生成的input控件上,使用minmaxstep方法设置相应属性:

Number::make('price')->min(1)->max(1000)->step(0.01)

Password 字段

Password字段提供了一个input控件,其type属性值为password

use Laravel\Nova\Fields\Password;

Password::make('Password')

当输入密码为空时,Password字段会自动保留存储在数据库中的密码。因此,典型的密码字段定义看起来就像下面这样:

Password::make('Password')
    ->onlyOnForms()
    ->creationRules('required', 'string', 'min:6')
    ->updateRules('nullable', 'string', 'min:6'),

Place 字段

Place 字段利用「Algolia Places API 」的强大功能提供超快的地址搜索和自动完成功能。使用这个字段不必拥有 Algolia 账号。

典型地,一个 Place 字段与其他相关地址字段一起被定义。在这个例子中,为了保持我们的资源整洁,我们将用 merge 方法将地址字段定义提取到他们自己的方法中:

use Laravel\Nova\Fields\Place;

/**
 * 获取资源显示的字段
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        $this->addressFields(),
    ];
}

/**
 * 获取资源中的地址字段
 *
 * @return \Illuminate\Http\Resources\MergeValue
 */
protected function addressFields()
{
    return $this->merge([
        Place::make('Address', 'address_line_1')->hideFromIndex(),
        Text::make('Address Line 2')->hideFromIndex(),
        Text::make('City')->hideFromIndex(),
        Text::make('State')->hideFromIndex(),
        Text::make('Postal Code')->hideFromIndex(),
        Country::make('Country')->hideFromIndex(),
    ]);
}

搜索国家

默认情况下, Place 字段会搜索全世界范围内的地址。如果你想限制搜索的国家,可以使用 countries 方法:

Place::make('Address', 'address_line_1')->countries(['US', 'CA'])

搜索城市

如果你想用 Place 字段来搜索城市而不是地址的话,你可以使用 onlyCities 方法让结果中只列出城市:

Place::make('City')->onlyCities()

城市自动补全

当使用 Place 字段搜索城市时, statecountry 字段依然会自动补全, postal_code 则不会。

配置字段自动完成

默认时,Place 字段将根据他们的名字,自动完成相关地址字段。Place 字段将自动填充的字段名包括: address_line_2citystatepostal_codecountry。然而,你可能使用以下方法来自定义应该自动完成的字段:

  • secondAddressLine($column)
  • city($column)
  • state($column)
  • postalCode($column)
  • country($column)

示例:

Place::make('Address', 'address_line_1')
    ->secondAddressLine('address_2')
    ->city('city_name')
    ->state('state_code')
    ->postalCode('zip_code')
    ->country('country_code')

Select 字段

Select 字段用于生成下拉选择菜单。可以使用 options 方法定义菜单选项:

use Laravel\Nova\Fields\Select;

Select::make('Size')->options([
    'S' => 'Small',
    'M' => 'Medium',
    'L' => 'Large',
])

在资源的索引和详情界面,将显示 Select 字段的键值。 如果你想要显示标签,可以使用 displayUsingLabels 方法:

Select::make('Size')->options([
    'S' => 'Small',
    'M' => 'Medium',
    'L' => 'Large',
])->displayUsingLabels()

Status 字段

Status 字段用于显示 “进度状态”。Nova 使用 Status 字段指示排队操作的当前状态(等待,运行中,已完成)。 你可以根据具体情况定义这个字段:

Status Field Example

loadingWhenfailedWhen 方法用于定义指示“加载”和“失败”的文字。 例如,我们定义数据库列的“加载”指示符为 waitingrunning

use Laravel\Nova\Fields\Status;

Status::make('Status')
        ->loadingWhen(['waiting', 'running'])
        ->failedWhen(['failed'])

Text 字段

Text 字段提供了一个 type 属性为 textinput 控件:

use Laravel\Nova\Fields\Text;

Text::make('name')

Textarea 字段

Textarea 字段提供一个 textarea 控件:

use Laravel\Nova\Fields\Textarea;

Textarea::make('Biography')

时区字段

时区字段 生成一个包含世界时区的 下拉框 字段:

use Laravel\Nova\Fields\Timezone;

Timezone::make('Timezone')

Trix 字段

Trix 字段为其关联的字段提供一个 Trix 编辑器。通常,这个字段将和你数据库中的 Text 列对应。Trix 字段将为其对应的数据列存储对应的 Html:

use Laravel\Nova\Fields\Trix;

Trix::make('Biography')

文件上传

Nova 当前不支持在 Trix 字段中嵌入文件上传。

Computed 字段

除了显示与数据库中的列关联的字段外, Nova 还支持我们创建 "computed 字段"。Computed 字段用于显示与数据库列无关的计算值。 由于它们与数据库列无关,因此计算字段可能无法 排序。通过将调用名(而不是列名)作为第二个参数传递给字段的 make 方法来创建计算字段:

Text::make('Name', function () {
    return $this->first_name.' '.$this->last_name;
})

访问模型属性

正如上面示例使用到的一样,你可以用 $this 来访问资源的基础属性和关联。

自定义字段

字段解析 / 格式化

resolveUsing 方法允许在数据库中检索到字段后,且在将字段发送到 Nova 前端之前自定义字段格式。该方法从底层数据库中获取到原始记录后接受回调:

Text::make('Name')->resolveUsing(function ($name) {
    return strtoupper($name);
})

如果仅在资源的索引或详情页展示自定义格式,可以使用 displayUsing 方法。就像 resolveUsing 方法,该方法接受一个简单的回调:

Text::make('Name')->displayUsing(function ($name) {
    return strtoupper($name);
})

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/nova/1.0/field/...

译文地址:https://learnku.com/docs/nova/1.0/field/...

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
贡献者:7
讨论数量: 0
发起讨论 只看当前版本


暂无话题~