bzcoding / bz-contact-php
适用于静态网站和着陆页的简单联系表单管理器
Requires
- php: ~5.6 || ~7.0
- ext-mongodb: ^1.0
- adamwathan/form: ^0.9
- akrabat/rka-ip-address-middleware: ^0.4.0
- drewm/mailchimp-api: ^2
- guzzlehttp/guzzle: ^6
- michelf/php-markdown: ^1
- mongodb/mongodb: ^1.1
- monolog/monolog: ^1
- php-amqplib/php-amqplib: ^2
- rollbar/rollbar: ~1.1
- slim/csrf: ^0.7.0
- slim/php-view: ^2
- slim/slim: ^3
- swiftmailer/swiftmailer: ^5
- symfony/event-dispatcher: ^3
- vlucas/phpdotenv: ^2
- vlucas/valitron: ^1
Requires (Dev)
- codeclimate/php-test-reporter: ^0.4
- heroku/heroku-buildpack-php: ^121
- phpunit/phpunit: ~5.0 || ~6.0
- squizlabs/php_codesniffer: ^2
README
BZContact 是用 PHP 编写的简单联系表单管理器。它可以用来管理静态网站的联系表单,或者创建着陆页并收集行动号召请求。
此仓库旨在被分支和自定义,以创建您自己的联系表单或着陆页。
功能
- 一个单独的着陆页,具有表单处理和“感谢”或错误页面
- 由 JSON 文件定义的联系表单结构
- 可自定义的隐私和 ToS 页面
- 将条目存储在 MongoDB 中
- 向管理员发送通知电子邮件
- 向订阅者发送“感谢”电子邮件
- 与 MailChimp 集成
- 与 Webhooks 集成
- 简单的默认 UI 主题,易于自定义
安装
在 Heroku 上的部署
部署脚本将为后台任务分配一个 Web 进程和一个 Worker 进程。
该脚本还将为以下附加组件分配免费计划: MongoLab、Postmark、CloudAMQP、Logentries 和 Rollbar。如果您在这些服务上已有付费计划,或想使用其他服务,您可以删除它们并自定义您的配置。
如果您使用提供的免费版 Postmark,您需要 创建发送者签名,否则您将无法发送电子邮件通知。
在 Linux/macOS 机器上的安装
从您想要安装新应用程序的目录运行此命令
$ composer create-project bzcoding/bz-contact-php [your-app-name]
自定义表单和 UI 主题。
开发中运行
- 将
.env.example重命名为.env并输入您的自定义设置 - 通过运行
composer run server --timeout=0启动开发服务器
您可以使用提供的 Vagrant 虚拟机和 Ansible 设置,但请注意,它们仅适用于开发。
在预发布和生成环境中运行
- 将您的虚拟主机文档根目录指向应用程序的
app/public/目录 - 将
.env.example中的所需环境变量复制到您的虚拟主机文件中 - 如果您不将日志记录到
stdout,请确保您的日志文件路径可由 Web 可写。
配置
为了使 BZContact 有一个可工作的实例,您需要通过环境变量提供设置。以下设置是必需的
MAILER_*用于 SMTP 服务器DATABASE_*用于 MongoDB 服务器AMQP_*用于队列服务器
以下这些是可选的
NEWSLETTER_*启用 MailChimp 集成WEBHOOK_*启用 webhook 处理REDIRECT_THANKYOU使用自定义“感谢”页面ROLLBAR_ACCESS_TOKEN启用 Rollbar 错误跟踪
要求
- Apache 或 Nginx 网络服务器
- PHP 5.6 或更高版本,并支持 MongoDB(在 PHP 5.6 上使用
ext-mongo进行测试,您需要 PHP 7 上的ext-mongodb) - MongoDB 服务器
- RabbitMQ 或其他 AMQP 兼容服务器
- 用于开发的 SMTP 邮件服务器(或 MailCatcher)
JSON 表单对象
表单从简单的 JSON 对象加载,包含两个顶级属性:attributes(对象)和 fields(字段对象的数组)。每个字段对象至少必须有一个 name 或唯一的 id 属性,默认输入类型是 text。
支持的字段类型有:text 和 textarea,email,tel,select,checkbox,radio,submit。
请注意 BZContact 是设计用于与联系表单一起使用的,更复杂的表单结构可能导致不期望的结果。
{
"attributes": {
"id": "frm-contact",
"class": "contact-form",
"accept-charset": "utf-8",
"novalidate":"novalidate"
},
"fields": [
{
"id": "contact-name",
"name": "name",
"label": "Your name",
"placeholder": "eg. John Appleseed",
"required": true,
"error": "Your name is a required field"
},
...
{
"id": "contact-submit",
"name": "saveForm",
"type": "submit",
"value": "Send message",
"save": false
}
]
}
Webhook POST 格式
通过将 WEBHOOK_URL 环境变量设置为期望的目标 URL 启用 webhook 功能。
将表单订阅的内容以 POST 方式发送到 webhook URL,内容类型为 application/json,JSON 主体。
BZContact 发送两个自定义头
X-Bzcontact-Event:事件对象(例如message)X-Bzcontact-Delivery:提交的 ID
可以使用 WEBHOOK_HEADERS 环境变量添加可选的自定义头,每个头用 | 分隔:WEBHOOK_HEADERS="X-Foo:123|X-Bar:xyz"。
JSON 有效负载具有以下格式
{
"action": "saved",
"created_at": "YYYY-MM-DD HH:MM:SS",
"data": {
"name": "John Doe",
"company": "ACME Ltd",
"email": "john@acme.com",
"phone": "",
"subject": "It's only Rock'n Roll...",
"message": "but I like it!\r\n~M\r\n",
"referral": "friends",
"client-type": "business",
"privacy": "1",
"ip": "xxx.xxx.xxx.xxx",
"datetime": "YYYY-MM-DD HH:MM:SS",
"id": "<SubmissionID>"
}
}
action 属性包含事件类型(目前只有 saved)。data 对象包含所有表单字段,以及订阅者 IP 地址、日期时间和提交 ID。
鸣谢
BZContact 建立在 Slim-Skeleton 应用程序之上。它使用 Slim 3 框架和 PHP-View 模板渲染器。
默认 UI 主题建立在 Skeleton CSS 模板之上,封面照片由 Yair Hazout from Unsplash 提供。
favicon 和应用程序徽标(logo.svg)是使用来自 Freepik 的图标和 Flaticon 的图标制作的,由 CC 3.0 BY 许可。
许可
BZContact 在 MIT 许可下发布 - 请参阅 LICENSE 文件以获取详细信息。