<?php
namespace PHPFUI;
class MathCaptcha extends \PHPFUI\MultiColumn implements \PHPFUI\Interfaces\Captcha
{
private string $fieldName = 'mathAnswer';
private array $operators = ['plus' => '+', 'minus' => '-', 'times' => '*'];
public function __construct(\PHPFUI\Interfaces\Page $page, int $limit = 10, string $fieldName = '')
{
parent::__construct();
$this->addClass('clearfix');
if ($fieldName)
{
$this->fieldName = $fieldName;
}
$container = new \PHPFUI\Container();
$answers = [];
$answer = -999;
for ($i = 0; $i < 10; ++$i)
{
$operator = \random_int(0, 2);
$type = \random_int(0, 1);
$first = \random_int(1, $limit);
$second = \random_int(1, $limit);
if ($first < $second)
{
$temp = $first;
$first = $second;
$second = $temp;
}
\reset($this->operators);
for ($j = 0; $j < $operator; ++$j)
{
\next($this->operators);
}
switch (\current($this->operators))
{
case '+':
$answer = $first + $second;
break;
case '-':
$answer = $first - $second;
break;
case '*':
$answer = $first * $second;
break;
}
$op = $type ? \current($this->operators) : \key($this->operators);
$bold = ['strong', 'b', ];
$message = new \PHPFUI\HTML5Element($bold[\random_int(0, \count($bold) - 1)]);
if (\class_exists(\NumberToWords\NumberToWords::class))
{
$numberToWords = new \NumberToWords\NumberToWords();
$numberTransformer = $numberToWords->getNumberTransformer('en');
if (\random_int(0, 1))
{
$first = $numberTransformer->toWords($first);
}
if (\random_int(0, 1))
{
$second = $numberTransformer->toWords($second);
}
}
$message->add("Please Solve: {$first} {$op} {$second} = ");
$message->addClass('float-right hide');
$answers[$message->getId()] = $answer;
$container->add((string)$message);
}
$this->add($container);
$oneToShow = \random_int(0, 9);
for ($i = 0; $i < $oneToShow; ++$i)
{
\next($answers);
}
$page->addJavaScript('$("#' . \key($answers) . '").toggleClass("hide")');
\PHPFUI\Session::setFlash($this->fieldName, \current($answers));
$answerInput = new \PHPFUI\Input\Number($this->fieldName);
$this->add($answerInput);
$this->add(' ');
}
public function isValid() : bool
{
if (\PHPFUI\Session::checkCSRF() && isset($_POST[$this->fieldName]))
{
return \strlen($_POST[$this->fieldName]) && $_POST[$this->fieldName] == \PHPFUI\Session::getFlash($this->fieldName);
}
return false;
}
}