shell bypass 403

Cubjrnet7 Shell


name : forms.php
<?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\MVC\Model\ListModel;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Pagination\Pagination;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\HTML\HTMLHelper;

class RsformModelForms extends ListModel
{
	public $_mdata = null;

	/* @var TableRSForm_Forms */
	public $_form = null;

	public function __construct($config = array())
	{
		if (empty($config['filter_fields']))
		{
			$config['filter_fields'] = array(
				'FormTitle',
				'FormName',
				'Published',
				'FormId',
				'state'
			);
		}

		parent::__construct($config);
	}

	protected function populateState($ordering = null, $direction = null)
	{
		$this->setState('filter.search', 	$this->getUserStateFromRequest($this->context.'.filter.search', 'filter_search'));
		$this->setState('filter.state', 	$this->getUserStateFromRequest($this->context.'.filter.state', 	'filter_state'));

		// List state information.
		parent::populateState('FormId', 'asc');
	}

	protected function getListQuery()
	{
		$filter_search = $this->getState('filter.search', '');
		$lang		   = Factory::getLanguage();
		$db            = $this->getDbo();
		$query		   = $db->getQuery(true);
		$or 	= array();
		$ids 	= array();

		// Flag to know if we need translations - no point in doing a join if we're only using the default language.
		if (RSFormProHelper::getConfig('global.disable_multilanguage') && RSFormProHelper::getConfig('global.default_language') == 'en-GB')
		{
			$needs_translation = false;
		}
		else
		{
			// Must check if we've changed the language for some forms (each form has its own remembered language).
			if ($sessions = Factory::getSession()->get('com_rsform.form'))
			{
				// For each form in the session, we join a specific language and form id.
				foreach ($sessions as $form => $data)
				{
					if (strpos($form, 'formId') === 0 && isset($data->lang))
					{
						$id 	= (int) substr($form, strlen('formId'));
						$ids[] 	= $id;
						$or[] 	= '(' . $db->qn('t.lang_code') . ' = ' . $db->q($data->lang) . ' AND ' . $db->qn('t.form_id') . ' = ' . $db->q($id) . ')';
					}
				}

				// Now that we've joined the session forms, we must remove them so they do not show up as duplicates.
				if ($ids)
				{
					$or[] = '(' . $db->qn('t.lang_code') . ' = ' . $db->q($lang->getTag()) . ' AND ' . $db->qn('t.form_id') . ' NOT IN (' . implode(',', $db->q($ids)) . '))';
				}
			}

			$needs_translation = $lang->getTag() != $lang->getDefault() || $ids || (RSFormProHelper::getConfig('global.disable_multilanguage') && RSFormProHelper::getConfig('global.default_language') != 'en-GB');
		}

		$query->select($db->qn('f.FormId'))
			->select($db->qn('f.FormName'))
			->select($db->qn('f.Backendmenu'))
			->select($db->qn('f.Published'))
			->from($db->qn('#__rsform_forms', 'f'));

		if ($needs_translation)
		{
			$query->select('IFNULL(' . $db->qn('t.value') . ', ' . $db->qn('f.FormTitle') . ') AS FormTitle');
		}
		else
		{
			$query->select($db->qn('f.FormTitle'));
		}

		if ($needs_translation)
		{
			$on = array(
				$db->qn('f.FormId') . ' = ' . $db->qn('t.form_id'),
				$db->qn('t.reference') . ' = ' . $db->q('forms'),
				$db->qn('t.reference_id') . ' = ' . $db->q('FormTitle')
			);

			if ($or && !RSFormProHelper::getConfig('global.disable_multilanguage'))
			{
				$on[] = '(' . implode(' OR ', $or) . ')';
			}
			else
			{
				if (RSFormProHelper::getConfig('global.default_language') == 'en-GB')
				{
					$on[] = $db->qn('t.lang_code') . ' = ' . $db->q($lang->getTag());
				}
				else
				{
					$on[] = $db->qn('t.lang_code') . ' = ' . $db->q(RSFormProHelper::getConfig('global.default_language'));
				}
			}

			$query->join('left', $db->qn('#__rsform_translations', 't') . ' ON (' . implode(' AND ', $on) . ')');
		}

		if (strlen($filter_search))
		{
			if (stripos($filter_search, 'id:') === 0)
			{
				$query->where($db->qn('f.FormId') . ' = ' . (int) substr($filter_search, 3));
			}
			else
			{
				$query->having('(' . $db->qn('FormTitle') . ' LIKE ' . $db->q('%' . $filter_search . '%') . ' OR ' . $db->qn('FormName') . ' LIKE ' . $db->q('%' . $filter_search . '%') . ')');
			}
		}

		$state = $this->getState('filter.state');
		if ($state != '')
		{
			$query->where($db->qn('Published') . '=' . $db->q($state));
		}

		$query->order($db->qn($this->getSortColumn()) . ' ' . $db->escape($this->getSortOrder()));

		return $query;
	}

