code16 / formoj
可定制的表单渲染器
Requires
- php: ^8.0|^8.1|^8.2|^8.3
- ext-zip: *
- laravel/framework: ^8.0|^9.0|^10.0|^11.0
- maatwebsite/excel: ^3.1
- nesbot/carbon: ^2.0
Requires (Dev)
- ext-json: *
- code16/sharp: ^8.0
- doctrine/dbal: ^3.0
- fakerphp/faker: ^1.19.0
- mockery/mockery: ^1.3.0
- orchestra/testbench: 6.*|7.*|8.*|9.*
- phpunit/phpunit: ^10.0
- dev-main
- v6.2.1
- v6.2.0
- v6.1.1
- v6.1.0
- v6.0.0
- v5.1.0
- v5.0.3
- v5.0.2
- v5.0.1
- v5.0.0
- v4.1.1
- v4.1.0
- v4.0.4
- v4.0.3
- v4.0.2
- v4.0.1
- v4.0.0
- v4.0.0-beta.2
- v4.0.0-beta.1
- 3.1.0
- v3.0.7
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v2.2.5
- v2.2.4
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- v2.1.0
- v2.0.0
- v1.5.1
- v1.5
- v1.4
- v1.3
- v1.2
- v1.1
- v1.0
- dev-lang-pt
- dev-rating-field
- dev-sharp7
- dev-handle-markdown
- dev-update-form
- dev-stack-sections
- dev-answer-component
- dev-submit-function
- dev-show-pages
- dev-upgrade-to-sharp-6
- dev-feature/conditional-display
- dev-feature/laravel-8
- dev-feature/update-laravel-6
- dev-feature/radios
- dev-feature/add-field-identifier
- dev-feature/hide-form-title
- dev-feature/mention-form-title-in-admin-notifications
- dev-feature/hide-section-title
- dev-feature/upload-field
- dev-feature/carbon2
- dev-alt/store-json-attributes
This package is auto-updated.
Last update: 2024-09-09 14:30:44 UTC
README
Formoj for Laravel 是一个表单生成包。
你可以将其想象成一个小型的 Google 表单,但对其有完全的控制。Formoj 负责表单的存储和显示,允许管理员管理表单(通知、以 XLS 格式导出答案),当然,还会存储答案。
该项目分为 3 个模块
- 基于 Vue 的前端包,这是一个独立的 NPM 包(下面将说明安装说明)
- 后端代码:模型和迁移、控制器、作业、通知等...
- 最后是可选的基于 Sharp 的管理工具,用于管理表单、部分、字段和导出答案。
安装
Vue 插件
npm install formoj
基本配置
import Vue from 'vue'; import Formoj from 'formoj'; Vue.use(Formoj);
高级配置
Vue.use(Formoj, { apiBaseUrl: '/custom/api', scrollOffset: 160, locale: 'en', i18n: { en: { 'section.button.next': 'Next section', } } });
Laravel 模块
Formoj 需要 Laravel 7+、Carbon 2.0+ 和 maatwebsite/excel 3.1+。
使用 composer 安装包
composer require code16/formoj
然后运行以下命令以在数据库中创建所需的表
php artisan migrate
您可以选择发布配置文件
php artisan vendor:publish --provider="Code16\Formoj\FormojServiceProvider" --tag="config"
以及语言文件,如果您需要更新或添加翻译(在这种情况下考虑提出 PR)
php artisan vendor:publish --provider="Code16\Formoj\FormojServiceProvider" --tag="lang"
更新 Formoj
警告:当使用 composer update code16/formoj
更新 Formoj 时,请务必也执行 npm install formoj
以保持前后端代码的一致性。
创建表单
使用 Sharp
如果您的项目已经使用 Sharp 6 for Laravel,那就太好了。如果没有,并且您希望与 Formoj 一起使用它,首先 安装包。
然后我们需要在 config/sharp.php
中配置 Formoj
return [ // config/sharp.php [...], "entities" => [ "formoj_form" => [ "label" => "Form", "list" => \Code16\Formoj\Sharp\FormojFormSharpEntityList::class, "show" => \Code16\Formoj\Sharp\FormojFormSharpShow::class, "form" => \Code16\Formoj\Sharp\FormojFormSharpForm::class, "validator" => \Code16\Formoj\Sharp\FormojFormSharpValidator::class, ], "formoj_section" => [ "label" => "Section", "list" => \Code16\Formoj\Sharp\FormojSectionSharpEntityList::class, "form" => \Code16\Formoj\Sharp\FormojSectionSharpForm::class, "show" => \Code16\Formoj\Sharp\FormojSectionSharpShow::class, "validator" => \Code16\Formoj\Sharp\FormojSectionSharpValidator::class, ], "formoj_field" => [ "label" => "Field", "list" => \Code16\Formoj\Sharp\FormojFieldSharpEntityList::class, "form" => \Code16\Formoj\Sharp\FormojFieldSharpForm::class, "validator" => \Code16\Formoj\Sharp\FormojFieldSharpValidator::class, ], "formoj_answer" => [ "label" => "Answer", "list" => \Code16\Formoj\Sharp\FormojAnswerSharpEntityList::class, "show" => \Code16\Formoj\Sharp\FormojAnswerSharpShow::class, "policy" => \Code16\Formoj\Sharp\Policies\FormojAnswerSharpPolicy::class, ], "formoj_reply" => [ "list" => \Code16\Formoj\Sharp\FormojReplySharpEntityList::class, "policy" => \Code16\Formoj\Sharp\Policies\FormojReplySharpPolicy::class, ], ], "menu" => [ [ "label" => "Formoj", "entities" => [ [ "entity" => "formoj_form", "label" => "Forms", "icon" => "fa-list-alt" ] ] ] ], [...] ];
当然,您可以根据需要对其进行调整:使用我们自己的子类、调整菜单...
这将在 Sharp 中添加完整的 Formoj 管理
不使用 Sharp
Formoj 目前不提供其他管理工具,所以在这种情况下,您完全自由地按自己的意愿行事。
有一些方法可以帮助您处理部分和字段的创建,例如
$section = $form->createSection("My section"); $text = $section->newTextField("text") ->setRequired() ->setHelpText("help") ->setMaxLength(50) ->create(); $select = $section->newSelectField("select", ["option A", "option B"]) ->setRequired() ->setHelpText("help") ->setMultiple()->setMaxOptions(2) ->create();
管理表单
再次,使用 Sharp 您将找到所有适当的工具。本节描述
表单可用性
表单可以可选地定义 published_at
和/或 unpublished_at
日期:在此日期之外,表单将显示一个适应的消息。
表单通知
表单管理员可以选择(对于每个表单)在 formoj_form.administrator_email
通过邮件通知,有两种方式
formoj_form.notifications_strategy
= "every": 每次回答后formoj_form.notifications_strategy
= "grouped": 每天发送一个给定日期的回答摘要。
要配置“分组”策略,您必须安排 Code16\Formoj\Console\SendFormojNotificationsForYesterday
命令,该命令将发送昨天的所有答案。
表单部分
一个表单由部分组成,其中包含字段。如果表单包含多个部分,它将一次显示一个部分,并带有“下一步”按钮。
字段类型
Formoj 可以显示这些类型的字段
text
,这是一个单行文本,具有可选的max_length
约束textarea
,带有rows_count
和可选的max_length
select
,可以是multiple
(清单,可选的max_options
属性)或不是(单选)。upload
,以MB为单位表示的max_size
,以及可选的允许扩展列表accept
(上传和存储目录及磁盘在config/formoj.php
中可配置)。- 最后是
heading
,它不是一个字段,而是一个文本分隔符。
嵌入表单
然后可以使用此DOM将给定表单嵌入任何地方。
<formoj form-id="1"></formoj>
处理答案
除了通知系统外,表单管理员还可以通过Code16\Formoj\Job\ExportAnswersToXls
作业在任何时间以xlsx格式导出答案,该作业可以这样调用
ExportAnswersToXls::dispatch($form, $fileName, $answers);
在哪里
$form
是Code16\Formoj\Models\Form
实例$fileName
是导出文件名(导出目录和磁盘在config/formoj.php
中可配置)- 而
$answers
是Code16\Formoj\Models\Answers
的集合;此参数可以为空,默认情况下导出$form
的所有答案。
如果Sharp已配置,它将提供一个专用的命令来处理此导出(以及一个用于显示答案的命令)。
表单样式
Formoj使用SASS/SCSS语言进行样式。您可以使用SASS导入导入样式
@import 'formoj/scss/themes/default';
默认主题非常基本,旨在通过您自己的代码进行自定义。一些变量可用,可以覆盖,请参阅formoj/scss/_variables.scss
Bootstrap集成
@import 'formoj/scss/themes/bootstrap'; $formoj-form-appearance: 'card'; $formoj-loading-appearance: 'spinner';
bootstrap主题将所有bootstrap表单类绑定到formoj元素。默认情况下,表单具有card
外观,您可能想重置这种行为。
$formoj-form-appearance: 'none';
此外,选择和复选框还可以有bootstrap的custom-control
样式
$formoj-select-appearance: 'custom';
贡献
设置prototipoj
cd ./prototipoj
composer install
构建前端
cd ./prototipoj npm install # Watch and auto re-build formoj package files npm run watch # Build all dist files npm run prod