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