	public function getForms()
	{
		$items = $this->getItems();

		$formIds = array();
		foreach ($items as $row)
		{
			$formIds[] = $row->FormId;
		}

		if ($formIds)
		{
			$date = Factory::getDate();
			$tzoffset = Factory::getDate('now', Factory::getUser()->getTimezone())->getOffsetFromGmt(true);

			// Count submissions
			$db = Factory::getDbo();
			$query = $db->getQuery(true)
				->select('COUNT(' . $db->qn('SubmissionId') . ') AS ' . $db->qn('total'))
				->select($db->qn('FormId'))
				->from($db->qn('#__rsform_submissions'))
				->where($db->qn('FormId') . ' IN (' . implode(',', $db->q($formIds)) . ')')
				->group($db->qn('FormId'));
			$allSubmissions = $db->setQuery($query)->loadObjectList('FormId');

			// Month submissions
			$query = $db->getQuery(true)
				->select('COUNT(' . $db->qn('SubmissionId') . ') AS ' . $db->qn('total'))
				->select($db->qn('FormId'))
				->from($db->qn('#__rsform_submissions'))
				->where($db->qn('FormId') . ' IN (' . implode(',', $db->q($formIds)) . ')')
				->group($db->qn('FormId'));

			if ($tzoffset)
			{
				$query->where('DATE_FORMAT(DATE_ADD(' . $db->qn('DateSubmitted') . ', INTERVAL ' . $tzoffset . ' HOUR), ' . $db->q('%Y-%m') . ') = ' . $db->q($date->format('Y-m')));
			}
			else
			{
				$query->where('DATE_FORMAT(' . $db->qn('DateSubmitted') . ', ' . $db->q('%Y-%m') . ') = ' . $db->q($date->format('Y-m')));
			}
			$monthSubmissions = $db->setQuery($query)->loadObjectList('FormId');

			// Day submissions
			$query = $db->getQuery(true)
				->select('COUNT(' . $db->qn('SubmissionId') . ') AS ' . $db->qn('total'))
				->select($db->qn('FormId'))
				->from($db->qn('#__rsform_submissions'))
				->where($db->qn('FormId') . ' IN (' . implode(',', $db->q($formIds)) . ')')
				->group($db->qn('FormId'));

			if ($tzoffset)
			{
				$query->where('DATE_FORMAT(DATE_ADD(' . $db->qn('DateSubmitted') . ', INTERVAL ' . $tzoffset . ' HOUR), ' . $db->q('%Y-%m-%d') . ') >= ' . $db->q($date->format('Y-m-d')));
			}
			else
			{
				$query->where('DATE_FORMAT(' . $db->qn('DateSubmitted') . ', ' . $db->q('%Y-%m-%d') . ') = ' . $db->q($date->format('Y-m-d')));
			}
			$todaySubmissions = $db->setQuery($query)->loadObjectList('FormId');

			foreach ($items as $form)
			{
				$form->_todaySubmissions = isset($todaySubmissions[$form->FormId]) ? $todaySubmissions[$form->FormId]->total : 0;
				$form->_monthSubmissions = isset($monthSubmissions[$form->FormId]) ? $monthSubmissions[$form->FormId]->total : 0;
				$form->_allSubmissions = isset($allSubmissions[$form->FormId]) ? $allSubmissions[$form->FormId]->total : 0;
			}
		}

		return $items;
	}

	public function getSortColumn()
	{
		return $this->getState('list.ordering', 'FormId');
	}

	public function getSortOrder()
	{
		return $this->getState('list.direction', 'ASC');
	}

	public function getHasSubmitButton()
	{
		$formId = Factory::getApplication()->input->getInt('formId');
		$db     = $this->getDbo();

		$query = $db->getQuery(true)
            ->select($db->qn('ComponentId'))
            ->from($db->qn('#__rsform_components'))
            ->where($db->qn('FormId') . ' = ' . $db->q($formId))
            ->where($db->qn('ComponentTypeId') . ' = ' . $db->q(RSFORM_FIELD_SUBMITBUTTON));

		$db->setQuery($query);
		return $db->loadResult();
	}

