<?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; } }