<?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\HTML\HTMLHelper; use Joomla\CMS\MVC\Model\BaseDatabaseModel; use Joomla\CMS\Language\Text; define('RSFP_MAPPINGS_INSERT', 0); define('RSFP_MAPPINGS_UPDATE', 1); define('RSFP_MAPPINGS_DELETE', 2); define('RSFP_MAPPINGS_REPLACE', 3); class RSFormProMappings { public static function getModel() { static $model; if ($model === null) { BaseDatabaseModel::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_rsform/models'); $model = BaseDatabaseModel::getInstance('Mappings', 'RsformModel'); } return $model; } public static function getMappingQuery($row) { $model = static::getModel(); $config = array( 'connection' => $row->connection, 'host' => $row->host, 'driver' => $row->driver, 'port' => $row->port, 'username' => $row->username, 'password' => $row->password, 'database' => $row->database ); $db = $model->getMappingDbo($config); $query = $db->getQuery(true); // Get the fields $data = @unserialize($row->data); if ($data === false) { $data = array(); } // Get the WHERE fields $wheredata = @unserialize($row->wheredata); if ($wheredata === false) { $wheredata = array(); } // Get the operators $extra = @unserialize($row->extra); if ($extra === false) { $extra = array(); } // Get the and / or operators $andor = @unserialize($row->andor); if ($andor === false) { $andor = array(); } // Create the WHERE cause if (!empty($wheredata)) { $where = ''; $i = 0; foreach ($wheredata as $column => $field) { $andorop = isset($andor[$column]) ? $andor[$column] : 0; $andorop = $andorop ? 'OR' : 'AND'; $operator = isset($extra[$column]) ? $extra[$column] : '='; $where .= $i ? " ".$andorop." " : ''; if ($operator == '%..%') { $where .= ' '.$db->qn($column).' LIKE '.$db->q('%'.$db->escape($field, true).'%', false); } elseif ($operator == '%..') { $where .= ' '.$db->qn($column).' LIKE '.$db->q('%'.$db->escape($field, true), false); } elseif ($operator == '..%') { $where .= ' '.$db->qn($column).' LIKE '.$db->q($db->escape($field, true).'%', false); } else { $where .= ' '.$db->qn($column).' '.$operator.' '.$db->q($field, true); } $i++; } if ($where) { $query->where($where); } } // Create the SET clause if (!empty($data)) { $fields = array(); $values = array(); foreach ($data as $column => $field) { $query->set($db->qn($column).'='.$db->q($field)); $fields[] = $db->qn($column); $values[] = $db->q($field); } } // Prefix the database name $table = $row->table; switch ($row->method) { case RSFP_MAPPINGS_INSERT: $query->clear(); $query->insert($db->qn($table)); if (!empty($fields)) { $query->columns($fields); } if (!empty($values)) { $query->values(implode(',', $values)); } break; case RSFP_MAPPINGS_REPLACE: $query = 'REPLACE INTO '.$db->qn($table).' SET '; $set = array(); // Create the SET clause if (!empty($data)) { foreach ($data as $column => $field) { $set[] = $db->qn($column).'='.$db->q($field); } } if ($set) { $query .= implode(', ', $set); } break; case RSFP_MAPPINGS_UPDATE: $query->update($db->qn($table)); break; case RSFP_MAPPINGS_DELETE: $query->delete($db->qn($table)); break; } return $query; } public static function mappingsColumns($config, $method, $row = null) { $model = static::getModel(); $columns = $model->getColumns($config); $data = @unserialize($row->data); if ($data === false) $data = array(); $where = @unserialize($row->wheredata); if ($where === false) $where = array(); $extra = @unserialize($row->extra); if ($extra === false) $extra = array(); $andor = @unserialize($row->andor); if ($andor === false) $andor = array(); $operators = array( HTMLHelper::_('select.option', '=', Text::_( 'RSFP_OPERATOR_EQUALS' ) ), HTMLHelper::_('select.option', '!=', Text::_( 'RSFP_OPERATOR_NOTEQUAL' ) ), HTMLHelper::_('select.option', '>', Text::_( 'RSFP_OPERATOR_GREATER_THAN' ) ), HTMLHelper::_('select.option', '<', Text::_( 'RSFP_OPERATOR_LESS_THAN' ) ), HTMLHelper::_('select.option', '>=', Text::_( 'RSFP_OPERATOR_EQUALS_GREATHER_THAN' ) ), HTMLHelper::_('select.option', '<=', Text::_( 'RSFP_OPERATOR_EQUALS_LESS_THAN' ) ), HTMLHelper::_('select.option', '%..%', Text::_( 'RSFP_OPERATOR_LIKE' ) ), HTMLHelper::_('select.option', '%..', Text::_( 'RSFP_OPERATOR_STARTS_WITH' ) ), HTMLHelper::_('select.option', '..%', Text::_( 'RSFP_OPERATOR_ENDS_WITH' ) ), ); $html = ''; $html .= '<h3 class="rsfp-legend">' . ($method == 'set' ? Text::_('RSFP_SET') : Text::_('RSFP_WHERE')) . '</h3>'; $html .= '<table class="table table-striped">'; if (!empty($columns)) { $i = 0; foreach ($columns as $column => $type) { if ($method == 'set') { $value = isset($data[$column]) ? $data[$column] : ''; $name = 'f[' . $column . ']'; } else { $value = isset($where[$column]) ? $where[$column] : ''; $name = 'w[' . $column . ']'; $op = isset($extra[$column]) ? $extra[$column] : '='; $op2 = isset($andor[$column]) ? $andor[$column] : 0; } $html .= '<tr>'; $html .= '<td width="80" nowrap="nowrap" align="right" class="key">'.RSFormProHelper::htmlEscape($column).' ('.$type.')</td>'; if ($method == 'where') { $html .= '<td>'.HTMLHelper::_('select.genericlist', $operators, 'o[' . $column . ']', '', 'value', 'text', $op, 'o_' . $column).'</td>'; } if (strpos($type, 'text') !== false) { $html .= '<td><textarea class="rs_textarea" style="width:300px; height: 200px;" id="'.RSFormProHelper::htmlEscape($name).'" name="'.RSFormProHelper::htmlEscape($name).'">'.RSFormProHelper::htmlEscape($value).'</textarea></td>'; } else { $html .= '<td><input type="text" class="rs_inp rs_80" data-delimiter=" " data-placeholders="display" size="35" value="'.RSFormProHelper::htmlEscape($value).'" id="'.RSFormProHelper::htmlEscape($name).'" name="'.RSFormProHelper::htmlEscape($name).'"></td>'; } if ($method == 'where') { if ($i) { $html .= '<td>'.HTMLHelper::_('select.booleanlist', 'c[' . $column . ']', '', $op2, 'RSFP_OR', 'RSFP_AND', 'c_' . $column).'</td>'; } else { $html .= '<td></td>'; } } $html .= '</tr>'; $i++; } } $html .= '</table>'; return $html; } }