	public function getFields()
	{
		$formId = Factory::getApplication()->input->getInt('formId');
		$db     = $this->getDbo();

		$return = array();

		$query = $db->getQuery(true)
			->select($db->qn('p.PropertyValue', 'ComponentName'))
			->select('c.*')
			->select($db->qn('ct.ComponentTypeName'))
			->from($db->qn('#__rsform_components', 'c'))
			->leftJoin($db->qn('#__rsform_properties', 'p') . ' ON (' . $db->qn('c.ComponentId') . ' = ' . $db->qn('p.ComponentId') . ' AND ' . $db->qn('p.PropertyName') . ' = ' . $db->q('NAME') . ')')
			->leftJoin($db->qn('#__rsform_component_types', 'ct') . ' ON (' . $db->qn('ct.ComponentTypeId') . ' = ' . $db->qn('c.ComponentTypeId') . ')')
			->where($db->qn('c.FormId') . ' = ' . $db->q($formId))
			->order($db->qn('c.Order') . ' ' . $db->escape('asc'));

		$db->setQuery($query);
		$components = $db->loadObjectList();

		$properties = RSFormProHelper::getComponentProperties($components);

		$pages = array();
		foreach ($components as $component)
		{
			if ($component->ComponentTypeId == RSFORM_FIELD_PAGEBREAK) {
				$pages[] = $component->ComponentId;
			}
		}

		foreach ($components as $component)
		{
			$data = $properties[$component->ComponentId];
			$data['componentId'] = $component->ComponentId;
			$data['componentTypeId'] = $component->ComponentTypeId;
			$data['ComponentTypeName'] = $component->ComponentTypeName;

			// Pagination
			if ($component->ComponentTypeId == RSFORM_FIELD_PAGEBREAK)
			{
				$data['PAGES'] = $pages;
			}

			$field = new stdClass();
			$field->id = $component->ComponentId;
			$field->type_id = $component->ComponentTypeId;
			$field->type_name = $component->ComponentTypeName;
			$field->name = $component->ComponentName;
			$field->published = $component->Published;
			$field->ordering = $component->Order;
			$field->preview = $this->showPreview($formId, $field->id, $data);

			$field->caption = isset($data['CAPTION']) && strlen($data['CAPTION']) ? $data['CAPTION'] : $field->name;

			if (!empty($data['REQUIRED']))
			{
				$field->hasRequired = true;
				$field->required = $data['REQUIRED'] == 'YES';
			}
			else
			{
				$field->required = false;
			}

			if (isset($data['VALIDATIONRULE']) && $data['VALIDATIONRULE'] != 'none')
			{
				$field->validation = $data['VALIDATIONRULE'];
			}
			elseif (isset($data['VALIDATIONRULE_DATE']) && $data['VALIDATIONRULE_DATE'] != 'none')
			{
				$field->validation = $data['VALIDATIONRULE_DATE'];
			}

			$return[$field->id] = $field;
		}
		
		return $return;
	}

	protected function showPreview($formId, $componentId, $data)
	{
		$mainframe 		= Factory::getApplication();
		$formId 		= (int) $formId;
		$componentId 	= (int) $componentId;

		// Legacy
		$r = array();
		$r['ComponentTypeName'] = $data['ComponentTypeName'];

		$out = '';

		//Trigger Event - onRsformBackendBeforeCreateComponentPreview
		$mainframe->triggerEvent('onRsformBackendBeforeCreateComponentPreview',array(array('out'=>&$out,'formId'=>$formId,'componentId'=>$componentId,'ComponentTypeName'=>$r['ComponentTypeName'],'data'=>$data)));

		$config    = array(
			'formId' 		=> $formId,
			'componentId' 	=> $componentId,
			'data' 			=> $data,
			'preview' 		=> true,
			'value' 		=> array(),
			'invalid' 		=> false,
			'errorClass' 	=> ''
		);

		if (!empty($r['ComponentTypeName']))
		{
			$type       = $r['ComponentTypeName'];
			$classFile  = JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/fields/' . strtolower($type) . '.php';
			if (file_exists($classFile))
			{
				$class = 'RSFormProField' . $type;

				if (!class_exists($class))
				{
					require_once $classFile;
				}

				// Create the field
				$field = new $class($config, true);

				// Return the output
				$out .= $field->output;
			}
		}

		if (empty($out))
		{
			$out = '<em>'.Text::_('RSFP_COMP_PREVIEW_NOT_AVAILABLE').'</em>';
		}

		//Trigger Event - onRsformBackendAfterCreateComponentPreview
		$mainframe->triggerEvent('onRsformBackendAfterCreateComponentPreview',array(array('out'=>&$out, 'formId'=>$formId, 'componentId'=>$componentId, 'ComponentTypeName'=>$r['ComponentTypeName'],'data'=>$data)));

		return $out;
	}

