%PDF- %PDF-
| Direktori : /home1/lightco1/www/lightcolab.com/administrator/components/com_dbreplacer/ |
| Current File : //home1/lightco1/www/lightcolab.com/administrator/components/com_dbreplacer/ajax.php |
<?php
/**
* @package DB Replacer
* @version 6.1.0
*
* @author Peter van Westen <info@regularlabs.com>
* @link http://www.regularlabs.com
* @copyright Copyright © 2018 Regular Labs All Rights Reserved
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
*/
defined('_JEXEC') or die;
if (JFactory::getApplication()->isSite())
{
die();
}
use RegularLabs\Library\Language as RL_Language;
use RegularLabs\Library\Parameters as RL_Parameters;
use RegularLabs\Library\RegEx as RL_RegEx;
$class = new DBReplacer;
echo $class->render();
die;
class DBReplacer
{
public function render()
{
$this->config = RL_Parameters::getInstance()->getComponentParams('com_dbreplacer');
$field = JFactory::getApplication()->input->get('field', 'table');
$params = JFactory::getApplication()->input->getBase64('params');
$params = str_replace(
['[-CHAR-LT-]', '[-CHAR-GT-]'],
['<', '>'],
urldecode(base64_decode($params))
);
$params = json_decode($params);
if (is_null($params))
{
$params = (object) [];
}
$this->params = $params;
switch ($field)
{
case 'rows':
return $this->renderRows();
case 'columns':
default:
return $this->renderColumns();
}
}
private function renderColumns()
{
$table = $this->params->table;
$selected = $this->implodeParams($this->params->columns);
$options = [];
if ($table)
{
$cols = $this->getColumns();
foreach ($cols as $col)
{
$options[] = JHtml::_('select.option', $col, $col, 'value', 'text', 0);
}
}
$html = '<strong>' . $this->params->table . '</strong><br>';
$html .= JHtml::_('select.genericlist', $options, 'columns[]', 'multiple="multiple" size="20" class="dbr_element"', 'value', 'text', $selected, 'paramscolumns');
return $html;
}
private function getColumns()
{
if (RL_RegEx::match('[^a-z0-9-_\#]', $this->params->table))
{
die('Invalid data found in URL!');
}
$db = JFactory::getDbo();
$query = 'SHOW COLUMNS FROM `' . trim($this->params->table) . '`';
$db->setQuery($query);
$columns = $db->loadColumn();
return $columns;
}
private function renderRows()
{
// Load plugin language
RL_Language::load('com_dbreplacer');
$max = 50;
if ( ! $this->params->table)
{
return '';
}
$columns = $this->implodeParams($this->params->columns);
$cols = $this->getColumns();
$rows = $this->getRows($cols, $max);
if (is_null($rows))
{
return $this->getMessage(JText::_('DBR_INVALID_QUERY'), 'error');
}
if (empty($rows))
{
return $this->getMessage(JText::_('DBR_ROW_COUNT_NONE'));
}
$html = [];
if ($this->params->search)
{
if (count($rows) > $max - 1)
{
$html[] = $this->getMessage(JText::sprintf('DBR_MAXIMUM_ROW_COUNT_REACHED', $max), 'warning');
}
else
{
$html[] = $this->getMessage(JText::sprintf('DBR_ROW_COUNT', count($rows)));
}
}
$html[] = '<p><a class="btn btn-default" onclick="RLDBReplacer.toggleInactiveColumns();">' . JText::_('DBR_TOGGLE_INACTIVE_COLUMNS') . '</a></p>';
$html[] = '<table class="table table-striped" id="dbr_results">';
$html[] = '<thead><tr>';
foreach ($cols as $col)
{
$class = '';
if ( ! in_array($col, $columns))
{
$class = 'ghosted';
}
$html[] = '<th class="' . $class . '">' . $col . '</th>';
}
$html[] = '</tr></thead>';
if ($rows && ! empty($rows))
{
$html[] = '<tbody>';
$html[] = $this->getTableRow($rows, $cols);
$html[] = '</tbody>';
}
$html[] = '</table>';
return implode("\n", $html);
}
private function getMessage($text = '', $type = 'info')
{
return '<div class="alert alert-' . $type . '">' . $text . '</div>';
}
private function getTableRow($rows, $cols)
{
foreach ($rows as $row)
{
$html[] = '<tr>';
foreach ($cols as $col)
{
list($val, $class) = $this->getCellData($row, $col);
$val = nl2br($val);
$html[] = '<td class="db_value ' . $class . '">' . $val . '</td>';
}
$html[] = '</tr>';
}
return implode('', $html);
}
private function getCellData($row, $col)
{
$columns = $this->implodeParams($this->params->columns);
$class = '';
$val = $row->{$col};
if ( ! in_array($col, $columns))
{
$class = 'ghosted';
if ($val == '' || $val === null || $val == '0000-00-00')
{
if ($val === null)
{
$val = 'NULL';
}
$val = '<span class="null">' . $val . '</span>';
return [$val, $class];
}
else
{
$val = RL_RegEx::replace('^((.*?\n){4}).*?$', '\1...', $val);
if (strlen($val) > 300)
{
$val = substr($val, 0, 300) . '...';
}
$val = htmlentities($val, ENT_COMPAT, 'utf-8');
}
return [$val, $class];
}
$search = str_replace('||space||', ' ', $this->params->search);
$replace = str_replace('||space||', ' ', $this->params->replace);
if ($search == 'NULL')
{
if ($val == '' || $val === null || $val == '0000-00-00')
{
if ($val === null)
{
$val = 'NULL';
}
if ($val === '')
{
$val = ' ';
}
$val = '<span class="search_string"><span class="null">' . $val . '</span></span><span class="replace_string">' . $replace . '</span>';
return [$val, $class];
}
$val = RL_RegEx::replace('^((.*?\n){4}).*?$', '\1...', $val);
if (strlen($val) > 300)
{
$val = substr($val, 0, 300) . '...';
}
$val = htmlentities($val, ENT_COMPAT, 'utf-8');
return [$val, $class];
}
if ($search == '*')
{
$class = 'search_string';
if (strlen($val) > 50)
{
$val = '*';
$class .= ' no-strikethrough';
}
$val = '<span class="' . $class . '"><span class="null">' . $val . '</span></span><span class="replace_string">' . $replace . '</span>';
return [$val, $class];
}
if ($val === null)
{
$val = '<span class="null">NULL</span>';
return [$val, $class];
}
$s1 = '|' . md5('<SEARCH TAG>') . '|';
$s2 = '|' . md5('</SEARCH TAG>') . '|';
$r1 = '|' . md5('<REPLACE TAG>') . '|';
$r2 = '|' . md5('</REPLACE TAG>') . '|';
$match = 0;
$options = '';
if ($search != '')
{
$s = $search;
$s = RL_RegEx::quote($s);
// replace multiple whitespace (with at least one enter) with regex whitespace match
$s = RL_RegEx::replace('\s*\n\s*', '\s*', $s);
$options = 's';
if ( ! $this->params->case)
{
$options .= 'i';
}
$match = @RL_RegEx::match($s, $val, $m, $options);
}
if ($match)
{
$class = 'has_search';
$val = RL_RegEx::replace($s, $s1 . '\0' . $s2 . $r1 . $replace . $r2, $val, $options);
$val = htmlentities($val, ENT_COMPAT, 'utf-8');
$val = str_replace(' ', ' ', $val);
$val = str_replace($s1, '<span class="search_string">', str_replace($s2, '</span>', $val));
$val = str_replace($r1, '<span class="replace_string">', str_replace($r2, '</span>', $val));
}
else
{
$val = RL_RegEx::replace('^((.*?\n){4}).*?$', '\1...', $val);
if (strlen($val) > 300)
{
$val = substr($val, 0, 300) . '...';
}
$val = htmlentities($val, ENT_COMPAT, 'utf-8');
}
if ($val == '0000-00-00')
{
$val = '<span class="null">' . $val . '</span>';
}
return [$val, $class];
}
private function getRows($cols, $max = 100)
{
if (RL_RegEx::match('[^a-z0-9-_\#]', $this->params->table))
{
die('Invalid data found in URL!');
}
$db = JFactory::getDbo();
$table = $this->params->table;
$select_colums = $cols;
array_walk($select_colums, function (&$col, $key, $db) {
$col = $db->quoteName($col);
}, $db);
$query = $db->getQuery(true)
->select($select_colums)
->from($db->quoteName(trim($table)));
$where = $this->getWhereClause($cols);
if ( ! empty($where))
{
$query->where('(' . implode(' OR ', $where) . ')');
}
$db->setQuery($query, 0, $max);
return $db->loadObjectList();
}
private function getWhereClause($cols = [])
{
$columns = $this->params->columns;
if (empty($columns))
{
return false;
}
$s = str_replace('||space||', ' ', $this->params->search);
if (empty($s))
{
return false;
}
$likes = [];
switch ($s)
{
case 'NULL' :
$likes[] = 'IS NULL';
$likes[] = '= ""';
break;
case '*':
//$likes[] = ' != \'-something it would never be!!!-\'';
break;
default:
$dbs = $s;
$dbs = RL_RegEx::quote($dbs);
// replace multiple whitespace (with at least one enter) with regex whitespace match
$dbs = RL_RegEx::replace('\s*\n\s*', '\s*', $dbs);
// escape slashes
$dbs = str_replace('\\', '\\\\', $dbs);
// escape single quotes
$dbs = str_replace('\'', '\\\'', $dbs);
// remove the lazy character: doesn't work in mysql
$dbs = str_replace(['*?', '+?'], ['*', '+'], $dbs);
// change \s to [:space:]
$dbs = str_replace('\s', '[[:space:]]', $dbs);
$likes[] = $this->params->case
? 'RLIKE BINARY \'' . $dbs . '\''
: 'RLIKE \'' . $dbs . '\'';
break;
}
$db = JFactory::getDbo();
$columns = $this->implodeParams($columns);
$where = [];
foreach ($columns as $column)
{
foreach ($likes as $like)
{
$where[] = $db->quoteName(trim($column)) . ' ' . $like;
}
}
return $where;
}
private function getCustomWhereClause($cols = [])
{
if (empty($this->params->where))
{
return false;
}
$custom_where = trim(str_replace('WHERE ', '', trim($this->params->where)));
if (empty($custom_where))
{
return false;
}
if (empty($cols))
{
return $custom_where;
}
$cols = RL_RegEx::quote($cols);
$regex = '(^| )' . $cols . '( +(?:=|\!|IS |IN |LIKE ))';
RL_RegEx::matchAll($regex, $custom_where, $matches);
if (empty($matches))
{
return $custom_where;
}
$db = JFactory::getDbo();
foreach ($matches as $match)
{
$custom_where = str_replace(
$match[0],
$match[1] . $db->quoteName($match[2]) . $match[3],
$custom_where
);
}
return $custom_where;
}
private function implodeParams($params)
{
if (is_array($params))
{
return $params;
}
$params = explode(',', $params);
$p = [];
foreach ($params as $param)
{
if (trim($param) != '')
{
$p[] = trim($param);
}
}
return array_unique($p);
}
}