firewire / formbuilder-htmx
为 ProcessWire FormBuilder 表单添加 AJAX 功能
Requires
- php: >=8.1.0
- wireframe-framework/processwire-composer-installer: ^1.1.1
This package is auto-updated.
Last update: 2024-09-05 19:33:11 UTC
README
A zero-configuration drop in module to power your ProcessWire FormBuilder forms with AJAX via HTMX.
功能
- 将使用 Pro FormBuilder 模块构建的任何表单转换为 AJAX
- 表单就地处理,提交后无需页面刷新
- 不与现有样式或 JavaScript 冲突
- 无需修改即与 FormBuilder 兼容,所有模块行为和功能保持不变
- 可以作为每个表单与 FormBuilder 本地输出方法一起使用
- 兼容 ProCache
- 兼容 FieldtypeFormSelect
需求
- ProcessWire >= 3.0
- FormBuilder >= 0.5.5 (未经其他版本测试,但应可工作)
- PHP >= 8.1
- HTMX 库 (此模块未提供)
确保 HTMX 已存在并已加载。 查看 HTMX 文档以获取详细信息。
未包含 HTMX 的原因有很多。最重要的是,此模块使用核心 HTMX 行为构建,预计不会随着新版本而改变,但如果有改变,将进行更新。它还保证了在项目中 HTMX 可能已经存在的情况下不会发生冲突。使用适合您的版本,并自信地将此模块添加到现有应用程序中。
如何使用
步骤 1. 禁用表单的 CSRF 保护。(下面解释原因)
步骤 2. 将对象从 $forms
切换到 $htmxForms
<!-- Replace $forms->render('your_form'); with this: --> $htmxForms->render('your_form_field');
步骤 3. (没有步骤 3)
好了。
提交按钮在提交时自动禁用,以防止用户点击过快导致的重复请求。
FormBuilderHtmx 使用 FormBuilder 的 "Option C: Preferred Method" 进行渲染。有关其他详细信息,请参阅表单设置页面上的 "嵌入" 选项卡。
$htmxForms->render()
是等效 FormBuilder 方法的直接替换。它可以挂钩(下面详细介绍)并接受其第二个 $vars
参数。通过直接替换,它允许您继续以期望的方式使用 FormBuilder API,包括脚本和 CSS 工具。
<!-- Keep your workflow, $htmxForms returns the same object as $forms The second prefill parameter mirrors FormBuilder, add prefill values as needed --> $htmxForm = $htmxForms->render('your_form_field', [ 'first_name' => "Biff", 'last_name' => "Tannen", 'email' => "biff@hillvalley.com", ]); echo $htmxForm->styles; echo $htmxForm->scripts; echo $htmxForm;
包含活动指示器
与标准表单不同,它会触发页面刷新,AJAX 推动的表单在用户采取行动后不会提供任何反馈。FormBuilderHtmx 允许您通过向用户显示您选择的一个元素来处理这种情况。查看这些动画以获取灵感和现成的代码。
以下是一个使用 'spinner' 的完整实现示例
<style> /* * Include some CSS. The `.activity-indicator` class name is up to you. `.htmx-request` is * required and must remain unchanged */ .activity-indicator { display: none; } /* Style as you please */ .htmx-request .activity-indicator, .htmx-request.activity-indicator { display: inline; } </style> <!-- The third argument is a CSS selector matching your 'spinner' --> <?= $htmxForms->render('your_form', [], '#your-form-indicator') ?> <div id="your-form-indicator" class="activity-indicator"> <span class="spinner"></span> </div>
更多好了。
向您的表单添加额外的 HTML 属性
您可以通过传递一个字符串数组作为第四个参数来向 FormBuilder 的 <form>
元素添加额外的 HTML 属性。这允许您添加自定义属性,或将额外的 HTMX 属性添加到进一步扩展您的 FormBuilder 表单功能。
以下是一个在提交表单之前向用户显示确认信息的表单示例
<?= $htmxForms->render('your_form', [], '#your-form-indicator', [ 'hx-confirm="Are you sure you want to submit this form?"' ]) ?>
以下属性将由 FormBuilderHtmx 自动添加
hx-post
hx-headers
hx-disabled-elt="button[type=submit]"
hx-target
hx-swap
hx-indicator
可选,只有当通过$htmxForms->render()
方法的第三个参数传入CSS选择器时才会添加
尝试添加或替换这些属性可能会导致问题或导致表单无法正确提交。
CSRF保护
对于使用HTMX/AJAX的表单,可能需要禁用CSRF保护 测试以确保提交表单时没有CSRF错误。如果遇到问题,请禁用CSRF。
它是如何工作的?
FormBuilderHtmx在页面加载前修改FormBuilder的标记,通过设置/添加到表单中的属性来启用HTMX处理提交。
当表单提交时,FormBuilder会像往常一样处理数据并返回完整的页面标记。FormBuilderHtmx解析它并提取HTMX期望在响应中包含的内容。
挂钩
FormBuilderHtmx提供了一个可挂钩的方法来处理FormBuilder处理后的页面输出标记。这与原生的可挂钩的FormBuilder::render()方法完全相同。
传递给此挂钩的标记是在上述方式下由FormBuilderHtmx处理后渲染到页面上的标记。
$wire->addHookAfter('FormBuilderHtmx::render', function(HookEvent $event) { $formHtmlMarkup = $event->return; // Modify markup as desired $event->return =<<<EOT <p>Look at these AJAX processed results:</p> {$formHtmlMarkup} EOT; });
巧妙技巧
此模块允许您在单个页面上多次使用同一字段。只有一个将被提交和处理。