	public function getFieldsTotal()
	{
		$formId = Factory::getApplication()->input->getInt('formId');
		$db 	= $this->getDbo();

		$query = $db->getQuery(true)
			->select('COUNT(' . $db->qn('ComponentId') . ')')
			->from($db->qn('#__rsform_components'))
			->where($db->qn('FormId') . ' = ' . $db->q($formId));

		return $db->setQuery($query)->loadResult();
	}

	public function getFieldsPagination()
	{
		$pagination	= new Pagination($this->getFieldsTotal(), 1, 0);
		// hack to show the order up icon for the first item
		$pagination->limitstart = 1;
		return $pagination;
	}

	public function getForm()
	{
		$formId = Factory::getApplication()->input->getInt('formId');

		if (empty($this->_form))
		{
			$this->_form = Table::getInstance('RSForm_Forms', 'Table');
			$this->_form->load($formId);

			if (empty($this->_form->Lang))
			{
				$this->_form->Lang = Factory::getLanguage()->getDefault();
			}

			if ($this->_form->FormLayoutAutogenerate)
			{
				$this->autoGenerateLayout();
			}

			$lang = $this->getLang();
			if ($lang != $this->_form->Lang)
			{
				if ($translations = RSFormProHelper::getTranslations('forms', $this->_form->FormId, $lang))
				{
					foreach ($translations as $field => $value)
					{
						if (isset($this->_form->{$field}))
						{
							$this->_form->{$field} = $value;
						}
					}
				}
			}
		}

		return $this->_form;
	}

	public function getFormPost()
	{
		$formId = Factory::getApplication()->input->getInt('formId');

		$post = Table::getInstance('RSForm_Posts', 'Table');
		$post->load($formId, false);

		return $post;
	}

	public function autoGenerateLayout()
	{
		$formId = $this->_form->FormId;
		$filter = InputFilter::getInstance();

		$layout = JPATH_ADMINISTRATOR.'/components/com_rsform/layouts/'.$filter->clean($this->_form->FormLayoutName, 'path').'.php';
		if (!file_exists($layout)) {
			return false;
		}

		// check if the form title should be shown
		$showFormTitle =  $this->_form->ShowFormTitle;
		// set the required field marker
		$requiredMarker = isset($this->_form->Required) ? $this->_form->Required : '(*)';
		// get the form fields
		$fieldsets 		= $this->getFieldNames('fieldsets');
		// get the form options
		$formOptions = RSFormProHelper::getForm($formId);

		// Generate the layout
		ob_start();
		// include the layout selected
		include $layout;
		$out = ob_get_contents();
		ob_end_clean();

		if ($out != $this->_form->FormLayout && $this->_form->FormId) {
			// Clean it
			// Update the layout
			$db = Factory::getDbo();
			$query = $db->getQuery(true)
				->update($db->qn('#__rsform_forms'))
				->set($db->qn('FormLayout').'='.$db->q($out))
				->where($db->qn('FormId').'='.$db->q($formId));

			$db->setQuery($query)->execute();
		}

		$this->_form->FormLayout = $out;
	}

	public function getJForm()
	{
		// Get the form.
		$form = $this->loadForm('com_rsform.form', 'form', array('control' => '', 'load_data' => false));
		if (empty($form))
		{
			return false;
		}

		if (empty($this->_form))
		{
			$this->getForm();
		}

		$data = clone $this->_form;
		$data->Language = $this->getLang();

		if (!empty($data->ConfirmSubmissionDefer))
		{
			$data->ConfirmSubmissionDefer = json_decode($data->ConfirmSubmissionDefer);
		}

		if (empty($data->ConfirmSubmissionDefer))
		{
			$data->ConfirmSubmissionDefer = array();
		}

		$form->bind($data->getProperties());

		return $form;
	}

	public function getPostJForm()
	{
		// Get the form.
		$form = $this->loadForm('com_rsform.post', 'post', array('control' => 'form_post', 'load_data' => false));
		if (empty($form))
		{
			return false;
		}

		$form->bind($this->getFormPost()->getProperties());

		return $form;
	}

	public function getProperty($fieldData, $prop, $default = null)
	{
		// Special case, we no longer use == 'YES' or == 'NO'
		if (isset($fieldData[$prop]))
		{
			if ($fieldData[$prop] === 'YES')
			{
				return true;
			}
			elseif ($fieldData[$prop] === 'NO')
			{
				return false;
			}
			else
			{
				return $fieldData[$prop];
			}
		}

		if ($default === 'YES')
		{
			return true;
		}
		elseif ($default === 'NO')
		{
			return false;
		}
		else
		{
			return $default;
		}
	}

