keko94/nova-inline-relationship-extended

A Laravel Nova 字段,用于在行内显示关系属性。

1.0.8 2023-05-31 21:06 UTC

This package is auto-updated.

Last update: 2024-09-30 01:41:16 UTC


README

请注意,这是一个实验性项目,并且目前没有由我们的团队积极维护和支持。如果您有兴趣帮助维护/扩展此项目,请与我们联系。

背景:我们最初于2019年开始此项目,旨在为Laravel Nova添加行内关系功能。除了遇到一些重大复杂性,阻碍了我们高效地推进项目外,Laravel Nova后来也增加了功能,覆盖了我们试图实现的大部分内容,但并非全部。在此阶段,我们建议使用Laravel Nova的核心功能,而不是此包。

Banner

Nova Inline Relationship

Latest Version on Packagist Total Downloads Codacy Badge Actions Status

Nova Inline Relationship 允许您从父对象的创建/编辑屏幕直接管理(添加/编辑/更新/删除/重新排序)对象的关系。通过将关系作为行内属性呈现,您可以为客户提供一种流畅高效的工作流程,以管理复杂数据。

要求

此 Nova 字段需要 Nova 2.0 或更高版本。

安装

您可以通过 composer 在使用 Nova 的 Laravel 应用中安装此包

composer require kirschbaum-development/nova-inline-relationship

使用

要在您的模型资源中使用 NovaInlineRelationshipExtended,您只需要将行内方法添加到相关模型资源字段的常规语法中。

假设 BlogPost 模型与 Image 模型有一个一对一的关系,那么您的 BlogPost 资源将如下所示

namespace App\Nova;

use Laravel\Nova\Fields\Image;

class BlogPost extends Resource
{
    //...
    public function fields(Request $request)
    {
        return [
            //...

            HasMany::make('Images', 'images', Image::class)->inline(),
        ];
    }
}

注意: 您需要为 Image 添加一个 Nova 资源 - 所有字段和规则都将从指定的资源中检索。您必须将资源指定为关系字段的第三个参数,如上所示。

添加相关模型

Create View

设置完成后,您可以在创建新的基本模型时直接添加新的相关模型。您可以使用“添加新图像”按钮将新的 Image 添加到 BlogPost

Create Related Model

查看相关模型

相关模型现在也将以行内方式显示。

Detail View

更新相关模型

您还可以更新、重新排序(对于一对一关系)和删除相关模型。

Rearrange Models

您可以使用 sortUsing() 方法添加拖放功能以更新相关模型的顺序。在以下代码示例中,我们使用名为 order 的字段来存储 Images 模型的排序顺序。

HasMany::make('Images')->inline()->sortUsing('order'),

必需关系

有时您可能在创建模型时需要强制子关系。为此,只需使用 requireChild() 方法。例如,您可能希望创建一个新用户,并强制为该用户创建一个新的个人资料。

HasOne::make('Profile', 'profile', Profile::class)->inline()->requireChild(),

第三方包支持

我们提供了一种简单的方法来解决第三方包偶尔与 Nova Inline Relationships 不兼容的问题。这些包偶尔以稍微不同的方式处理它们返回的字段子集。我们有一种简单的方法可以轻松集成这些包的功能。这可能不会适用于所有情况,但应该允许大多数第三方包。

您必须使用以下命令发布此包的配置

php artisan vendor:publish

这将发布一个配置文件,名为config/nova-inline-relationships.php。在third-party数组中添加您的自定义命名空间路径。例如:

'third-party' => [
    'App\Nova\ThirdPartyIntegrations',
    'Keko94\NovaInlineRelationshipExtended\Integrations',
]

在该命名空间内创建一个新类,其结构如下:

<?php

namespace App\Nova\ThirdPartyIntegrations;

use Keko94\NovaInlineRelationshipExtended\Integrations\ThirdParty;
use Keko94\NovaInlineRelationshipExtended\Integrations\Contracts\ThirdPartyContract;

class SomeThirdPartyField extends ThirdParty implements ThirdPartyContract
{
    /**
     * Fields array from object.
     *
     * @return array
     */
    public function fields(): array
    {
        // The following is just an example and should be updated to meet your needs.
        return $this->field->customFieldArray;
    }
}

类的名称非常重要。它应该与Nova资源中使用的字段名称相同。如果字段类为CustomField,则第三方集成类也应称为CustomField

fields()方法应返回一个包含所有自定义字段或包字段的数组。

如果您认为您创建的第三方集成应该包含在这个包中,请创建一个pull request,我们将审阅它!

支持的关系

目前支持以下eloquent关系:

  • BelongsTo
  • HasOne
  • HasMany
  • MorphOne
  • MorphMany

支持的字段

以下Nova 2.0原生字段被确认可以使用:

  • 布尔值
  • 代码
  • 国家
  • 货币
  • 日期
  • 日期时间
  • Markdown
  • 数字
  • 密码
  • 地点
  • 选择
  • 文本
  • 文本区域
  • 时区
  • Trix
  • 头像
  • 图片
  • 文件

变更日志

请参阅CHANGELOG以获取最近更改的更多信息。

贡献

请参阅CONTRIBUTING以获取详细信息。

安全

如果您发现任何安全问题,请通过电子邮件navneet@kirschbaumdevelopment.comnathan@kirschbaumdevelopment.com而不是使用问题跟踪器来报告。

赞助

本包的开发由Kirschbaum Development Group赞助,该公司是一家以解决问题、团队建设和社区为中心的开发者驱动型公司。了解更多关于我们加入我们

许可

MIT许可(MIT)。请参阅许可文件以获取更多信息。