fluidtypo3 / fluidbackend
FluidTYPO3的fluidbackend包
Requires
Requires (Dev)
- fluidtypo3/development: *
- fluidtypo3/flux: dev-development
This package is not auto-updated.
Last update: 2020-01-24 15:46:21 UTC
README
Fluidbackend: Flux后端模块
包状态
框架状态
Fluidbackend使用Flux表单作为后端模块,可以将数据保存到多种目标和目标类型。
这三段代码共同通过Fluidbackend创建了一个新的后端模块
// ext_tables.php \FluidTYPO3\Flux\Core::registerProviderExtensionKey('MyVendor.Myextension', 'Backend');
// Classes/Controller/BackendController namespace MyVendor\Myextension\Controller; use FluidTYPO3\Fluidbackend\Controller\AbstractBackendController; class BackendController extends AbstractBackendController { }
<!-- Resources/Private/Templates/Backend/Example.html --> {namespace flux=FluidTYPO3\Flux\ViewHelpers} <f:layout name="Backend" /> <f:section name="Configuration"> <flux:form id="mymodule"> <!-- The options that govern integration --> <flux:form.option name="Fluidbackend" value="{ moduleGroup: 'mygroupnameorexistinggroup', modulePosition: 'after:web', modulePageTree: 1}" /> <!-- The fields that the form will contain --> <flux:field.input name="inputfield" /> <!-- The pipe(s) which will process the data --> <flux:pipe.flashMessage title="Win!" message="You win!" /> </flux:form> </f:section> <f:section name="Main"> <!-- If you want some content before the form... --> <flux:form.render form="{form}" /> <!-- ...or after it, here's the place to put it --> </f:section>
概念
Fluidbackend接受类似于Fluidcontent和Fluidpages等其他Flux功能使用的Flux增强的Fluid模板,并将该模板内部的Flux表单定义转换为完整的后端模块。像Fluidcontent和Fluidpages一样,Fluidbackend也要求你在所谓的Provider扩展中发送你的模板。Fluidbackend需要一个控制器类 - 你的模块仍然需要注册到TYPO3作为合适的后端模块,但Fluidbackend使用Flux来读取如何将模板注册为后端模块的指令。
Fluidbackend要求一个控制器类 - 你的模块仍然需要在TYPO3中注册为适当的后端模块,但Fluidbackend使用Flux来读取注册模板为后端模块的指令。你可以在模板中定义这些选项,就像Fluidcontent和Fluidpages一样,集成者可以在以后替换这些模板,添加额外的字段,数据处理等。
Fluidbackend被有意创建为适用于80%的使用案例,以保持复杂性低。因此,它不是高级后端模块的替代品 - 它仅是快速基于表单创建模块的一种方式,该表单可以保存/处理数据。
它是如何工作的
Fluidbackend的开发流程如下
- 开发者注册与Flux关联的Provider扩展,控制器名称为
Backend
。 - 开发者创建模板中的表单,包含模块选项和
Pipes
以处理数据。 - Fluidbackend挂钩到TYPO3后端渲染,处理
Backend
Provider扩展。 - 检索每个模板的Flux表单实例。
- 使用此表单中定义的选项来提供模块图标、位置、组等。
- 将模块添加到可用的TYPO3后端模块列表中。
- 对于每个包含有效和启用表单定义的模板文件,重复步骤3-5。
用户流程如下
- 用户进入后端模块。
- 渲染与该模块对应的模板。
- 用户填写模板中定义的表单。
- 用户提交表单数据。
- 调用
BackendController
的saveAction
操作。 - Fluidbackend读取表单实例。
- 执行Flux表单中作为
Pipes
定义的所有输入和输出处理。 - 用户返回到表单。
除了通过所有Pipes
传递数据外,Fluidbackend还会存储一个数据库记录(目前存储在PID零)。可以在该记录中检索存储的数据。此数据记录使用Extbase域模型原则,并可以附加到其他扩展的其他域记录,如果您希望将存储的数据集绑定到模型实例之一或多个。
有两种方式可以手动访问存储的数据记录
<!-- in Fluid -->
{flux:form.data(table: 'tx_fluidbackend_domain_model_configuration',
field: 'configuration', uid: uidOfSavedRecord) -> v:var.set(name: 'myData')}
// In PHP // $this->configurationRepository is an injected \FluidTYPO3\Fluidbackend\Domain\Repository\ConfigurationRepository $uid = 123; // Uid of stored data record. /** @var $settingsRecord \FluidTYPO3\Fluidbackend\Domain\Model\Configuration */ $settingsRecord = $this->configurationRepository->findByUid($uid); $configuration = (array) $settingsRecord->getConfiguration();
什么是“管道”?
管道
是来自 Flux 的一个概念,它本质上定义了一些接受输入并产生输出的处理。一个 管道
可能会修改它接收到的数据,或者触发某些动作而不修改数据。在内部,一个 管道
是一个简单的类,它有一个方法接受数据作为输入,并期望返回数据,可以是修改后的也可以不是。Flux 提供了 ViewHelpers,允许开发人员将 管道
与 Flux 表单关联起来。每个 管道
可以通过使用 direction
参数配置为在控制器动作调用之前或之后执行。
当 管道
执行时,输入数据按照它们定义的顺序通过每个 管道
。如果一个 管道
转换数据,那么转换后的数据将从该点开始传递,并且所有后续的 管道
只接收转换后的数据。
因为 管道
定义在模板中,所以可以使用 f:if
条件来控制它们,并且可以单独控制每个 管道
的每个参数。可以添加新的 管道
并删除/禁用现有的 管道
。
Fluidbackend 在表单数据提交时使用这些。检索表单实例,并从其中检索并处理所有 管道
实例。在任何时候都可以更改 管道
- 例如,在数据发送到控制器后可以在控制器中完成。可以使用 $form->getOutlet()->getPipesIn()
或 $form->getOutlet()->getPipesOut()
来访问 管道
,其中 管道
按其 direction
参数分组。
Flux 包含了一些 管道
- TypeConverterPipe - 将输入转换为另一个输出类型。
- FlashMessagePipe - 分发具有选定标题/消息/严重性的 FlashMessage。
- EmailPipe - 使用选定的主题/发件人/收件人发送电子邮件。
- ControllerPipe - 使用提交的数据作为输入调用自定义控制器动作。
作为开发人员,您可以创建和实现自己的 管道
实现。为此
- 实现 Flux 的
PipeInterface
。 - 创建一个继承自 Flux 的
AbstractFormViewHelper
的 ViewHelper 类。 - 使该 ViewHelper 执行
$this->getForm()->getOutlet()->addPipeIn($pipe)
(或addPipeOut($pipe)
)。 - 或者,在您的 BackendController 中,执行
$this->provider->getForm($this->getRecord())->getOutlet()->addPipeIn($pipe)
。
如果要让您的 管道
通过模板进行控制,为其添加一个 ViewHelper。否则,您只需要这个类。