	public function getComponentType($componentId, $formId)
	{
		$db 	= Factory::getDbo();
		$query	= $db->getQuery(true);

		$query->select($db->qn('ComponentTypeId'))
			->from($db->qn('#__rsform_components'))
			->where($db->qn('FormId').'='.$db->q($formId))
			->where($db->qn('ComponentId').'='.$db->q($componentId));
		
		$query->setLimit(1);
		
		$db->setQuery($query);

		return $db->loadResult();
	}

	protected function getFieldNames($type = 'all')
	{
		require_once JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/quickfields.php';
		return RSFormProQuickFields::getFieldNames($type);
	}

	public function getRequiredFields() {
		return $this->getFieldNames('required');
	}

	public function getHiddenFields() {
		return $this->getFieldNames('hidden');
	}

	public function getQuickFields() {
		return $this->getFieldNames('all');
	}

	public function getPageFields() {
		return $this->getFieldNames('pages');
	}

	public function getFormList()
	{
		$return = array();
		$formId = Factory::getApplication()->input->getInt('formId');
		$db     = $this->getDbo();
		
		// Workaround to ignore searches
		$filter_search = $this->getState('filter.search');
		$filter_state = $this->getState('filter.state');
		$this->setState('filter.search', null);
		$this->setState('filter.state', null);

		$query = $this->getListQuery();
		
		// Revert
		$this->setState('filter.search', $filter_search);
		$this->setState('filter.state', $filter_state);

		$db->setQuery($query);
		$results = $db->loadObjectList();
		foreach ($results as $result)
		{
			$return[] = HTMLHelper::_('select.option', $result->FormId, $result->FormTitle, 'value', 'text', $result->FormId == $formId);
		}

		return $return;
	}

	public function save()
	{
		$mainframe 	= Factory::getApplication();
        $post 		= array();
		$form       = Table::getInstance('RSForm_Forms', 'Table');

		foreach ($form->getProperties(true) as $property => $value)
		{
			$post[$property] = $mainframe->input->post->get($property, $value, 'raw');
		}

		$post['formId'] = $post['FormId'];

		if (!empty($post['ThankYouMessagePopUp']))
		{
			$post['ScrollToThankYou'] = 0;
		}

		unset($form->Thankyou);
		unset($form->UserEmailText);
		unset($form->AdminEmailText);
		unset($form->DeletionEmailText);
		unset($form->ErrorMessage);

		if (!isset($post['FormLayoutAutogenerate']))
		{
			$post['FormLayoutAutogenerate'] = 0;
		}

		if (empty($post['Keepdata']))
		{
			$post['ConfirmSubmission'] = 0;
		}

		if (!isset($post['ConfirmSubmissionDefer']))
		{
			$post['ConfirmSubmissionDefer'] = array();
		}

		$post['ConfirmSubmissionDefer'] = json_encode($post['ConfirmSubmissionDefer']);

		try
		{
			$form->bind($post);

			if (!$form->check())
			{
				return false;
			}
		}
		catch (Exception $e)
		{
			$mainframe->enqueueMessage($e->getMessage(), 'error');
			return false;
		}

		$this->saveFormTranslation($form, $this->getLang());

		if ($form->store())
		{
			// Post to another location
			$row = Table::getInstance('RSForm_Posts', 'Table');

            $form_post 				= $mainframe->input->get('form_post', array(), 'array');
            $form_post['form_id'] 	= $post['formId'];
			$form_post['fields'] 	= array();
			if (isset($form_post['name'], $form_post['value']) && is_array($form_post['name']) && is_array($form_post['value']))
			{
				for ($i = 0; $i < count($form_post['name']); $i++)
				{
					$form_post['fields'][] = array(
						'name'  => $form_post['name'][$i],
						'value' => $form_post['value'][$i],
					);
				}
			}
			$form_post['headers'] 	= array();
			if (isset($form_post['headers_name'], $form_post['headers_value']) && is_array($form_post['headers_name']) && is_array($form_post['headers_value']))
			{
				for ($i = 0; $i < count($form_post['headers_name']); $i++)
				{
					$form_post['headers'][] = array(
						'name'  => $form_post['headers_name'][$i],
						'value' => $form_post['headers_value'][$i],
					);
				}
			}

			$row->save($form_post);

			// Trigger event
			$mainframe->triggerEvent('onRsformFormSave', array(&$form));
			return true;
		}
		else
		{
			$mainframe->enqueueMessage($form->getError(), 'error');
			return false;
		}
	}

