smskin/nova-dependency-container

一个Laravel Nova字段容器,允许根据其他字段的值进行依赖

1.3.4 2022-01-30 15:54 UTC

README

Latest Version on Packagist Total Downloads License


描述

一个用于分组依赖于其他字段值的字段容器。可以在任何字段类型或值上设置依赖。


演示

Demo


版本

  • 安装v1.2.x以用于Laravel v5.8或v6.x和Nova 2.x
  • 安装v1.1.2以用于Laravel v5.7和Nova v1.x

安装

可以通过Composer安装此包。

composer require epartment/nova-dependency-container

用法

  1. Epartment\NovaDependencyContainer\HasDependencies特质添加到您的Nova资源中。
  2. Epartment\NovaDependencyContainer\NovaDependencyContainer添加到您的Nova资源fields方法中。
  3. Epartment\NovaDependencyContainer\ActionHasDependencies特质添加到您希望使用依赖的Nova操作中。
class Page extends Resource
{
    use HasDependencies;

    public function fields(Request $request)
    {
        return [
            
            Select::make('Name format', 'name_format')->options([
                0 => 'First Name',
                1 => 'First Name / Last Name',
                2 => 'Full Name'
            ])->displayUsingLabels(),

            NovaDependencyContainer::make([
                Text::make('First Name', 'first_name')
            ])->dependsOn('name_format', 0),

        ];
    }
}

依赖

该包支持四种类型的依赖

  1. ->dependsOn('field', 'value')
  2. ->dependsOnNot('field', 'value')
  3. ->dependsOnEmpty('field')
  4. ->dependsOnNotEmpty('field')
  5. ->dependsOnNullOrZero('field')

可以通过在NovaDependencyContainer上链式调用方法来组合这些依赖

NovaDependencyContainer::make([
  // dependency fields
])
->dependsOn('field1', 'value1')
->dependsOnNotEmpty('field2')
->dependsOn('field3', 'value3')

用作依赖的字段可以是任何Laravel Nova字段类型。目前仅支持两种关系字段类型,BelongsToMorphTo

以下是一个使用复选框的示例

Demo


BelongsTo依赖

如果我们遵循Novas文档中关于Post模型属于User模型的例子,来自Novas文档BelongsTo,依赖设置的构造如下。

我们使用belongsTo资源的单数形式,小写,在这个例子中,Post变为post。然后我们使用点表示法定义我们想要依赖的资源属性。在这个例子中,我们只使用id属性,即post.id

BelongsTo::make('Post'),

NovaDependencyContainer::make([
    Boolean::make('Visible')
])
->dependsOn('post.id', 2)

当选择具有id 2的Post资源时,将出现一个Boolean字段。


BelongsToMany依赖

BelongsToMany设置与BelongsTo类似。

dependsOn方法应指向中间表名称。如果它被命名为role_user,设置如下

BelongsToMany::make('Roles')
	->fields(function() {
		return [
			NovaDependencyContainer::make([
			    // pivot field rules_all
			    Boolean::make('Rules All', 'rules_all')
			])
			->dependsOn('role_user', 1)
		]
	}),

如果枢轴字段名称出现多次,请考虑使用自定义中间表模型并在适当的模型关系方法中定义它。我发现唯一可靠的解决方案是使用用于多次使用字段的突变来获取/设置字段。虽然这可能看起来有些丑陋,但使用观察者时,应在中间模型实例上触发的事件将无法在Nova的每个新版本中可靠地工作。

如果Nova可靠地在中间表上触发Eloquent事件,我将更新此示例,使用事件而不是方法进行更优雅的方法。

以下是一个使用枢轴字段名为type的中间表进行get/set突变设置的(丑陋)示例。

// model User
class User ... { 
   
   public function roles() {
   		return $this->belongsToMany->using(RoleUser::class)->withPivot('rules_all');
   }
   
}

// model Role
class Role ... { 
   
   public function users() {
   		return $this->belongsToMany->using(RoleUser::class)->withPivot('rules_all');
   }
   
}

// intermediate table
use Illuminate\Database\Eloquent\Relations\Pivot;
class RoleUser extends Pivot {  

	protected $table 'role_user';

	public function getType1Attribute() {
	    return $this->type;
	}

	public function setType1Attribute($value) {
		$this->attributes['type'] = $value;
	}

	// ... repeat for as many types as needed
}

现在,让我们看看依赖容器。

->fields(function() {
	return [
		NovaDependencyContainer::make([
		    // pivot field rules_all
		    Select::make('Type', 'type_1')
		    	->options([ 
		    		/* some options */ 
	    		])
		    	->displayUsingLabels()
		])
		->dependsOn('role_user', 1)
		,
	
		NovaDependencyContainer::make([
		    // pivot field rules_all
		    Select::make('Type', 'type_2')
		    	->options([ 
		    		/* different options */ 
	    		])
		    	->displayUsingLabels()
		])
		->dependsOn('role_user', 2)
		,
		
		// .. and so on
	]
}),

MorphTo依赖

Novas文档中关于MorphTo的类似示例称为commentable。它使用3个模型:CommentVideoPost。在这里,Comment具有可变形字段commentable_idcommentable_type

对于 MorphTo 依赖,需要以下结构。

Commentable 转换为小写 commentable,依赖的值是资源的单数形式。在此示例中,只有当选择 Post 资源时,依赖容器才会添加两个额外字段,即 附加文本可见

MorphTo::make('Commentable')->types([
    Post::class,
    Video::class,
]),

NovaDependencyContainer::make([
    Text::make('Additional Text', 'additional'),
    Boolean::make('Visible', 'visible')
])
->dependsOn('commentable', 'Post') 

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件