Contao 3: Newsletter-Abo mit Sicherheitsabfrage (Captcha)

(Kommentare: 2)

Das Newsletter-Abonnement kann z.B. von Spam bots missbraucht werden und so können sich viele unbrauchbare Einträge in der Abonnenten-Liste in der Datenbank sammeln. Wenn die Email-Einträge echt sind, bekommen dann ggf. viele Menschen eine Email mit der Behauptung, Sie hätten den Newsletter abonniert.
Offenbar erst in Contao 4 wird die Newsletter-Bestellung (subcribe und unsubscribe) mit einer Captcha-Sicherheitsabfrage (optional) geschützt.

Newseltter bestellen mit Sicherheitsabfrage (Captcha) in einem bestehenden Contao-3-Projekt:

Annahme: Es gibt bereits ein eigenes "Projekt-Modul" TL_ROOT/system/modules/x_project/. Wenn nicht, siehe unten.
Neue bzw. zu ändernde Dateien:

TL_ROOT/system/modules/x_project/config/config.php

// ...
$GLOBALS['FE_MOD']['newsletter']['subscribe'] = 'ModuleSubscribeSecure';
$GLOBALS['FE_MOD']['newsletter']['unsubscribe'] = 'ModuleUnsubscribeSecure';
// ...



TL_ROOT/system/modules/x_project/modules/ModuleSubscribeSecure.php

<?php
/** Extension of ModuleSubscribe to add security question (captcha) to newsletter subscribe form, Contao 3.
  *
  * @author Ingmar Decker
  */
class ModuleSubscribeSecure extends \ModuleSubscribe
{
	protected $objCaptcha;
	
	protected function compile()
	{
		$this->objCaptcha = new FormCaptcha(array('id'=> 'captcha_'.$this->id, 'label' => $GLOBALS['TL_LANG']['MSC']['securityQuestion'], 'placeholder' => $GLOBALS['TL_LANG']['MSC']['securityQuestion']));
		
		parent::compile();
		
		$this->Template->captcha = $this->objCaptcha->parse();

	}
	
	protected function addRecipient()
	{
		$this->objCaptcha->validate();
		
		if ($this->objCaptcha->hasErrors())
		{
			$_SESSION['SUBSCRIBE_ERROR'] = $this->objCaptcha->getErrorsAsString();
			$this->reload();
		}
		
		parent::addRecipient();
	}
	
}



TL_ROOT/system/modules/x_project/modules/ModuleUnubscribeSecure.php

<?php
/** Extension of ModuleUnsubscribe to add security question (captcha) to newsletter subscribe form, Contao 3.
  *
  * @author Ingmar Decker
  */
class ModuleUnsubscribeSecure extends \ModuleUnsubscribe
{
	protected $objCaptcha;
	
	protected function compile()
	{
		$this->objCaptcha = new FormCaptcha(array('id'=> 'captcha_'.$this->id, 'label' => $GLOBALS['TL_LANG']['MSC']['securityQuestion'], 'placeholder' => $GLOBALS['TL_LANG']['MSC']['securityQuestion']));
		
		parent::compile();
		
		$this->Template->captcha = $this->objCaptcha->parse();;
	}
	
	protected function removeRecipient()
	{
		$this->objCaptcha->validate();
		
		if ($this->objCaptcha->hasErrors())
		{
			$_SESSION['UNSUBSCRIBE_ERROR'] = $this->objCaptcha->getErrorsAsString();
			$this->reload();
		}
		
		parent::removeRecipient();
	}
	
}



TL_ROOT/templates/nl_default.html5 (Kopie des Originals aus TL_ROOT/system/modules/newsletter/templates/newsletter/)

	// code after email input field
	<?php if ($this->captcha): ?>
		<?php echo $this->captcha ?>
	<?php endif ?>



Falls das Contao-Modul komplett neu aufgesetzt werden muss: Verzeichnisse erstellen:
TL_ROOT/system/modules/x_project/
TL_ROOT/system/modules/x_project/config/
TL_ROOT/system/modules/x_project/modules/

Dateien:

TL_ROOT/system/modules/x_project/config/autoload.ini

register_namespaces = true
register_classes    = true
register_templates  = true



TL_ROOT/system/modules/x_project/config/autoload.php

<?php
$namespace = '';
$module = basename(dirname(dirname(__FILE__)));

/** Register the classes */
foreach (array('classes', 'elements', 'models', 'modules', 'widgets', 'forms') as $d) {
	$dir = TL_ROOT . "/system/modules/$module/$d";
	if (file_exists($dir) && is_dir($dir)) {
		foreach (scandir($dir) as $f) {
			if (!preg_match('/.php$/', $f)) continue;
			$pathinfo = pathinfo($f);
			if ($namespace) {
				ClassLoader::addClasses(array
				(
					$namespace . '\\' . $pathinfo['filename'] => "system/modules/$module/$d/$f"
				));
			} else {
				ClassLoader::addClasses(array
				(
					$pathinfo['filename'] => "system/modules/$module/$d/$f"
				));
			}
		}
	}
}

/** Register the templates */
$dir = TL_ROOT . "/system/modules/$module/templates";
if (file_exists($dir) && is_dir($dir)) {
	foreach (scandir($dir) as $f) {
		if (!preg_match('/.html5$/', $f) && !preg_match('/.tpl$/', $f)) continue;
		$pathinfo = pathinfo($f);
		TemplateLoader::addFiles(array
		(
			$pathinfo['filename'] => "system/modules/$module/templates"
		));
	}
}

 

Zurück

Kommentare

Kommentar von Gerd |

Hatte leider tatsächlich das Problem von tausenden Fake-Newsletteranmeldungen und habe jetzt dieses Modul ausprobiert (Contao 3.0.1).

Newsletter-Anmeldung (Formular) funktioniert einwandfrei mit Captcha, die Abmeldung jedoch leider überhaupt nicht...

Wäre dankbar für jeden Tipp!

Kommentar von Gerd |

Sorry - war ein Fehler meinerseits!

Deshalb:
Vielen Dank für diese Lösung!

Einen Kommentar schreiben