【问题标题】:How to set a Laravel Nova field to display as readonly or protected?如何将 Laravel Nova 字段设置为只读或受保护?
【发布时间】:2019-01-29 05:08:29
【问题描述】:

在 Laravel Nova (v1.0.3) 中,有几种方法可以对资源字段的可见性进行细粒度控制(canSee、showOnDetail 等)。我找不到任何控制字段是否可编辑的方法。如何显示字段,但阻止用户对其进行编辑(使其成为只读)?

例如,我想显示“创建于”字段,但我不希望用户能够更改它。

【问题讨论】:

  • 您想在更新表单中显示Created At 还是仅在详细视图中显示?
  • 我想在更新表单中显示一个不可编辑的字段。 (您不能从详细视图中编辑任何字段,对吗?)“创建于”字段只是一个示例,但我有几个字段非常有用。 Nova自24小时前发布以来,已经发布了5个版本,所以我认为这个“功能”很快就会出现。
  • 我的问题是,你想在表单中显示还是只在详细视图中显示?如果只在明细视图中,可以使用计算域来实现。

标签: laravel-nova


【解决方案1】:

此功能是在 v1.1.4(2018 年 10 月 1 日)中添加的。

  • 允许在 text 和 textarea 字段上设置任何属性

示例用法:

Text:: make('SomethingImportant')
    ->withMeta(['extraAttributes' => [
          'readonly' => true
    ]]),

【讨论】:

  • 我想在更新时设置只读。上面的代码也在创建时设置只读。这可能吗?
  • 请注意,使用此解决方案时,它唯一要做的就是将该输入设置为只读,但它根本不会触及用户权限。因此,如果您在浏览器开发工具中删除只读属性并为输入设置不同的值,它将很好地保存新值。因此,如果您将此表单暴露给您无法信任的用户,则可能会很危险。但是,您可以在 Laravel 中保护用户观察者中的输入。
  • 这仅适用于少数普通字段类型,例如文本字段。它不适用于例如 DateTime 字段。
【解决方案2】:

从 v2.0.1 开始,readonly() 是原生的,接受回调、闭包或布尔值,可以简单地调用为:

Text::make('Name')->readonly(true)

这可能是在此版本之前添加的,但变更日志没有说明是否是这种情况。

Nova v2.0 documentation

【讨论】:

    【解决方案3】:

    从 Nova >2.0 开始,您可以使用带有回调的 readonly 方法并检查资源:

    Text::make("Read Only on Update")
        ->readonly(function() {
            return $this->resource->id ? true : false;
        }),
    

    甚至更好:

    Text::make("Read Only on Update")
        ->readonly(function() {
            return $this->resource->exists;
        }),
    

    【讨论】:

      【解决方案4】:

      由于App\Laravel\Nova\Fields\Field可宏的,您可以轻松添加自己的方法以使其只读,例如

      App\Providers\NovaServiceProvider你可以在parent::boot()调用之后添加这个函数

      \Laravel\Nova\Fields\Field::macro('readOnly', function(){
          $this->withMeta(['extraAttributes' => [
              'readonly' => true
          ]]);
      
          return $this;
      });
      

      然后你可以像这样链接它

      Text::make("UUID")->readOnly()->help('you can not edit this field');
      

      【讨论】:

        【解决方案5】:

        从 1.0.3 开始我不相信有办法做到这一点(在源文件中看不到任何内容)。

        但是,您可以快速创建自己的“只读”字段,因为 Nova 可以很容易地添加更多字段类型。

        不过,我可能会耐心等待 - 向字段添加属性的功能可能会成为未来版本的一项功能。

        这样的东西会很酷:

        Text::make('date_created')
            ->sortable()
            ->isReadOnly()
        

        Text::make('date_created')
            ->sortable()
            ->attributes(['readonly'])
        

        【讨论】:

        • 谢谢 - 我没有立即考虑创建自己的领域,但这看起来确实很容易。不过,它可能只是时间问题。它现在已作为功能请求添加到新的 laravel-issues GitHub 存储库。
        【解决方案6】:

        您还可以使用canSee 函数。在我的情况下,我无法使用withMeta 解决方案,因为我需要我的一些用户(管理员)能够编辑该字段,但不是普通用户。

        例子:

             Number::make('Max Business Locations')
                ->canSee(function ($request) {
                    //checks if the request url ends in 'update-fields', the API 
                    //request used to get fields for the "/edit" page
                    if ($request->is('*update-fields')) {
                        return $request->user()->can('edit-subscription');
                    } else {
                        return true;
                    }
                }),
        

        【讨论】:

          【解决方案7】:

          2021 年 7 月,对于 Nova 版本 3.0readonly 方法可以接受不同类型的参数

          默认值:

          Text::make('Email')->readonly()
          

          直接布尔值:

          Text::make('Email')->readonly(true/false)
          

          关闭:

          Text::make('Email')->readonly(function ($request) {
              return !$request->user()->isNiceDude();
          }
          

          在此处阅读更多信息https://nova.laravel.com/docs/3.0/resources/fields.html#readonly-fields

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多