rkw / rkw-registration
v9.5.1-stable
2023-02-24 13:08 UTC
Requires
- php: >=7.4
- ext-openssl: *
- madj2k/t3-accelerator: ~9.5.2
- madj2k/t3-ajax-api: ~9.5.0
- madj2k/t3-core-extended: ~9.5.4
- rkw/rkw-mailer: ~9.5.0
- sjbr/sr-freecap: ~2.5.0
- typo3/cms-core: ~9.5.0
- dev-master
- v9.5.1-stable
- v9.5.0-stable
- v8.7.41-beta
- v8.7.40-beta
- 8.7.39-beta
- v8.7.38-beta
- v8.7.37-beta
- v8.7.36-beta
- v8.7.35-beta
- v8.7.34-beta
- v8.7.33-beta
- v8.7.32-beta
- v8.7.31-beta
- v8.7.30-beta
- v8.7.29-beta
- v8.7.28-beta
- v8.7.27-beta
- v8.7.26-beta
- v8.7.25-beta
- v8.7.24-beta
- v8.7.23-beta
- v8.7.22-beta
- v8.7.21-beta
- v8.7.20-beta
- v8.7.19-beta
- v8.7.18-beta
- v8.7.17-beta
- v8.7.16-beta
- v8.7.15-beta
- v8.7.14-beta
- v8.7.13-beta
- v8.7.12-beta
- v8.7.11-beta
- v8.7.10-beta
- v8.7.9-beta
- v8.7.8-beta
- v8.7.7-beta
- v8.7.6-beta
- v8.7.5-beta
- v8.7.4-beta
- v8.7.3-beta
- v8.7.2-beta
- v8.7.1-beta
- v8.7.0-beta
- v7.6.14
- v7.6.13-stable
- v7.6.12-stable
- v7.6.11-stable
- dev-development
- dev-feature/upgrade9.5
- dev-8.7-master
- dev-master8.7
- dev-feature/refactoring2021-2
- dev-feature/refactoring2021
- dev-feature/rewrittenMultidomainLogin
- dev-feature/redesign2020
- dev-feature/newAuthService
- dev-feature/decoupleTitleFromFrontendUser
- dev-hotfix/fixCheckOnRegistrationTitle
- dev-feature/upgrade
- dev-feature/dataProtectionRework
This package is auto-updated.
Last update: 2023-03-01 06:00:08 UTC
README
同意加入
1. 在控制器中生成同意加入
对于需要同意加入的注册,请在控制器中使用以下示例代码。请确保始终通过ObjectManager加载FrontendUserRegistration。
/** @var \RKW\RkwRegistration\Domain\Model\FrontendUser $frontendUser */
$frontendUser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(FrontendUser::class);
$frontendUser->setEmail($email);
/** @var \RKW\RkwRegistration\Registration\FrontendUserRegistration $registration */
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(ObjectManager::class);
$registration = $objectManager->get(FrontendUserRegistration::class);
$registration->setFrontendUser($frontendUser)
->setData($alert)
->setCategory('rkwAlerts')
->setRequest($request)
->startRegistration();
如果您希望在成功同意加入后更新前端用户的资料,可以使用方法setFrontendUserUpdate。这将在前端用户接受同意加入时立即更新前端用户对象。这样,您可以确保前端用户对象的更改只有在授权的情况下才会发生。
2. 定义Opt-In邮件的MailService
现在您需要一个定义了Opt-In操作的MailService类。
/**
* Handles opt-in event
*
* @param \RKW\RkwRegistration\Domain\Model\FrontendUser $frontendUser
* @param \RKW\RkwRegistration\Domain\Model\OptIn $optIn
* @return void
* @throws \RKW\RkwMailer\Exception
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\UnknownObjectException
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\IllegalObjectTypeException
* @throws \TYPO3Fluid\Fluid\View\Exception\InvalidTemplateResourceException
* @throws \TYPO3\CMS\Extbase\Configuration\Exception\InvalidConfigurationTypeException
*/
public function optIn (
\RKW\RkwRegistration\Domain\Model\FrontendUser $frontendUser,
\RKW\RkwRegistration\Domain\Model\OptIn $optIn
): void {
// get settings
$settings = $this->getSettings(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
$settingsDefault = $this->getSettings();
if ($settings['view']['templateRootPaths']) {
/** @var \RKW\RkwMailer\Service\MailService $mailService */
$mailService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(MailService::class);
// send new user an email with token
$mailService->setTo($frontendUser, array(
'marker' => array(
'frontendUser' => $frontendUser,
'optIn' => $optIn,
'pageUid' => intval($GLOBALS['TSFE']->id),
'loginPid' => intval($settingsDefault['loginPid']),
),
));
$mailService->getQueueMail()->setSubject(
FrontendLocalizationUtility::translate(
'rkwMailService.optInAlertUser.subject',
'rkw_alerts',
null,
$frontendUser->getTxRkwregistrationLanguageKey()
)
);
$mailService->getQueueMail()->addTemplatePaths($settings['view']['templateRootPaths']);
$mailService->getQueueMail()->addPartialPaths($settings['view']['partialRootPaths']);
$mailService->getQueueMail()->setPlaintextTemplate('Email/OptInAlertUser');
$mailService->getQueueMail()->setHtmlTemplate('Email/OptInAlertUser');
$mailService->send();
}
}
3. 设置信号-槽
现在我们需要一个信号-槽,该槽指向用于发送邮件的定义方法(ext_localconf.php)。
/**
* @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher $signalSlotDispatcher
*/
$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class);
$signalSlotDispatcher->connect(
RKW\RkwRegistration\Registration\AbstractRegistration::class,
RKW\RkwRegistration\Registration\AbstractRegistration::SIGNAL_AFTER_CREATING_OPTIN . 'RkwAlerts',
RKW\RkwAlerts\Service\RkwMailService::class,
'optInAlertUser'
);
4. 设置Opt-In邮件的模板
同意加入的电子邮件可能看起来像这样
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:rkwMailer="http://typo3.org/ns/RKW/RkwMailer/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:layout name="Email/{mailType}" />
<!-- PLAINTEXT -->
<f:section name="Plaintext"><rkwMailer:email.plaintextLineBreaks>
<rkwMailer:email.translate key="templates_email_optInAlertUser.textOptInLinkLabel" languageKey="{frontendUser.txRkwregistrationLanguageKey}" extensionName="rkwAlerts"/>:\n
<rkwMailer:email.uri.action action="optIn" controller="Alert" extensionName="rkwAlerts" pluginName="rkwAlerts" absolute="true" pageUid="{pageUid}" additionalParams="{tx_rkwalerts_rkwalerts: {token: optIn.tokenYes, tokenUser: optIn.tokenUser}}" section="rkw-alerts" />\n\n
<rkwMailer:email.translate key="templates_email_optInAlertUser.textOptOutLinkLabel" languageKey="{frontendUser.txRkwregistrationLanguageKey}" extensionName="rkwAlerts"/>:\n
<rkwMailer:email.uri.action action="optIn" controller="Alert" extensionName="rkwAlerts" pluginName="rkwAlerts" absolute="true" pageUid="{pageUid}" additionalParams="{tx_rkwalerts_rkwalerts: {token: optIn.tokenNo, tokenUser: optIn.tokenUser}}" section="rkw-alerts" />
</rkwMailer:email.plaintextLineBreaks></f:section>
<!-- HTML -->
<f:section name="Html">
<a href="<rkwMailer:email.uri.action action='optIn' controller='Alert' extensionName='rkwAlerts' pluginName='rkwAlerts' absolute='true' pageUid='{pageUid}' additionalParams='{tx_rkwalerts_rkwalerts: {token: optIn.tokenYes, tokenUser: optIn.tokenUser}}' section='rkw-alerts' />"><rkwMailer:email.translate key="templates_email_optInAlertUser.textOptInLinkLabel" languageKey="{frontendUser.txRkwregistrationLanguageKey}" extensionName="rkwAlerts"/></a>
<a href="<rkwMailer:email.uri.action action='optIn' controller='Alert' extensionName='rkwAlerts' pluginName='rkwAlerts' absolute='true' pageUid='{pageUid}' additionalParams='{tx_rkwalerts_rkwalerts: {token: optIn.tokenNo, tokenUser: optIn.tokenUser}}' section='rkw-alerts' />"><rkwMailer:email.translate key="templates_email_optInAlertUser.textOptOutLinkLabel" languageKey="{frontendUser.txRkwregistrationLanguageKey}" extensionName="rkwAlerts"/></a>
</f:section>
</html>
5. 检查同意加入
要检查同意加入,您可以在控制器中使用以下示例代码
public function optInAction(string $tokenUser, string $token): void
{
/** @var \RKW\RkwRegistration\Registration\FrontendUserRegistration $registration */
$registration = $this->objectManager->get(FrontendUserRegistration::class);
$result = $registration->setFrontendUserToken($tokenUser)
->setCategory('rkwAlerts')
->setRequest($this->request)
->validateOptIn($token);
if ($result >= 200 && $result < 300) {
// sucessfull
} elseif ($result >= 300 && $result < 400) {
// canceled
} else {
// error / not found
}
}
6. Opt-In后扩展特定操作的信号-槽
我们需要第二个信号-槽,以便在Opt-In后执行所需的任何操作
$signalSlotDispatcher->connect(
RKW\RkwRegistration\Registration\AbstractRegistration::class,
\RKW\RkwRegistration\Registration\AbstractRegistration::SIGNAL_AFTER_REGISTRATION_COMPLETED . 'RkwAlerts',
'RKW\\RkwAlerts\\Alerts\\AlertManager',
'saveAlertByRegistration'
);
7. 特定操作的函数
然后我们需要定义相应的函数
/**
* Save alert by registration
* Used by SignalSlot
*
* @param \RKW\RkwRegistration\Domain\Model\FrontendUser $frontendUser
* @param \RKW\RkwRegistration\Domain\Model\OptIn $optIn
* @return void
* @api Used by SignalSlot
*/
public function saveAlertByRegistration(
\RKW\RkwRegistration\Domain\Model\FrontendUser $frontendUser,
\RKW\RkwRegistration\Domain\Model\OptIn $optIn
) {
if (
($alert = $optIn->getData())
&& ($alert instanceof \RKW\RkwAlerts\Domain\Model\Alert)
) {
try {
// create alert here
} catch (\RKW\RkwAlerts\Exception $exception) {
// do nothing here
}
}
}
其他用例
- 您还可以:** Opt-In成功后发送确认邮件(使用SIGNAL_AFTER_ALERT_CREATED-Signal-Slot)** 如果前端用户被删除,删除所有扩展特定数据(使用SIGNAL_AFTER_REGISTRATION_ENDED-Signal-Slot)** ... 做很多其他有趣的事情 ;-)
同意(隐私、条款、营销)
此扩展包含用于获取隐私、使用条款和高级营销同意的ViewHelper和验证器。为了获取同意,必须在自己的扩展中仅使用相应的ViewHelper。一旦执行了选择加入,相应的同意将自动记录并存储在数据库中。授予的同意将根据关联数据(IP地址、浏览器等)进行记录。此外,使用条款和营销的同意存储在FrontendUser中,因为这些同意通常是跨页面的并且独立于各自的同意上下文。
1. 在Fluid中
以下代码可以用于获取适当的同意。重要的是要在表单中使用ViewHelper,并且通过Fluid返回FormErrors。
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:rkwRegistration="http://typo3.org/ns/RKW/RkwRegistration/ViewHelpers"
xmlns:ajaxApi="http://typo3.org/ns/Madj2k/AjaxApi/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:form action="create" name="alert" object="{alert}">
[...]
<rkwRegistration:consent type="terms" />
<rkwRegistration:consent type="privacy" key="default" />
<rkwRegistration:consent type="marketing" />
[...]
</f:form>
</html>
2. 在控制器中
这里只包括相应的验证器。它们始终引用表单对象。
/**
* action create
*
* @param \RKW\RkwAlerts\Domain\Model\Alert $alert
* @param string $email
* @return void
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\StopActionException
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedRequestTypeException
* @TYPO3\CMS\Extbase\Annotation\Validate("\RKW\RkwRegistration\Validation\Consent\TermsValidator", param="alert")
* @TYPO3\CMS\Extbase\Annotation\Validate("\RKW\RkwRegistration\Validation\Consent\PrivacyValidator", param="alert")
* @TYPO3\CMS\Extbase\Annotation\Validate("\RKW\RkwRegistration\Validation\Consent\MarketingValidator", param="alert")
*/
public function createAction(
\RKW\RkwAlerts\Domain\Model\Alert $alert,
string $email = ''
): void {
[...]
通常不会对已登录的前端用户执行选择加入程序。如果您仍想记录注册的同意时间,可以使用以下代码实现
\RKW\RkwRegistration\DataProtection\ConsentHandler::add(
$request,
$frontendUser,
$alert,
'new alert'
);
升级到v9.5
更新数据库
RENAME TABLE `tx_rkwregistration_domain_model_privacy` TO `tx_rkwregistration_domain_model_consent`;
ALTER TABLE `tx_rkwregistration_domain_model_consent` CHANGE `registration_user_sha1` `frontend_user_token` VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT '';
ALTER TABLE `tx_rkwregistration_domain_model_consent` ADD `consent_privacy` INT DEFAULT 0 NOT NULL;
ALTER TABLE `tx_rkwregistration_domain_model_consent` ADD `consent_terms` INT DEFAULT 0 NOT NULL;
ALTER TABLE `tx_rkwregistration_domain_model_consent` ADD `consent_marketing` INT DEFAULT 0 NOT NULL;
UPDATE `tx_rkwregistration_domain_model_consent` SET `consent_privacy` = 1;