Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/composer.lock
/vendor/
/public/
/.php-cs-fixer.cache
54 changes: 54 additions & 0 deletions .php-cs-fixer.dist.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

$finder = PhpCsFixer\Finder::create()
// ->exclude('somedir')
// ->notPath('src/Symfony/Component/Translation/Tests/fixtures/resources.php')
->in(__DIR__);
$config = new PhpCsFixer\Config();
return $config->setRules([
'@PSR2' => true,
'array_syntax' => ['syntax' => 'short'],
'binary_operator_spaces' => [
'default' => 'single_space',
'operators' => [
'=>' => 'align_single_space_minimal',
],
],
'concat_space' => ['spacing' => 'one'],
'explicit_string_variable' => true,
'no_closing_tag' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => true,
'no_unused_imports' => true,
'no_whitespace_in_blank_line' => true,
'ordered_class_elements' => [
'order' => [
'use_trait',
'constant_public',
'constant_protected',
'constant_private',
'property_public',
'property_protected',
'property_private',
'property_public_static',
'property_protected_static',
'property_private_static',
'construct',
'destruct',
'magic',
'phpunit',
'method_public',
'method_protected',
'method_private',
'method_public_static',
'method_protected_static',
'method_private_static',
],
'sort_algorithm' => 'none',
],
'ordered_imports' => true,
'single_line_after_imports' => true,
'ternary_operator_spaces' => true,
'ternary_to_null_coalescing' => true,
])
->setFinder($finder);
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ It will add a checkbox to Userforms to send a verification email before the subm

## Requirements

* silverstripe/framework ^4.0
* silverstripe/admin ^1.0
* silverstripe/userforms ^5.0
* silverstripe/framework ^5
* silverstripe/admin ^2
* silverstripe/userforms ^6

This module was only tested on the newest 4.4.
This module was only tested on the newest 5.3.

## Installation