	public function saveFormTranslation(&$form, $lang)
	{
		if ($form->Lang == $lang || (RSFormProHelper::getConfig('global.disable_multilanguage') && RSFormProHelper::getConfig('global.default_language') == 'en-GB'))
        {
            return true;
        }

		$fields 	  = array('FormTitle', 'UserEmailFromName', 'UserEmailSubject', 'AdminEmailFromName', 'AdminEmailSubject', 'DeletionEmailFromName', 'DeletionEmailSubject', 'DeletionEmailReplyToName', 'MetaDesc', 'MetaKeywords', 'UserEmailReplyToName', 'AdminEmailReplyToName', 'ReturnUrl');
		$translations = RSFormProHelper::getTranslations('forms', $form->FormId, $lang, 'id');
		foreach ($fields as $field)
		{
            $translation = (object) array(
                'form_id'       => $form->FormId,
                'lang_code'     => $lang,
                'reference'     => 'forms',
                'reference_id'  => $field,
                'value'         => $form->{$field}
            );

			if (!isset($translations[$field]))
			{
			    $this->getDbo()->insertObject('#__rsform_translations', $translation);
			}
			else
			{
			    $translation->id = $translations[$field];
			    $this->getDbo()->updateObject('#__rsform_translations', $translation, array('id'));
			}
			unset($form->$field);
		}

		return true;
	}

	public function saveFormPropertyTranslation($formId, $componentId, &$params, $lang, $just_added, $properties)
	{
		$fields 	  = RSFormProHelper::getTranslatableProperties();
		$translations = RSFormProHelper::getTranslations('properties', $formId, $lang, 'id');
		$db           = $this->getDbo();

		foreach ($fields as $field)
		{
			if (!isset($params[$field])) continue;

			$reference_id = $componentId.'.'.$db->escape($field);

			$translation = (object) array(
                'form_id'       => $formId,
                'lang_code'     => $lang,
                'reference'     => 'properties',
                'reference_id'  => $reference_id,
                'value'         => $params[$field]
            );

			if (!isset($translations[$reference_id]))
			{
			    $db->insertObject('#__rsform_translations', $translation);
			}
			else
			{
			    $translation->id = $translations[$reference_id];
                $db->updateObject('#__rsform_translations', $translation, array('id'));
			}

			if (!$just_added && in_array($field, $properties))
			{
                unset($params[$field]);
            }
		}
	}

	public function getLang()
	{
		if (empty($this->_form))
		{
			$this->getForm();
		}

		return RSFormProHelper::getCurrentLanguage($this->_form->FormId);
	}

	public function getMappings()
	{
		if (empty($this->_mdata))
		{
			$db 	= Factory::getDbo();
			$formId	= Factory::getApplication()->input->getInt('formId');

			$query = $db->getQuery(true)
				->select('*')
				->from($db->qn('#__rsform_mappings'))
				->where($db->qn('formId') . ' = ' . $db->q($formId))
				->order($db->qn('ordering') . ' ' . $db->escape('asc'));

			$this->_mdata = $this->_getList($query);
		}

		return $this->_mdata;
	}

	public function getCalculations()
	{
		$formId	= Factory::getApplication()->input->getInt('formId');

		return RSFormProHelper::getCalculations($formId);
	}

	public function getConditions()
	{
		require_once JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/conditions.php';

		$formId	= Factory::getApplication()->input->getInt('formId');
		$lang	= $this->getLang();

		return RSFormProConditions::getConditions($formId, $lang, null);
	}

	public function getEmails()
	{
		$formId = Factory::getApplication()->input->getInt('formId');
		if (!$formId)
		{
			return array();
		}

		$db 	= $this->getDbo();
		$query 	= $db->getQuery(true)
			->select($db->qn(array('id', 'to', 'subject', 'formId')))
			->from($db->qn('#__rsform_emails'))
			->where($db->qn('type') . ' = ' . $db->q('additional'))
			->where($db->qn('formId') . ' = ' . $db->q($formId));

		$emails = $this->_getList($query);
		if (!empty($emails))
		{
			$translations = RSFormProHelper::getTranslations('emails', $formId, Factory::getSession()->get('com_rsform.form.formId'.$formId.'.lang', Factory::getLanguage()->getDefault()));
			foreach ($emails as $id => $email)
			{
				if (isset($translations[$email->id.'.fromname']))
				{
					$emails[$id]->fromname = $translations[$email->id.'.fromname'];
				}

				if (isset($translations[$email->id.'.subject']))
				{
					$emails[$id]->subject = $translations[$email->id.'.subject'];
				}

				if (isset($translations[$email->id.'.message']))
				{
					$emails[$id]->message = $translations[$email->id.'.message'];
				}
			}
		}

		return $emails;
	}

