323 lines
10 KiB
PHP
Executable File
323 lines
10 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Nwdthemes\Revslider\Helper;
|
|
|
|
use \Nwdthemes\Revslider\Helper\Data;
|
|
|
|
class Query extends \Magento\Framework\App\Helper\AbstractHelper {
|
|
|
|
const ARRAY_A = 'ARRAY_A';
|
|
|
|
protected $_context;
|
|
protected $_resource;
|
|
protected $_animationFactory;
|
|
protected $_backupFactory;
|
|
protected $_cssFactory;
|
|
protected $_navigationFactory;
|
|
protected $_slideFactory;
|
|
protected $_sliderFactory;
|
|
protected $_staticSlideFactory;
|
|
|
|
public $prefix = '';
|
|
public $base_prefix = '';
|
|
public $last_error = '';
|
|
public $last_query = '';
|
|
public $insert_id = '';
|
|
public $lastRowID = '';
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
|
|
public function __construct(
|
|
\Magento\Framework\App\Helper\Context $context,
|
|
\Magento\Framework\App\ResourceConnection $resource,
|
|
\Nwdthemes\Revslider\Model\AnimationFactory $animationFactory,
|
|
\Nwdthemes\Revslider\Model\BackupFactory $backupFactory,
|
|
\Nwdthemes\Revslider\Model\CssFactory $cssFactory,
|
|
\Nwdthemes\Revslider\Model\NavigationFactory $navigationFactory,
|
|
\Nwdthemes\Revslider\Model\SlideFactory $slideFactory,
|
|
\Nwdthemes\Revslider\Model\SliderFactory $sliderFactory,
|
|
\Nwdthemes\Revslider\Model\StaticSlideFactory $staticSlideFactory
|
|
) {
|
|
$this->_context = $context;
|
|
$this->_resource = $resource;
|
|
$this->_animationFactory = $animationFactory;
|
|
$this->_backupFactory = $backupFactory;
|
|
$this->_cssFactory = $cssFactory;
|
|
$this->_navigationFactory = $navigationFactory;
|
|
$this->_slideFactory = $slideFactory;
|
|
$this->_sliderFactory = $sliderFactory;
|
|
$this->_staticSlideFactory = $staticSlideFactory;
|
|
|
|
parent::__construct($this->_context);
|
|
}
|
|
|
|
/**
|
|
* Get query results
|
|
*
|
|
* @param string Query
|
|
* @param string Result format
|
|
* @return array
|
|
*/
|
|
public function get_results($query, $mode = self::ARRAY_A) {
|
|
|
|
$queryArray = explode('FROM', $query);
|
|
if (count($queryArray) < 2) {
|
|
die();
|
|
}
|
|
$queryArray = explode('WHERE', $queryArray[1]);
|
|
$table = trim($queryArray[0]);
|
|
$collection = $this->getFactory($table)->create()->getCollection();
|
|
|
|
$where = isset($queryArray[1]) ? trim($queryArray[1]) : '';
|
|
|
|
if (strpos($where, 'ORDER BY') !== false) {
|
|
$whereArray = explode('ORDER BY', $where);
|
|
$where = trim($whereArray[0]);
|
|
$orderArray = explode(' ', trim($whereArray[1]));
|
|
$orderBy = trim($orderArray[0], '"\' ');
|
|
$orderDir = isset($orderArray[1]) ? trim($orderArray[1], '"\' ') : 'ASC';
|
|
}
|
|
|
|
if ($where) {
|
|
if (strpos($where, ' IN(') !== false) {
|
|
list($field, $value) = explode(' IN(', $where);
|
|
$condition = ['in' => explode(',', trim($value, '"\' )'))];
|
|
} elseif (strpos($where, '!=') === false) {
|
|
list($field, $value) = explode('=', $where);
|
|
$condition = trim($value, '"\' ');
|
|
} else {
|
|
list($field, $value) = explode('!=', $where);
|
|
$condition = ['neq' => trim($value, '"\' ')];
|
|
}
|
|
if (isset($field)) {
|
|
$collection->addFieldToFilter(trim($field, '`"\' '), $condition);
|
|
}
|
|
}
|
|
|
|
if ( ! empty($orderBy)) {
|
|
$collection->setOrder($orderBy, $orderDir);
|
|
}
|
|
|
|
$response = array();
|
|
foreach ($collection as $_item) {
|
|
$response[] = $_item->getData();
|
|
}
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* Get query row
|
|
*
|
|
* @param string Query
|
|
* @param string Result format
|
|
* @return array
|
|
*/
|
|
public function get_row($query, $mode = '') {
|
|
$query = $this->_convertTableNames($query);
|
|
$readConnection = $this->_resource->getConnection('core_read');
|
|
$result = $readConnection->fetchRow($query);
|
|
return $mode == self::ARRAY_A ? $result : (object) $result;
|
|
}
|
|
|
|
/**
|
|
* Insert row
|
|
*
|
|
* @param string Table name
|
|
* @param array Data
|
|
* @return int
|
|
*/
|
|
|
|
public function insert($table, $data = array()) {
|
|
$model = $this->getFactory($table)->create();
|
|
$model->setData($data);
|
|
try {
|
|
$model->save();
|
|
} catch (\Exception $e) {
|
|
Data::logException($e);
|
|
$this->throwError($e->getMessage());
|
|
}
|
|
$this->lastRowID = $model->getId();
|
|
$this->insert_id = $this->lastRowID;
|
|
return $this->lastRowID;
|
|
}
|
|
|
|
/**
|
|
* Update row
|
|
*
|
|
* @param string Table name
|
|
* @param array Data
|
|
* @param array Where
|
|
*/
|
|
|
|
public function update($table, $data = array(), $where = false) {
|
|
if (is_array($where) && $where) {
|
|
$collection = $this->getFactory($table)->create()->getCollection();
|
|
foreach ($where as $_field => $_value) {
|
|
$collection->addFieldToFilter($_field, $_value);
|
|
}
|
|
$item = $collection->getFirstItem();
|
|
try {
|
|
$item
|
|
->addData($data)
|
|
->setId( $item->getId() )
|
|
->save();
|
|
} catch (\Exception $e) {
|
|
Data::logException($e);
|
|
$this->throwError($e->getMessage());
|
|
}
|
|
} else {
|
|
$this->throwError('No id provided.');
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Delete row
|
|
*
|
|
* @param string Table name
|
|
* @param array Data
|
|
* @param array Where
|
|
*/
|
|
|
|
public function delete($table, $where) {
|
|
if ( ! $table) {
|
|
$this->throwError(__('Table name should not be empty.'));
|
|
}
|
|
if ( ! $where) {
|
|
$this->throwError(__('Where should not be empty.'));
|
|
}
|
|
$collection = $this->getFactory($table)->create()->getCollection();
|
|
foreach ($where as $field => $value) {
|
|
$collection->addFieldToFilter($field, $value);
|
|
}
|
|
foreach ($collection as $_item) {
|
|
$_item->delete();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Prepare query
|
|
*
|
|
* @param string Query
|
|
* @param mixed Args
|
|
* @return array
|
|
*/
|
|
public function prepare($query, $args) {
|
|
$args = func_get_args();
|
|
array_shift( $args );
|
|
// If args were passed as an array (as in vsprintf), move them up
|
|
if ( isset( $args[0] ) && is_array($args[0]) )
|
|
$args = $args[0];
|
|
$query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
|
|
$query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
|
|
$query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
|
|
$query = preg_replace( '|(?<!%)%s|', "%s", $query ); // quote the strings, avoiding escaped strings like %%s
|
|
array_walk( $args, array( $this, 'escape_by_ref' ) );
|
|
return @vsprintf( $query, $args );
|
|
}
|
|
|
|
public function escape_by_ref(&$arg) {
|
|
if( (string)(int)$arg != $arg) $arg = $this->_resource->getConnection('core_write')->quote($arg);
|
|
}
|
|
|
|
/**
|
|
* Run sql query
|
|
*
|
|
* param string Query
|
|
*/
|
|
|
|
public function query($query) {
|
|
$query = $this->_convertTableNames($query);
|
|
$writeConnection = $this->_resource->getConnection('core_write');
|
|
$result = $writeConnection->query($query);
|
|
$this->insert_id = $writeConnection->lastInsertId();
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Get results of SQL query
|
|
*
|
|
* @param string $query
|
|
* @return array
|
|
*/
|
|
public function get_query_results($query) {
|
|
return $this->query($query)->fetchAll();
|
|
}
|
|
|
|
/**
|
|
* Run sql query and get result variable
|
|
*
|
|
* param string Query
|
|
* return var
|
|
*/
|
|
|
|
public function get_var($query) {
|
|
$query = $this->_convertTableNames($query);
|
|
$readConnection = $this->_resource->getConnection('core_read');
|
|
return $readConnection->fetchOne($query);
|
|
}
|
|
|
|
/**
|
|
* Generate DB alter query by difference
|
|
*
|
|
* @param string Query
|
|
* @param boolean Is Execute
|
|
* @return string
|
|
*/
|
|
|
|
public function dbDelta($sql, $isExecute = true) {
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Get model factory by name
|
|
*
|
|
* @param string Name
|
|
* @return object
|
|
*/
|
|
|
|
public function getFactory($name) {
|
|
switch ($name) {
|
|
case 'nwdthemes_revslider_animations' :
|
|
$factory = $this->_animationFactory;
|
|
break;
|
|
case 'nwdthemes_revslider_backup' :
|
|
$factory = $this->_backupFactory;
|
|
break;
|
|
case 'nwdthemes_revslider_css' :
|
|
$factory = $this->_cssFactory;
|
|
break;
|
|
case 'nwdthemes_revslider_navigations' :
|
|
$factory = $this->_navigationFactory;
|
|
break;
|
|
case 'nwdthemes_revslider_slides' :
|
|
$factory = $this->_slideFactory;
|
|
break;
|
|
case 'nwdthemes_revslider_sliders' :
|
|
$factory = $this->_sliderFactory;
|
|
break;
|
|
case 'nwdthemes_revslider_static_slides' :
|
|
$factory = $this->_staticSlideFactory;
|
|
break;
|
|
}
|
|
return $factory;
|
|
}
|
|
|
|
/**
|
|
* Convert table names in query
|
|
*
|
|
* @param string $query
|
|
* @return string
|
|
*/
|
|
protected function _convertTableNames($query) {
|
|
preg_match('#\b(nwdthemes_revslider_\w+)\b#', $query, $modelNames);
|
|
$modelNames = array_unique($modelNames);
|
|
foreach ($modelNames as $modelName) {
|
|
$query = str_replace($modelName, $this->_resource->getTableName($modelName), $query);
|
|
}
|
|
return $query;
|
|
}
|
|
|
|
} |