<?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\AdminModel; use Joomla\CMS\Factory; use Joomla\CMS\Table\Table; use Joomla\CMS\Language\Text; use Joomla\Database\DatabaseDriver; define('RSFP_MAPPING_INSERT', 0); define('RSFP_MAPPING_DELETE', 2); define('RSFP_MAPPING_UPDATE', 1); define('RSFP_MAPPING_REPLACE', 3); class RsformModelMappings extends AdminModel { public function getMapping() { $row = Table::getInstance('RSForm_Mappings', 'Table'); $row->load(Factory::getApplication()->input->getInt('cid')); return $row; } public function getForm($data = array(), $loadData = true) { // Get the form. $form = $this->loadForm('com_rsform.mappings', 'mappings', array('control' => 'jform', 'load_data' => $loadData)); if (empty($form)) { return false; } if ($loadData) { $mapping = $this->getMapping(); if ($mapping->id) { $config = $mapping->getProperties(); $config['user'] = $config['username']; try { if ($tables = $this->getTables($config)) { $tableField = $form->getField('table'); $form->setFieldAttribute('table', 'disabled', 'false'); foreach ($form->getFieldset('connection') as $field) { $form->setFieldAttribute($field->fieldname, 'disabled', 'true'); } $form->setFieldAttribute('table', 'disabled', 'false'); foreach ($tables as $table) { $tableField->addOption($table, array('value' => $table)); } } } catch (Exception $e) { // Nothing for now } } } return $form; } protected function loadFormData() { return $this->getMapping(); } public function save($post) { $row = Table::getInstance('RSForm_Mappings', 'Table'); if (!$row->bind($post)) { return false; } if (!$row->check()) { return false; } $data = $where = $extra = $andor = array(); if (!empty($post)) { if (!empty($post['f'])) { foreach ($post['f'] as $key => $value) { if (!strlen($value)) { continue; } $data[$key] = $value; } } if (!empty($post['w'])) { foreach ($post['w'] as $key => $value) { if (!strlen($value)) { continue; } $where[$key] = $value; $extra[$key] = isset($post['o'][$key]) ? $post['o'][$key] : '='; $andor[$key] = isset($post['c'][$key]) ? $post['c'][$key] : 0; } } } if (in_array($row->method, array(RSFP_MAPPING_INSERT, RSFP_MAPPING_UPDATE, RSFP_MAPPING_REPLACE)) && empty($data)) { return false; } if ($row->method == RSFP_MAPPING_DELETE && empty($where)) { return false; } $row->data = serialize($data); $row->wheredata = serialize($where); $row->extra = serialize($extra); $row->andor = serialize($andor); return $row->store(); } public function remove() { $id = Factory::getApplication()->input->getInt('mid'); $db = Factory::getDbo(); $row = Table::getInstance('RSForm_Mappings', 'Table'); $row->load($id); $formId = $row->formId; $row->delete($id); $row->reorder($db->qn('formId').'='.$db->q($formId)); } public function getQuickFields() { require_once JPATH_ADMINISTRATOR . '/components/com_rsform/helpers/quickfields.php'; return RSFormProQuickFields::getFieldNames(); } // Get columns from a specific table public function getColumns($config) { $db = $this->getMappingDbo($config); $tables = $db->getTableList(); $table = isset($config['table']) ? $config['table'] : ''; if (empty($table) || !in_array($table, $tables)) { return false; } else { return $db->getTableColumns($table); } } // Get tables in database public function getTables($config) { $db = $this->getMappingDbo($config); return $db->getTableList(); } // Get database connector object public function getMappingDbo($config) { if ($config['connection']) { if (!strlen($config['database'])) { throw new Exception(Text::_('RSFP_PLEASE_SELECT_A_DATABASE_FIRST')); } if (empty($config['driver'])) { throw new Exception(Text::_('RSFP_PLEASE_SELECT_A_DRIVER_FIRST')); } $config['user'] = $config['username']; $database = DatabaseDriver::getInstance($config); $database->connect(); return $database; } else { return Factory::getDbo(); } } }