	public function copyComponent($sourceComponentId, $toFormId)
	{
		$sourceComponentId 	= (int) $sourceComponentId;
		$toFormId 			= (int) $toFormId;
		$db 				= Factory::getDbo();

		$query = $db->getQuery(true)
			->select('c.*')
			->select('ct.CanBeDuplicated')
			->from($db->qn('#__rsform_components', 'c'))
			->join('left', $db->qn('#__rsform_component_types', 'ct') . ' ON (' . $db->qn('c.ComponentTypeId') . ' = ' . $db->qn('ct.ComponentTypeId') . ')')
			->where($db->qn('ComponentId').'='.$db->q($sourceComponentId));
		if ($component = $db->setQuery($query)->loadObject())
		{
			if (!$component->CanBeDuplicated)
			{
				if ($toFormId == $component->FormId)
				{
					throw new Exception(Text::_('COM_RSFORM_CANNOT_DUPLICATE_THIS_FIELD'));
				}
				else
				{
					// Check if the new form has this type of field already
					$query->clear()
						->select($db->qn('ComponentId'))
						->from($db->qn('#__rsform_components'))
						->where($db->qn('FormId') . ' = ' . $db->q($toFormId))
						->where($db->qn('ComponentTypeId') . ' = ' . $db->q($component->ComponentTypeId));

					if ($db->setQuery($query)->loadResult())
					{
						throw new Exception(Text::_('COM_RSFORM_CANNOT_COPY_THIS_FIELD_TO_FORM_ALREADY_EXISTS'));
					}
				}
			}
			// Get max ordering
			$query->clear()
				->select('MAX('.$db->qn('Order').')')
				->from($db->qn('#__rsform_components'))
				->where($db->qn('FormId').'='.$db->q($toFormId));
			$component->Order = (int) $db->setQuery($query)->loadResult() + 1;

			// Insert the new field
			$query->clear()
				->insert($db->qn('#__rsform_components'))
				->set($db->qn('FormId').'='.$db->q($toFormId))
				->set($db->qn('ComponentTypeId').'='.$db->q($component->ComponentTypeId))
				->set($db->qn('Order').'='.$db->q($component->Order))
				->set($db->qn('Published').'='.$db->q($component->Published));
			$db->setQuery($query)->execute();

			// Get the newly created field ID
			$newComponentId = $db->insertid();

			// Get the properties of the field so we can duplicate them
			$query->clear()
				->select('*')
				->from($db->qn('#__rsform_properties'))
				->where($db->qn('ComponentId').'='.$db->q($sourceComponentId));
			$properties = $db->setQuery($query)->loadObjectList();
			foreach ($properties as $property) {
				// Handle duplicated fields
				if ($property->PropertyName == 'NAME' && $toFormId == $component->FormId) {
					$property->PropertyValue .= '_copy';

					while (RSFormProHelper::componentNameExists($property->PropertyValue, $toFormId)) {
						$property->PropertyValue .= mt_rand(0,9);
					}
				}

				$query->clear()
					->insert('#__rsform_properties')
					->set($db->qn('ComponentId').'='.$db->q($newComponentId))
					->set($db->qn('PropertyName').'='.$db->q($property->PropertyName))
					->set($db->qn('PropertyValue').'='.$db->q($property->PropertyValue));
				$db->setQuery($query)->execute();
			}

			// Copy language
			$query->clear()
				->select('*')
				->from($db->qn('#__rsform_translations'))
				->where($db->qn('reference').'='.$db->q('properties'))
				->where($db->qn('reference_id').' LIKE '.$db->q($sourceComponentId.'.%'));
			$translations = $db->setQuery($query)->loadObjectList();
			foreach ($translations as $translation) {
				list($oldComponentId, $property) = explode('.', $translation->reference_id, 2);
				$reference_id = $newComponentId.'.'.$property;

				$query->clear()
					->insert('#__rsform_translations')
					->set($db->qn('form_id').'='.$db->q($toFormId))
					->set($db->qn('lang_code').'='.$db->q($translation->lang_code))
					->set($db->qn('reference').'='.$db->q('properties'))
					->set($db->qn('reference_id').'='.$db->q($reference_id))
					->set($db->qn('value').'='.$db->q($translation->value));

				$db->setQuery($query)->execute();
			}

			return $newComponentId;
		}

		return false;
	}

