unclecheese/silverstripe-graphql-forms

SilverStripe 表单在 graphql 中的原型。

安装次数: 230

依赖: 2

建议者: 0

安全性: 0

星星: 0

关注者: 3

分支: 1

开放问题: 2

类型:silverstripe-vendormodule

dev-master 2020-12-10 00:58 UTC

This package is auto-updated.

Last update: 2024-09-10 09:24:31 UTC


README

在 graphql 中实现 FormSchema 的简单方法。

安装

$ composer require unclecheese/silverstripe-graphql-forms:dev-master

使用

在您的模式配置中注册您的表单

*app/_graphql/config.yml

registeredForms:
  - 'MyProject\Pages\ContactPageController.ContactForm'

在此示例中,键 ContactForm 是您将在 graphql 中的 Form 查询中传递的表单名称(它是一个枚举)。

值可以采用多种不同的实现。在此处,'MyProject\Pages\ContactPageController.ContactForm' 指的是

ContactPageController.php

namespace MyProject\Pages;

class ContactPageController extends Controller
{
    public function ContactForm()
    {
        // return Form instance
    }
}

您还可以使用完全限定的 Form 子类

ContactForm: 'MyProject\Forms\ContactForm'

您还可以将其映射到已注册到查询创建器的 FormFactoryInterface 的方法上(见下文)。

ContactForm: 'myMethod'

与 Userforms 的使用

如果您使用 silverstripe/userforms 在 CMS 中生成表单,此模块包含一个专门的表单工厂,允许您注册这些表单。因为它们都共享相同的控制器类,所以您也可以通过链接或 ID 来引用这些表单。

MyCMSForm: 'who-we-are/contact-us'

或者,您可以使用 ID

MyCMSForm: 45

表单工厂

默认情况下,由于在 FormQueryCreator 中注册了 DefaultFormFactory,表单是按照上述命名约定生成的。它的 getFormByName 函数将映射解析为实际的 Form 对象。

如果您有自定义生成表单的方式,只需注册一个新的工厂。

class MyFormFactory implements FormFactoryInterface
{
  public function getFormByName(string $name): ?Form
  {
    // Get a Form based on $name
  }
}

此外,要直接将方法映射到表单,您可以子类化 DefaultFormFactory

class MyDefaultFormFactory extends DefaultFormFactory
{
  public function MyForm()
  {
    // return instance of MyForm. The parent getFormByName() function checks if
    // this method is defined before advancing through any other logic.
  }
}

别忘了注册您的表单工厂!

SilverStripe\Core\Injector\Injector:
  UncleCheese\GraphQLForms\FormFactoryRegistry:
    properties:
      factories:
        myFactory: '%$MyProject\MyFormFactory'

查询

query {
  form(name: MyForm) {
    schema {
      fields {
        id
        name
        type
        title
        # Recursive, for composite fields
        children {
          name
          type
          title
        }
      }
      actions {
        name
        title
      }
    }
  }
}

注意事项

  • 生成表单的方法必须是确定性的!不能根据状态隐藏和显示字段(至少目前不能)。
  • 如果您使用显式的 Form 子类实例,它需要通过 singleton() 实例化。确保任何必需的构造函数参数都自动注入。
  • 不做任何复杂的操作,比如组合字段
  • TODO:突变,表单提交
  • 文件上传?停止。