<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2019 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
require_once JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/fields/hidden.php';
class RSFormProFieldTicket extends RSFormProFieldHidden
{
// backend preview
public function getPreviewInput()
{
return RSFormProHelper::getIcon('support') . $this->generateString();
}
// @desc Overridden here because this field generates a value based on its settings
public function getValue()
{
return $this->generateString();
}
protected function generateString()
{
$type = $this->getProperty('TICKETTYPE','RANDOM');
$key = '';
if ($type == 'RANDOM')
{
$length = (int) $this->getProperty('LENGTH', 8);
$characters = $this->getProperty('CHARACTERS', 'ALPHANUMERIC');
switch ($characters)
{
case 'ALPHANUMERIC':
default:
$possible = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
case 'ALPHA':
$possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
break;
case 'NUMERIC':
$possible = '0123456789';
break;
}
if ($length < 1 || $length > 255) {
$length = 8;
}
$key = '';
$i = 0;
while ($i < $length) {
$key .= substr($possible, mt_rand(0, strlen($possible) - 1), 1);
$i++;
}
} else if ($type == 'SEQUENTIAL') {
$leadingLength = (int) $this->getProperty('LEADINGZEROLENGTH', '0');
$db = Factory::getDbo();
$query = $db->getQuery(true);
// Catch only numeric values, this scenario happens when the ticket type was previously 'Random Type'
$query
->select("MAX(CAST(".$db->qn('FieldValue')." AS SIGNED))")
->from('#__rsform_submission_values')
->where($db->qn('FormId') . ' = ' . $db->q($this->formId))
->where($db->qn('FieldName') . ' = ' . $db->q($this->name))
->where($db->qn('FieldValue') . " REGEXP '^[0-9]+$'");
$db->setQuery($query);
$key = (int) $db->loadResult();
$key++;
if ($leadingLength)
{
$key = str_pad($key, ($leadingLength+1), '0', STR_PAD_LEFT);
}
}
return $key;
}
protected function stringExists($string) {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select('COUNT(*)')
->from('#__rsform_submission_values')
->where($db->qn('FormId') . ' = ' . $db->q($this->formId))
->where($db->qn('FieldName') . ' = ' . $db->q($this->name))
->where($db->qn('FieldValue') . ' = ' . $db->q($string));
$db->setQuery($query);
return $db->loadResult();
}
// process the field value after validation
public function processBeforeStore($submissionId, &$post, &$files) {
if (!isset($post[$this->name]))
{
return;
}
$value = $post[$this->name];
while ($this->stringExists($value)) {
$value = $this->generateString();
}
$post[$this->name] = $value;
}
}