	public function getFieldGroups()
	{
		$groups = array(
			'standard' => (object) array(
				'name' 		=> Text::_('RSFP_FORM_FIELDS'),
				'fields' 	=> array()
			),
			'multipage' => (object) array(
				'name' 		=> Text::_('RSFP_MULTIPAGE'),
				'fields' 	=> array()
			),
			'captcha' => (object) array(
				'name'		=> Text::_('RSFP_CAPTCHA'),
				'fields' 	=> array()
			),
			'advanced' => (object) array(
				'name' 		=> Text::_('RSFP_ADVANCED_FORM_FIELDS'),
				'fields' 	=> array()
			),
			'payment' => (object) array(
				'fields'	=> array()
			)
		);

		// Standard fields
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_TEXTBOX,
			'name' 	=> Text::_('RSFP_COMP_TEXTBOX'),
			'icon'  => 'rsficon rsficon-progress-full'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_TEXTAREA,
			'name' 	=> Text::_('RSFP_COMP_TEXTAREA'),
			'icon'  => 'rsficon rsficon-file-text'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_SELECTLIST,
			'name' 	=> Text::_('RSFP_COMP_DROPDOWN'),
			'icon'  => 'rsficon rsficon-caret-square-o-down'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_CHECKBOXGROUP,
			'name' 	=> Text::_('RSFP_COMP_CHECKBOX'),
			'icon'  => 'rsficon rsficon-check-square-o'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_RADIOGROUP,
			'name' 	=> Text::_('RSFP_COMP_RADIO'),
			'icon'  => 'rsficon rsficon-dot-circle-o'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_SUBMITBUTTON,
			'name' 	=> Text::_('RSFP_COMP_SUBMITBUTTON'),
			'icon'  => 'rsficon rsficon-square'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_PASSWORD,
			'name' 	=> Text::_('RSFP_COMP_PASSWORD'),
			'icon'  => 'rsficon rsficon-lock'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_FILEUPLOAD,
			'name' 	=> Text::_('RSFP_COMP_FILE'),
			'icon'  => 'rsficon rsficon-file-text-o'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_FREETEXT,
			'name' 	=> Text::_('RSFP_COMP_FREETEXT'),
			'icon'  => 'rsficon rsficon-sort-alphabetically'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_CALENDAR,
			'name' 	=> Text::_('RSFP_COMP_CALENDAR'),
			'icon'  => 'rsficon rsficon-calendar-o'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_JQUERY_CALENDAR,
			'name' 	=> Text::_('RSFP_COMP_JQUERY_CALENDAR'),
			'icon'  => 'rsficon rsficon-calendar'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_BUTTON,
			'name' 	=> Text::_('RSFP_COMP_BUTTON'),
			'icon'  => 'rsficon rsficon-square'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_HIDDEN,
			'name' 	=> Text::_('RSFP_COMP_HIDDEN'),
			'icon'  => 'rsficon rsficon-texture'
		);
		$groups['standard']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_TICKET,
			'name' 	=> Text::_('RSFP_COMP_TICKET'),
			'icon'  => 'rsficon rsficon-ticket'
		);

		// Multipage
		$groups['multipage']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_PAGEBREAK,
			'name' 	=> Text::_('RSFP_PAGE_BREAK'),
			'icon'  => 'rsficon rsficon-vertical_align_center'
		);

		// Captcha
		$formId = Factory::getApplication()->input->getInt('formId');
		$exists = RSFormProHelper::componentExists($formId, RSFORM_FIELD_CAPTCHA);
		$groups['captcha']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_CAPTCHA,
			'name' 	=> Text::_('RSFP_COMP_CAPTCHA'),
			'icon'  => 'rsficon rsficon-shield',
			'exists' => $exists ? $exists[0] : false
		);
		$exists = RSFormProHelper::componentExists($formId, RSFORM_FIELD_HASHCASH);
		$groups['captcha']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_HASHCASH,
			'name' 	=> Text::_('RSFP_COMP_HASHCASH'),
			'icon'  => 'rsficon rsficon-shield',
			'exists' => $exists ? $exists[0] : false
		);

		// Advanced
		$groups['advanced']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_PREVIEW,
			'name' 	=> Text::_('RSFP_COMP_PREVIEW'),
			'icon'  => 'rsficon rsficon-sort-alphabetically'
		);
		$groups['advanced']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_BIRTHDAY,
			'name' 	=> Text::_('RSFP_COMP_BIRTHDAY'),
			'icon'  => 'rsficon rsficon-birthday-cake'
		);
		$groups['advanced']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_GMAPS,
			'name' 	=> Text::_('RSFP_COMP_GMAP'),
			'icon'  => 'rsficon rsficon-map-marker'
		);
		$groups['advanced']->fields[] = (object) array(
			'id' 	=> RSFORM_FIELD_RANGE_SLIDER,
			'name' 	=> Text::_('RSFP_COMP_RANGE_SLIDER'),
			'icon'  => 'rsficon rsficon-th-list'
		);

		Factory::getApplication()->triggerEvent('onRsformBackendAfterCreateFieldGroups', array(&$groups, $this));

		return $groups;
	}
}

© 2025 Cubjrnet7