```
```sh
composer require zazama/doubleoptin
```

Expand Down Expand Up @@ -57,7 +57,7 @@ Zazama\DoubleOptIn\Services\EmailSender:
$emailVerification->send($subject);
$emailVerification->write();
}

public function tokenChecks() {
EmailVerification::IsSuccess($token); //bool
EmailVerification::IsAlreadyVerified($token); //bool
Expand Down
27 changes: 22 additions & 5 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "zazama/doubleoptin",
"description": "A Silverstripe 4 module to implement GDPR required E-Mail double-opt-in.",
"description": "A Silverstripe module to implement GDPR required E-Mail double-opt-in on user-defined forms",
"type": "silverstripe-vendormodule",
"keywords": [
"silverstripe",
Expand All @@ -11,9 +11,19 @@
],
"license": "BSD-3-Clause",
"require": {
"silverstripe/framework": "^4.0",
"silverstripe/admin": "^1.0",
"silverstripe/userforms": "^5.0"
"php": "^8.0.0",
"silverstripe/admin": "^2",
"silverstripe/framework": "^5",
"silverstripe/userforms": "^6"
},
"require-dev": {
"cambis/silverstan": "^1.0",
"cambis/silverstripe-rector": "^0.8.3",
"phpstan/extension-installer": "^1.4",
"phpstan/phpstan": "^1.12",
"phpstan/phpstan-deprecation-rules": "^1.2",
"rector/rector": "^1.2",
"silverstripe/standards": "^1.2"
},
"autoload": {
"psr-4": {
Expand All @@ -27,5 +37,12 @@
}
},
"minimum-stability": "dev",
"prefer-stable": true
"prefer-stable": true,
"config": {
"allow-plugins": {
"composer/installers": true,
"silverstripe/vendor-plugin": true,
"phpstan/extension-installer": true
}
}
}
16 changes: 16 additions & 0 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
parameters:
ignoreErrors:
-
message: "#^@method annotation '\\(SubmittedForm & static\\) getOwner\\(\\)' isn't expected and should be removed\\.$#"
count: 1
path: src/Extensions/SubmittedFormExtension.php

-
message: "#^@method annotation '\\(UserDefinedFormController & static\\) getOwner\\(\\)' isn't expected and should be removed\\.$#"
count: 1
path: src/Extensions/UserDefinedFormControllerExtension.php

-
message: "#^@method annotation '\\(UserDefinedForm & static\\) getOwner\\(\\)' isn't expected and should be removed\\.$#"
count: 1
path: src/Extensions/UserDefinedFormExtension.php
34 changes: 34 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
includes:
- phpstan-baseline.neon
parameters:
level: 5
treatPhpDocTypesAsCertain: false
editorUrl: 'vscode://file/%%file%%:%%line%%'
editorUrlTitle: '%%relFile%%:%%line%%'
ignoreErrors:
- "#Can't use keyword 'self'#"
silverstan:
disallowMethodCallOnUnsafeDataObject:
enabled: false
disallowNewInstanceOnInjectable:
enabled: true
disallowOverridingOfConfigurationPropertyType:
enabled: true
disallowPropertyFetchOnConfigForClass:
enabled: true
disallowPropertyFetchOnUnsafeDataObject:
enabled: false
disallowStaticPropertyFetchOnConfigurationProperty:
enabled: true
requireParentCallInOverridenMethod:
enabled: true
classes:
-
class: SilverStripe\ORM\DataObject
method: onBeforeWrite
-
class: SilverStripe\ORM\DataObject
method: onAfterWrite
paths:
- src
- tests/Src
20 changes: 20 additions & 0 deletions rector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);

use Cambis\SilverstripeRector\Set\ValueObject\SilverstripeLevelSetList;
use Cambis\SilverstripeRector\Set\ValueObject\SilverstripeSetList;
use Rector\Config\RectorConfig;
use Rector\Php80\Rector\Switch_\ChangeSwitchToMatchRector;

return RectorConfig::configure()
->withPaths([
__DIR__ . '/src',
__DIR__ . '/tests/Src',
])
->withPhpSets(php80: true)
->withImportNames(importShortClasses: false)
->withSets([
SilverstripeLevelSetList::UP_TO_SILVERSTRIPE_50,
SilverstripeSetList::CODE_QUALITY,
]);
25 changes: 15 additions & 10 deletions src/Controllers/VerificationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
use Zazama\DoubleOptIn\Models\EmailVerification;
use Zazama\DoubleOptIn\Models\UserFormEmailToSend;

class VerificationController extends PageController {
class VerificationController extends PageController
{

use Configurable;
/**
Expand All @@ -18,16 +19,17 @@ class VerificationController extends PageController {
private static $layout_prefix = 'Zazama\\DoubleOptIn\\Verification';
private static $template_holder = Page::class;

public function index(HTTPRequest $request) {
if($this->getRequest()->getVar('token')) {
public function index(HTTPRequest $request)
{
if ($this->getRequest()->getVar('token')) {
$token = EmailVerification::get()->filter('Token', $this->getRequest()->getVar('token'))->limit(1)[0];
if(!$token) {
if (!$token) {
$this->badToken();
return $this->renderWith([
$this->config()->get('layout_prefix') . '_BadToken',
Page::class
]);
} else if($token->Verified) {
} elseif ($token->Verified) {
$this->alreadyVerified();
return $this->renderWith([
$this->config()->get('layout_prefix') . '_AlreadyVerified',
Expand All @@ -51,10 +53,11 @@ public function index(HTTPRequest $request) {
}
}

public function success($token) {
public function success($token)
{
$emailsToSend = UserFormEmailToSend::get()->where(['SubmittedFormID' => $token->SubmittedFormID]);
if($token->SubmittedFormID && $emailsToSend) {
foreach($emailsToSend as $emailToSend) {
if ($token->SubmittedFormID && $emailsToSend) {
foreach ($emailsToSend as $emailToSend) {
$data = $emailToSend->getData();
$email = $data['email'];
$recipient = $data['recipient'];
Expand All @@ -78,11 +81,13 @@ public function success($token) {
$this->extend('updateSuccess', $token);
}

public function badToken() {
public function badToken()
{
$this->extend('updateBadToken');
}

public function alreadyVerified() {
public function alreadyVerified()
{
$this->extend('updateAlreadyVerified');
}
}
28 changes: 17 additions & 11 deletions src/Extensions/SubmittedFormExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,34 @@

namespace Zazama\DoubleOptIn\Extensions;

use SilverStripe\Control\Email\Email;
use SilverStripe\ORM\DataExtension;
use SilverStripe\Core\Extension;
use SilverStripe\UserForms\Model\Submission\SubmittedForm;
use Zazama\DoubleOptIn\Models\EmailVerification;

class SubmittedFormExtension extends DataExtension {
/**
* @property int $EmailVerificationID
* @method EmailVerification EmailVerification()
* @method (SubmittedForm & static) getOwner()
*/
class SubmittedFormExtension extends Extension
{
private static $has_one = [
'EmailVerification' => EmailVerification::class
];

public function canView($member = null) {
if($this->owner->Parent()) {
if($this->owner->Parent()->EnableDoubleOptIn) {
if($this->owner->EmailVerification()->Verified || !$this->owner->Parent()->DoubleOptInFieldID) {
return $this->owner->Parent()->canView($member);
public function canView($member = null)
{
if ($this->getOwner()->Parent()) {
if ($this->getOwner()->Parent()->EnableDoubleOptIn) {
if ($this->getOwner()->EmailVerification()->Verified || !$this->getOwner()->Parent()->DoubleOptInFieldID) {
return $this->getOwner()->Parent()->canView($member);
} else {
return false;
}
} else {
return $this->owner->Parent()->canView($member);
return $this->getOwner()->Parent()->canView($member);
}
} else {
return parent::canView($member);
}
return false;
}
}
22 changes: 14 additions & 8 deletions src/Extensions/UserDefinedFormControllerExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,23 @@
namespace Zazama\DoubleOptIn\Extensions;

use SilverStripe\Core\Extension;
use SilverStripe\UserForms\Control\UserDefinedFormController;
use SilverStripe\UserForms\Model\Submission\SubmittedFormField;
use Zazama\DoubleOptIn\Models\EmailDummy;
use Zazama\DoubleOptIn\Models\UserFormEmailToSend;
use Zazama\DoubleOptIn\Models\EmailVerification;
use SilverStripe\UserForms\Model\Submission\SubmittedFormField;
use Zazama\DoubleOptIn\Models\UserFormEmailToSend;

class UserDefinedFormControllerExtension extends Extension {
public function updateEmail(&$email, $recipient, $emailData) {
/**
* @method (UserDefinedFormController & static) getOwner()
*/
class UserDefinedFormControllerExtension extends Extension
{
public function updateEmail(&$email, $recipient, $emailData)
{
$referenceField = $emailData['Fields'][0];
$submittedForm = $referenceField->Parent();
$page = $submittedForm->Parent();
if($page->EnableDoubleOptIn && $page->DoubleOptInFieldID) {
if ($page->EnableDoubleOptIn && $page->DoubleOptInFieldID) {
$emailToSend = UserFormEmailToSend::create();
$emailToSend->setData($email, $recipient, $emailData);
$emailToSend->SubmittedFormID = $emailData['Fields'][0]->ParentID;
Expand All @@ -23,12 +29,12 @@ public function updateEmail(&$email, $recipient, $emailData) {
return;
}

if($page && $page->EnableDoubleOptIn && $page->DoubleOptInFieldID) {
if ($page && $page->EnableDoubleOptIn && $page->DoubleOptInFieldID) {
$emailField = SubmittedFormField::get()->filter([
'Name' => $page->DoubleOptInField()->Name,
'Name' => $page->DoubleOptInField()->Name,
'ParentID' => $submittedForm->ID
])->limit(1)[0];
if(!$emailField) {
if (!$emailField) {
return;
}
$emailVerification = EmailVerification::create();
Expand Down
22 changes: 16 additions & 6 deletions src/Extensions/UserDefinedFormExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,31 @@
use SilverStripe\Forms\DropdownField;
use SilverStripe\Forms\TextField;
use SilverStripe\UserForms\Model\EditableFormField\EditableEmailField;
use SilverStripe\UserForms\Model\UserDefinedForm;

class UserDefinedFormExtension extends Extension {
/**
* @property bool $EnableDoubleOptIn
* @property ?string $DoubleOptInSubject
* @property int $DoubleOptInFieldID
* @method EditableEmailField DoubleOptInField()
* @method (UserDefinedForm & static) getOwner()
*/
class UserDefinedFormExtension extends Extension
{
private static $db = [
'EnableDoubleOptIn' => 'Boolean(0)',
'EnableDoubleOptIn' => 'Boolean(0)',
'DoubleOptInSubject' => 'Varchar'
];

private static $has_one = [
'DoubleOptInField' => EditableEmailField::class
];

public function updateFormOptions($options) {
$options->add(CheckboxField::create('EnableDoubleOptIn', _t(__CLASS__.'.Enable', 'Enable Double-Opt-In')));
$options->add(DropdownField::create('DoubleOptInFieldID', _t(__CLASS__.'.Field', 'Double-Opt-In E-Mail field'), EditableEmailField::get()->where(['ParentID' => $this->owner->ID]))->setEmptyString(''));
$options->add(TextField::create('DoubleOptInSubject', _t(__CLASS__.'.Subject', 'Verification Subject')));
public function updateFormOptions($options)
{
$options->add(CheckboxField::create('EnableDoubleOptIn', _t(self::class . '.Enable', 'Enable Double-Opt-In')));
$options->add(DropdownField::create('DoubleOptInFieldID', _t(self::class . '.Field', 'Double-Opt-In E-Mail field'), EditableEmailField::get()->where(['ParentID' => $this->getOwner()->ID]))->setEmptyString(''));
$options->add(TextField::create('DoubleOptInSubject', _t(self::class . '.Subject', 'Verification Subject')));
return $options;
}
}
Loading