File "table.php"
Full Path: /home/vantageo/public_html/cache/cache/cache/cache/cache/.wp-cli/wp-content/plugins/woo-product-filter/classes/table.php
File size: 14.38 KB
MIME-type: text/x-php
Charset: utf-8
<?php
abstract class TableWpf {
/**
* ID column name
*/
protected $_id ='';
/**
* Table name
*/
protected $_table = '';
/**
* Array to store there fields for table
*/
protected $_fields = array();
/**
* Alias for this table, make shure that it ia unique
*/
protected $_alias = '';
/**
* Table to be joined
*/
protected $_join = array();
/**
* Limit
*/
protected $_limit = '';
/**
* Order BY
*/
protected $_order = '';
/**
* Group BY
*/
protected $_group = '';
/**
* Table errors data
*/
protected $_errors = array();
/**
* Escape data before action
*/
protected $_escape = false;
protected $_limitFrom = '';
protected $_limitTo = '';
public static function getInstance( $table = '' ) {
static $instances = array();
if (!$table) {
throw new Exception('Unknown table [' . $table . ']');
}
if (!isset($instances[$table])) {
$class = 'table' . strFirstUpWpf($table) . strFirstUpWpf(WPF_CODE);
if (class_exists($class)) {
$instances[$table] = new $class();
} else {
$instances[$table] = null;
}
}
return $instances[$table];
}
public function setEscape( $f ) {
$this->_escape = true;
}
public static function _( $table = '' ) {
return self::getInstance($table);
}
public function innerJoin( $table, $on ) {
$this->_join[] = 'INNER JOIN ' . $table->getTable() . ' ' . $table->alias() . ' ON ' . $table->alias() . '.' . $table->getID() . ' = ' . $this->_alias . '.' . $on;
return $this;
}
public function leftJoin( $table, $on ) {
if ($this->haveField($on)) {
$this->_join[] = 'LEFT JOIN ' . $table->getTable() . ' ' . $table->alias() . ' ON ' . $table->alias() . '.' . $table->getID() . ' = ' . $this->_alias . '.' . $on;
} else {
$this->_join[] = 'LEFT JOIN ' . $table->getTable() . ' ' . $table->alias() . ' ON ' . $table->alias() . '.' . $on . ' = ' . $this->_alias . '.' . $this->getID();
}
return $this;
}
public function arbitraryJoin( $join ) {
$this->_join[] = $join;
}
public function haveField( $field ) {
return isset($this->_fields[$field]);
}
public function addJoin( $params = array('tbl' => '', 'a' => '', 'on' => '', 'joinOnID' => true, 'joinOn' => '') ) {
$params['joinOnID'] = isset($params['joinOnID']) ? $params['joinOnID'] : true;
$params['joinOn'] = ( $params['joinOnID'] && !isset($params['joinOn']) ) ? $this->_id : $params['joinOn'];
$this->_join[] = 'INNER JOIN ' . $params['tbl'] . ' ' . $params['a'] . ' ON ' . $params['a'] . '.' . $params['on'] . ' = ' . $this->_alias . '.' . $params['joinOn'];
return $this;
}
public function fillFromDB( $id = 0, $where = '' ) {
$res = $this;
if ($id) {
$data = $this->getById($id);
} elseif ($where) {
$data = $this->get('*', $where);
} else {
$data = $this->getAll();
}
if ($data) {
if ($id) {
foreach ($data as $k => $v) {
if (isset($this->_fields[$k])) {
$this->_fields[$k]->setValue($v, true);
}
}
} else {
$res = array();
foreach ($data as $field) {
$row = array();
foreach ($field as $k => $v) {
if (isset($this->_fields[$k])) {
$row[$k] = toeCreateObjWpf('FieldWpf', array(
$this->_fields[$k]->name,
$this->_fields[$k]->html,
$this->_fields[$k]->type,
$this->_fields[$k]->default,
$this->_fields[$k]->label,
$this->_fields[$k]->maxlen,
$this->_fields[$k]->description
));
$row[$k]->setValue($v, true);
}
}
if (!empty($row)) {
$res[] = $row;
}
}
}
}
return $res;
}
/**
* Return table name
*
* @param bool $transform need to transform to standard WP tables view or not
* @return string table name
*/
public function getTable( $transform = false ) {
if ($transform) {
return DbWpf::prepareQuery($this->_table);
} else {
return $this->_table;
}
}
public function setTable( $table ) {
$this->_table = $table;
}
/**
* Get name of ID column
*
* @return string name of ID column
*/
public function getID() {
return $this->_id;
}
public function setID( $id ) {
$this->_id = $id;
}
public function getAll( $fields = '*' ) {
return $this->get($fields);
}
public function getById( $id, $fields = '*', $return = 'row' ) {
$condition = 'WHERE ' . $this->_alias . '.' . $this->_id . ' = "' . ( (int) $id ) . '"';
return $this->get($fields, $condition, null, $return);
}
protected function _addJoin() {
$res = '';
if (!empty($this->_join)) {
$res = ' ' . implode(' ', $this->_join);
$this->_join = array();
}
return $res;
}
/**
* Add LIMIT to SQL
*/
public function limit( $limit = '' ) {
if (is_numeric($limit)) {
$this->_limit = $limit;
} else {
$this->_limit = '';
}
return $this;
}
public function setLimit( $limit = '' ) {
$this->_limit = $limit;
return $this;
}
public function limitFrom( $limit = '' ) {
if (is_numeric($limit)) {
$this->_limitFrom = (int) $limit;
}
return $this;
}
public function limitTo( $limit = '' ) {
if (is_numeric($limit)) {
$this->_limitTo = (int) $limit;
}
return $this;
}
/**
* Add ORDER BY to SQL
*
* @param mixed $fields
*/
public function orderBy( $fields ) {
if (is_array($fields)) {
$order = implode(',', $fields);
} elseif ('' != $fields) {
$order = $fields;
}
$this->_order = $order;
return $this;
}
/**
* Add GROUP BY to SQL
*
* @param mixed $fields
*/
public function groupBy( $fields ) {
if (is_array($fields)) {
$group = implode(',', $fields);
} elseif ('' != $fields) {
$group = $fields;
}
$this->_group = $group;
return $this;
}
public function get( $fields = '*', $where = '', $tables = '', $return = 'all' ) {
if (!$tables) {
$tables = $this->_table . ' ' . $this->_alias;
}
if (strpos($this->_alias, $fields)) {
$fields = $this->_alias . '.' . $fields;
}
$query = 'SELECT ' . $fields . ' FROM ' . $tables;
$query .= $this->_addJoin();
if ($where) {
$where = trim($this->_getQueryString($where, 'AND'));
if (!empty($where)) {
if (!preg_match('/^WHERE/i', $where)) {
$where = 'WHERE ' . $where;
}
$query .= ' ' . $where;
}
}
if ('' != $this->_group) {
$query .= ' GROUP BY ' . $this->_group;
$this->_group = '';
}
if ('' != $this->_order) {
$query .= ' ORDER BY ' . $this->_order;
$this->_order = '';
}
if ('' != $this->_limit) {
if (is_numeric($this->_limit)) {
$query .= ' LIMIT 0,' . $this->_limit;
} else {
$query .= ' LIMIT ' . $this->_limit;
}
$this->_limit = '';
} elseif ( ( '' !== $this->_limitFrom ) && ( '' !== $this->_limitTo ) ) {
$query .= ' LIMIT ' . $this->_limitFrom . ',' . $this->_limitTo;
$this->_limitFrom = '';
$this->_limitTo = '';
}
return DbWpf::get($query, $return);
}
public function store( $data, $method = 'INSERT', $where = '' ) {
$this->_clearErrors();
$method = strtoupper($method);
if ($this->_escape) {
$data = DbWpf::escape($data);
}
$query = '';
switch ($method) {
case 'INSERT':
$query = 'INSERT INTO ';
if (isset($data[$this->_id]) && empty($data[$this->_id])) {
unset($data[$this->_id]);
}
break;
case 'UPDATE':
$query = 'UPDATE ';
break;
}
$fields = $this->_getQueryString($data, ',', true);
if (empty($fields)) {
$this->_addError(esc_html__('Nothing to update', 'woo-product-filter'));
return false;
}
$query .= $this->_table . ' SET ' . $fields;
if (!empty($this->_errors)) {
return false;
}
if ( ( 'UPDATE' == $method ) && !empty($where) ) {
$query .= ' WHERE ' . $this->_getQueryString($where, 'AND');
}
if (DbWpf::query($query)) {
if ('INSERT' == $method) {
return DbWpf::lastID();
} else {
return true;
}
} else {
$this->_addError(WPF_TEST_MODE ? DbWpf::getError() : esc_html__('Database error. Please contact your developer.', 'woo-product-filter'));
}
return false;
}
public function insert( $data ) {
return $this->store($data);
}
public function update( $data, $where ) {
if (is_numeric($where)) {
$where = array($this->_id => $where);
}
return $this->store($data, 'UPDATE', $where);
}
public function alias( $alias = null ) {
if (!is_null($alias)) {
$this->_alias = $alias;
}
return $this->_alias;
}
/**
* Delete record(s)
*
* @param mixed $where condition to use in query, if numeric givven - use delete by ID column
* @return query result
*/
public function delete( $where = '' ) {
if ($where) {
$q = 'DELETE FROM ' . $this->_table;
if (is_numeric($where)) {
$where = array($this->_id => $where);
}
$q .= ' WHERE ' . $this->_getQueryString($where, 'AND');
} else {
$q = 'TRUNCATE TABLE ' . $this->_table;
}
return DbWpf::query($q);
}
/**
* Convert to database query
*
* @param mixed $data if array given - convert it into string where key - is column name, value - database value to set;
* if key == "additionalCondition" then we will just add value to string
* if string givven - just return it without changes
* @param string $delim delimiter to use in query, recommended - ',', 'AND', 'OR'
* @return string query string
*/
public function _getQueryString( $data, $delim = ',', $validate = false ) {
$res = '';
if (is_array($data) && !empty($data)) {
foreach ($data as $k => $v) {
if (array_key_exists($k, $this->_fields) || $k == $this->_id) {
$val = $v;
if (isset($this->_fields[$k]) && $this->_fields[$k]->adapt['dbTo']) {
$val = FieldAdapterWpf::_($val, $this->_fields[$k]->adapt['dbTo'], FieldAdapterWpf::DB);
}
if ($validate) {
if (isset($this->_fields[$k]) && is_object($this->_fields[$k])) {
$objForValidation = clone $this->_fields[$k];
$objForValidation->setValue($val);
$errors = ValidatorWpf::_($objForValidation);
if ($errors) {
$this->_addError($errors);
}
}
}
if (isset($this->_fields[$k])) {
switch ($this->_fields[$k]->type) {
case 'int':
case 'tinyint':
$res .= $k . ' = ' . ( (int) $val ) . ' ' . $delim . ' ';
break;
case 'float':
$res .= $k . ' = ' . ( (float) $val ) . ' ' . $delim . ' ';
break;
case 'decimal':
$res .= $k . ' = ' . ( (float) $val ) . ' ' . $delim . ' ';
break;
case 'free': //Just set it as it is
$res .= $k . ' = ' . $val . ' ' . $delim . ' ';
break;
default:
$res .= $k . ' = \'' . $val . '\' ' . $delim . ' ';
break;
}
} else {
$res .= $k . ' = \'' . $val . '\' ' . $delim . ' ';
}
} elseif ('additionalCondition' == $k) { //just add some string to query
$res .= $v . ' ' . $delim . ' ';
}
}
$res = substr($res, 0, -( strlen($delim) + 1 ));
} elseif (is_string($data)) {
$res = $data;
}
return $res;
}
/**
* Add new FieldWpfWpf for children table (@see class field)
*
* @param string $name name of a field
* @param string $html html type of field (text, textarea, etc. @see html class)
* @param string $type database type (int, varcahr, etc.)
* @param mixed $default default value for this field
* @return object $this - pointer to current object
*/
protected function _addField( $name, $html = 'text', $type = 'other', $default = '', $label = '', $maxlen = 0, $dbAdapt = '', $htmlAdapt = '', $description = '' ) {
$this->_fields[$name] = toeCreateObjWpf('FieldWpf', array($name, $html, $type, $default, $label, $maxlen, $dbAdapt, $htmlAdapt, $description));
return $this;
}
/**
* Public alias for _addField() method
*/
public function addField() {
$args = func_get_args();
return call_user_func_array(array($this, '_addField'), $args);
}
public function getFields() {
return $this->_fields;
}
public function getField( $name ) {
return $this->_fields[$name];
}
public function exists( $value, $field = '' ) {
if (!$field) {
$field = $this->_id;
}
return DbWpf::get('SELECT ' . $this->_id . ' FROM ' . $this->_table . ' WHERE ' . $field . ' = "' . $value . '"', 'one');
}
protected function _addError( $error ) {
if (is_array($error)) {
$this->_errors = array_merge($this->_errors, $error);
} else {
$this->_errors[] = $error;
}
}
public function getErrors() {
return $this->_errors;
}
protected function _clearErrors() {
$this->_errors = array();
}
/**
* Prepare data before send it to database
*/
public function prepareInput( $d = array() ) {
$ignore = isset($d['ignore']) ? $d['ignore'] : array();
foreach ($this->_fields as $key => $f) {
if ('tinyint' == $f->type) {
if ('true' == $d[$key]) {
$d[$key] = 1;
}
if (empty($d[$key]) && !in_array($key, $ignore)) {
$d[$key] = 0;
}
}
if ('date' == $f->type) {
if (empty($d[$key]) && !in_array($key, $ignore)) {
$d[$key] = '0000-00-00';
} elseif (!empty($d[$key])) {
$d[$key] = DbWpf::timeToDate($d[$key]);
}
}
}
$d[$this->_id] = isset($d[$this->_id]) ? intval($d[$this->_id]) : 0;
return $d;
}
/**
* Prepare data after extracting it from database
*/
public function prepareOutput( $d = array()) {
$ignore = isset($d['ignore']) ? $d['ignore'] : array();
foreach ($this->_fields as $key => $f) {
switch ($f->type) {
case 'date':
if ('0000-00-00' == $d[$key] || empty($d[$key])) {
$d[$key] = '';
} else {
$d[$key] = gmdate(WPF_DATE_FORMAT, DbWpf::dateToTime($d[$key]));
}
break;
case 'int':
case 'tinyint':
if ('true' == $d[$key]) {
$d[$key] = 1;
}
if ('false' == $d[$key]) {
$d[$key] = 0;
}
$d[$key] = (int) $d[$key];
break;
}
}
$d[$this->_id] = isset($d[$this->_id]) ? intval($d[$this->_id]) : 0;
return $d;
}
public function install( $d = array() ) {
}
public function uninstall( $d = array() ) {
}
public function activate() {
}
public function getLastInsertID() {
return DbWpf::get('SELECT MAX(' . $this->_id . ') FROM ' . $this->_table, 'one');
}
public function adaptHtml( $val ) {
return htmlspecialchars($val, ENT_COMPAT);
}
}