<?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;
use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\User\UserHelper;
class RSFormProRestoreSubmissions
{
// Database instance
protected $db;
// Holds an array of the XML data.
protected $formId;
protected $xml;
public function __construct($options = array()) {
$path = &$options['path'];
$this->formId = isset($options['formId']) ? (int) $options['formId'] : 0;
$this->db = Factory::getDbo();
// Check if the form's xml exists
if (!file_exists($path)) {
throw new Exception(sprintf('The file %s does not exist!', $path));
}
if (!is_readable($path)) {
throw new Exception(sprintf('File %s is not readable!', $path));
}
// Attempt to load the XML data
libxml_use_internal_errors(true);
if (class_exists('DOMDocument')) {
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->strictErrorChecking = false;
$dom->validateOnParse = false;
$dom->recover = true;
$dom->loadXML(file_get_contents($path));
$this->xml = simplexml_import_dom($dom);
} else {
$this->xml = simplexml_load_file($path);
}
if ($this->xml === false) {
$errors = array();
foreach (libxml_get_errors() as $error) {
$errors[] = 'Message: '.$error->message.'; Line: '.$error->line.'; Column: '.$error->column;
}
throw new Exception(sprintf('Error while parsing XML: %s<br/>', implode('<br />', $errors)));
}
}
public function restore()
{
foreach ($this->xml->children() as $submission)
{
$data = array(
'FormId' => $this->formId,
'confirmed' => 1,
'ConfirmedIp' => '',
'ConfirmedDate' => null
);
foreach ($submission as $property => $value)
{
// Skip form ID for now
if ($property == 'values')
{
continue;
}
if ($property === 'UserId')
{
$value = (int) (string) $value;
}
$data[$property] = (string) $value;
}
$data = (object) $data;
if (empty($data->SubmissionHash))
{
$data->SubmissionHash = ApplicationHelper::getHash(UserHelper::genRandomPassword());
}
$this->db->insertObject('#__rsform_submissions', $data, 'SubmissionId');
$submissionId = $data->SubmissionId;
// insert submission values
if (isset($submission->values))
{
foreach ($submission->values->children() as $value)
{
$data = array(
'FormId' => $this->formId,
'SubmissionId' => $submissionId,
'FieldName' => (string) $value->fieldname,
'FieldValue' => (string) $value->fieldvalue
);
$data = (object) $data;
$this->db->insertObject('#__rsform_submission_values', $data);
}
}
}
}
}