nstcactus / craft-contact-form-settings-module
一个Craft模块,用于管理使用contact-form & contact-form-extensions插件的多份联系表单
Requires
- nstcactus/craft-utils: ^3.1.0 || ^4.0.0
README
此模块有助于管理Craft contact-form
& contact-form-extensions
插件的多组设置。
需求
此模块需要
- PHP 7.1或更高版本
- Craft CMS 3, 4或5
- contact-form插件2.2或更高版本
- [可选] contact-form-extensions插件1.2.1或更高版本
安装
-
安装composer模块:
composer require nstcactus/craft-contact-form-settings-module
-
将
app.php
文件的内容添加到您的config/app.php
(如果不存在,则直接复制)。这确保了您的模块在每次请求时都会被加载。文件可能看起来像这样
return [ 'modules' => [ 'contact-form-settings-module' => [ 'class' => \nstcactus\craftcms\modules\contactFormSettings\ContactFormSettingsModule::class, 'components' => [ // More on this below ], ], ], 'bootstrap' => ['contact-form-settings-module'], ];
添加表单
-
创建一个扩展
\modules\contactFormSettings\forms\AbstractContactForm
的表单类。此类将描述您的表单设置。 -
在
config/app.php
文件中注册此表单类:在模块的components
数组中添加一个条目,键为表单名称,值为表单类的引用。示例
return [ 'modules' => [ 'contact-form-settings-module' => [ 'class' => \nstcactus\craftcms\modules\contactFormSettings\ContactFormSettingsModule::class, 'components' => [ 'contact' => \project\modules\app\forms\ContactForm::class, ], ], ], 'bootstrap' => ['contact-form-settings-module'], ];
-
在表单模板中添加以下内容,在
<form>
元素内部:{{ formNameInput('contact') }}
表单设置
插件设置覆盖
每个表单设置类必须实现getContactFormConfiguration()
& getContactFormExtensionsConfiguration()
方法。它们期望返回一个设置数组,就像在config/contact-form.php
& contact-form-extensions.php
中设置的那样。
自定义验证
自定义验证规则应通过覆盖afterValidateSubmission()
方法定义。在这里,您可以在Submission
实例(在$e->sender
中可用)上添加验证错误,如下所示
public function afterValidateSubmission(Event $e): void { /** @var Submission $submission */ $submission = $e->sender; if (empty($submission->message['FirstName'])) { $submission->addError('message.FirstName', Craft::t('site', 'This field cannot be blank.')); } }
常见问题解答
我如何安全地让用户从主题列表中选择?
例如,当用户在<select>
元素中选择了主题时,建议的方法是
我如何动态设置收件人?
要动态设置收件人,您可以选择以下方法之一
-
在
getContactFormSetting()
方法返回的数组中的toEmail
属性中设置它 -
使用
contact-form-extensions
覆盖机制在beforeValidateSubmission()
或afterValidateSubmission()
方法中设置它。示例public function beforeValidateSubmission(ModelEvent $e): void { parent::beforeValidateSubmission($e); $submission = $e->sender->message['toEmail'] = Craft::$app->getSecurity()->hashData($subject->contactSubjectRecipient); }
我如何使用单独的字段来分别输入姓和名?
当使用单独的姓和名字段而不是单个fromName
字段时,请确保在afterValidateSubmission()
方法中实际设置Submission
实例的fromName
属性。
这将提高控制面板中的提交索引。
示例
public function afterValidateSubmission(Event $e): void { /** @var Submission $submission */ $submission = $e->sender; if (!empty($submission->message['FirstName']) || empty($submission->message['LastName'])) { $submission->fromName = trim(sprintf( '%s %s', $submission->message['FirstName'] ?? '', $submission->message['LastName'] ?? '' )); } }