Files
2022-06-30 05:46:02 -04:00

1055 lines
24 KiB
PHP
Executable File

<?php defined('BASEPATH') OR exit('No direct script access allowed');
include_once dirname(__FILE__) . '/Mapping.php';
/*Powered By: Manaknightdigital Inc. https://manaknightdigital.com/ Year: 2021*/
/**
* Abstract Model
*
* @copyright 2019 Manaknightdigital Inc.
* @link https://manaknightdigital.com
* @license Proprietary Software licensing
* @author Ryan Wong
*/
class Manaknight_Model extends CI_Model
{
protected $_mapping;
protected $_table = '';
protected $_primary_key = 'id';
protected $_return_type = 'array';
protected $_allowed_fields = [];
protected $_label_fields = [];
protected $_use_timestamps = FALSE;
protected $_created_field = 'created_at';
protected $_updated_field = 'updated_at';
protected $_validation_rules = [];
protected $_validation_messages = [];
public function __construct()
{
parent::__construct();
$this->_mapping = new Mapping();
}
/**
* Get Mapping Delegate
*
* @return mixed
*/
public function get_mapping()
{
return $this->_mapping;
}
/**
* Raw Mysql query
*
* @param string $sql
* @return mixed
*/
public function raw_query($sql)
{
return $this->db->query($sql);
}
/**
* Raw no error query for writes
*
* @param string $sql
* @return mixed
*/
public function raw_no_error_query($sql)
{
return $this->db->simple_query($sql);
}
/**
* Raw Mysql query
*
* @param string $sql
* @return mixed
*/
public function raw_prepare_query($sql, $parameters)
{
return $this->db->query($sql, $parameters);
}
/**
* Get Model
*
* @param integer $id
* @return mixed
*/
public function get($id)
{
$this->db->from($this->_table);
$this->db->where($this->_primary_key, $id, TRUE);
return $this->db->get()->row();
}
/**
* Get Model by field
*
* @param string $field
* @param mixed $value
* @return mixed
*/
public function get_by_field($field, $value)
{
$this->db->from($this->_table);
$this->db->where($this->clean_alpha_field($field), $value, TRUE);
return $this->db->get()->row();
}
/**
* Get Model by fields
*
* @param string $field
* @param mixed $value
* @return mixed
*/
public function get_by_fields($where)
{
$this->db->from($this->_table);
if (!empty($where))
{
foreach($where as $field => $value)
{
if (is_numeric($field) && strlen($value) > 0)
{
$this->db->where($value);
continue;
}
if ($value === NULL)
{
continue;
}
if ($value !== NULL)
{
$this->db->where($this->clean_alpha_field($field), $value, TRUE);
}
}
}
return $this->db->get()->row();
}
public function update($table,$set,$where)
{
return $this->db->set($set)->where($where)->update($table);
}
/**
* Get all Model
*
* @return array
*/
public function get_all($where = array())
{
$this->db->from($this->_table);
foreach($where as $field => $value)
{
if (is_numeric($field) && strlen($value) > 0)
{
$this->db->where($value);
continue;
}
if ($field === NULL && $value === NULL)
{
continue;
}
if ($value !== NULL)
{
$this->db->where($this->clean_alpha_field($field), $value, TRUE);
}
}
return $this->db->get()->result();
}
/**
* Get all Model
*
* @return array
*/
public function get_all_by_status($status)
{
$this->db->from($this->_table);
$this->db->where('status', $status, TRUE);
return $this->db->get()->result();
}
/**
* Get all Model key value
*
* @return array
*/
public function get_all_by_key_value($field, $status)
{
$this->db->from($this->_table);
$this->db->where('status', $status, TRUE);
$data = [];
$results = $this->db->get()->result();
foreach ($results as $key => $value)
{
$data[$value->id] = $value->{$field};
}
return $data;
}
/**
* Create
*
* @param array $data
* @return mixed
*/
public function create($data)
{
if ($this->_use_timestamps)
{
if (!isset($data[$this->_created_field]))
{
$data[$this->_created_field] = date('Y-m-j');
}
if (!isset($data[$this->_updated_field]))
{
$data[$this->_updated_field] = date('Y-m-j H:i:s');
}
}
$data = $this->_pre_create_processing($data);
$inserted_row = $this->db->insert($this->_table, $this->_filter_allow_keys($data), TRUE);
if ($inserted_row)
{
return $this->db->insert_id();
}
return FALSE;
}
/**
* Duplicate
*
* @param array $data
* @return mixed
*/
public function duplicate($where, $id)
{
$row = $this->get($id);
if (!$row)
{
return FALSE;
}
$data = json_decode(json_encode($row), true);
if ($this->_use_timestamps)
{
if (!isset($data[$this->_created_field]))
{
$data[$this->_created_field] = date('Y-m-j');
}
if (!isset($data[$this->_updated_field]))
{
$data[$this->_updated_field] = date('Y-m-j H:i:s');
}
}
unset($data['id']);
$data = $this->_pre_create_processing($data);
foreach ($where as $key => $value)
{
$data[$key] = $value;
}
$inserted_row = $this->db->insert($this->_table, $this->_filter_allow_keys($data), TRUE);
if ($inserted_row)
{
return $this->db->insert_id();
}
return FALSE;
}
/**
* Bulk Create
*
* @param [type] $params
* @return void
*/
public function batch_insert($params)
{
if ($this->_use_timestamps)
{
foreach ($params as $key => $value)
{
$params[$key][$this->_created_field] = date('Y-m-j');
$params[$key][$this->_updated_field] = date('Y-m-j H:i:s');
}
}
return $this->db->insert_batch($this->_table, $params);
}
/**
* Edit {{{upper_case_model}}}
* @param array $data
* @param integer $id
* @return bool
*/
public function edit($data, $id)
{
if ($this->_use_timestamps)
{
if (!isset($data[$this->_updated_field]))
{
$data[$this->_updated_field] = date('Y-m-j H:i:s');
}
}
$data = $this->_post_edit_processing($data);
$this->db->where($this->_primary_key, $id, TRUE);
return $this->db->update($this->_table, $this->_filter_allow_keys($data));
}
/**
* Edit {{{upper_case_model}}}
* @param array $data
* @param integer $id
* @return bool
*/
public function edit_raw($data, $id)
{
if ($this->_use_timestamps)
{
$data[$this->_updated_field] = date('Y-m-j H:i:s');
}
$this->db->where($this->_primary_key, $id, TRUE);
return $this->db->update($this->_table, $this->_filter_allow_keys($data));
}
/**
* Soft Delete Model
* @param array $data
* @param integer $id
* @return bool
*/
public function delete($id)
{
$data = [];
if ($this->_use_timestamps)
{
$data[$this->_updated_field] = date('Y-m-j H:i:s');
$data['status'] = 0;
}
$this->db->where($this->_primary_key, $id, TRUE);
return $this->db->update($this->_table, $this->_filter_allow_keys($data));
}
/**
* Real Delete Model
* @param integer $id
* @return bool
*/
public function real_delete($id)
{
return $this->db->delete($this->_table, ['id' => $id]);
}
/**
* Real Delete Model
* @param integer $id
* @return bool
*/
public function real_delete_by_fields($where=[])
{
$payload = [];
if (!empty($where))
{
foreach($where as $field => $value)
{
if (is_numeric($field) && strlen($value) > 0)
{
$payload[] = $value;
continue;
}
if ($value === null)
{
continue;
}
if ($value !== NULL)
{
$payload[$field] = $value;
}
}
}
return $this->db->delete($this->_table, $payload);
}
/**
* Real Delete Model
* @param integer $id
* @return bool
*/
public function real_delete_all()
{
return $this->db->truncate($this->_table);
}
/**
* Debug json Model to error_log and turn off in production
*
* @param mixed $data
* @return void
*/
public function dj($key, $data)
{
if (ENVIRONMENT == 'development') {
error_log($key . ' MODEL : ' . json_encode($data));
}
}
/**
* Debug Model to error_log and turn off in production
*
* @param mixed $data
* @return void
*/
public function dl($key, $data)
{
if (ENVIRONMENT == 'development') {
error_log($key . ' MODEL: ' . '<pre>' . print_r($data, TRUE) . '</pre>');
}
}
/**
* Get All Validation Rules
*
* @param string $key
* @return array
*/
public function get_all_validation_rule ()
{
return $this->_validation_rules;
}
/**
* Get All Edit Validation Rules
*
* @param string $key
* @return array
*/
public function get_all_edit_validation_rule ()
{
return $this->_validation_edit_rules;
}
/**
* Fill validation rules
*
* @param mixed $form_validation
* @param mixed $validation_rules
* @return void
*/
public function set_form_validation($form_validation, $validation_rules)
{
$rules = $validation_rules;
$messages = $this->_validation_messages;
foreach ($rules as $key => $value)
{
$error_object = [];
if (array_key_exists($key, $messages))
{
$error_object = $messages[$key];
}
$form_validation->set_rules($value[0], $value[1], $value[2], $error_object);
}
return $form_validation;
}
/**
* Count number of model
*
* @access public
* @param mixed $parameters
* @return integer $result
*/
public function count($parameters)
{
if (!empty($parameters))
{
foreach ($parameters as $key => $value)
{
if (is_numeric($key) && strlen($value) > 0)
{
$this->db->where($value);
continue;
}
if ($key === NULL && $value === NULL)
{
continue;
}
if (!is_null($value))
{
if(is_numeric($value))
{
$this->db->where($key, $value);
continue;
}
if(is_string($value))
{
$this->db->like($key, $value);
continue;
}
$this->db->where($key, $value);
}
}
}
$this->_custom_counting_conditions($this->db);
$this->db->from($this->_table);
return $this->db->count_all_results();
}
/**
* Get paginated model
*
* @access public
* @param integer $page default 0
* @param integer $limit default 10
* @return array
*/
public function get_paginated($page = 0, $limit=10, $where=[], $order_by='', $direction='ASC')
{
$this->db->limit($limit, $page);
if ($order_by === '')
{
$order_by = $this->_primary_key;
}
$this->db->order_by($this->clean_alpha_num_field($order_by), $this->clean_alpha_field($direction));
if (!empty($where))
{
foreach($where as $field => $value)
{
if (is_numeric($field) && strlen($value) > 0)
{
$this->db->where($value);
continue;
}
if ($field === NULL && $value === NULL)
{
continue;
}
if ($value !== NULL)
{
if(is_numeric($value))
{
$this->db->where($field, $value);
continue;
}
if(is_string($value))
{
$this->db->like($field, $value);
continue;
}
$this->db->where($field, $value);
}
}
}
$query = $this->db->get($this->_table);
$result = [];
if ($query->num_rows() > 0)
{
foreach ($query->result() as $row)
{
$result[] = $row;
}
}
return $result;
}
public function _join ($table, $field, $where, $custom_duplicate_names=[])
{
$select_statement = '`a`.id as a_id, `b`.id as b_id,' ;
$duplicate_names = [
// 'status',
// 'created_at',
// 'updated_at',
// 'type',
// 'image',
// 'data',
// 'slug',
// 'description',
// 'amount',
// 'subtotal',
// 'total',
// 'lat',
// 'lng',
// 'address',
// 'state',
// 'country',
// 'city',
// 'order'
];
if (count($custom_duplicate_names) > 0)
{
$duplicate_names = $custom_duplicate_names;
}
foreach ($this->_allowed_fields as $key => $value)
{
if (in_array($value, $duplicate_names))
{
$select_statement .= "`a`.{$value} as a_{$value}, `b`.{$value} as b_{$value}," ;
}
}
$this->db->select($select_statement . ' `a`.*, `b`.*');
$this->db->from($this->_table . ' a');
$this->db->join($table . ' b', "a.{$field} = b.id");
if (!empty($where))
{
foreach ($where as $key => $value)
{
$this->db->where($key, $value);
}
}
$result = [];
$query = $this->db->get();
foreach ($query->result() as $row)
{
$result[] = $row;
}
return $result;
}
public function _join_paginate ($table, $field, $where, $page = 0, $limit = 10, $order_by='', $direction='ASC', $custom_duplicate_names=[])
{
$select_statement = '`a`.id as a_id, `b`.id as b_id,' ;
$duplicate_names = [
// 'status',
// 'created_at',
// 'updated_at',
// 'type',
// 'image',
// 'data',
// 'slug',
// 'description',
// 'amount',
// 'subtotal',
// 'total',
// 'lat',
// 'lng',
// 'address',
// 'state',
// 'country',
// 'city',
// 'order'
];
if (count($custom_duplicate_names) > 0)
{
$duplicate_names = $custom_duplicate_names;
}
foreach ($this->_allowed_fields as $key => $value)
{
if (in_array($value, $duplicate_names))
{
$select_statement .= "`a`.{$value} as a_{$value}, `b`.{$value} as b_{$value}," ;
}
}
$this->db->select($select_statement . ' `a`.*, `b`.*');
$this->db->from($this->_table . ' a');
$this->db->join($table . ' b', "a.{$field} = b.id");
if (!empty($where))
{
foreach ($where as $key => $value)
{
if ($value === NULL)
{
continue;
}
if (is_numeric($key) && strlen($value) < 1)
{
$this->db->where($value);
continue;
}
if (is_numeric($key) && strlen($value) > 1)
{
$this->db->where($value);
continue;
}
if ($value !== NULL)
{
$this->db->where($key, $value);
}
}
}
$result = [];
$this->db->limit($limit, $page);
if ($order_by === '')
{
$order_by = 'a_id';
}
$this->db->order_by($this->clean_alpha_num_field($order_by), $this->clean_alpha_field($direction));
$query = $this->db->get();
foreach ($query->result() as $row)
{
$result[] = $row;
}
return $result;
}
/**
* Filter all keys before inserting to make sure they are allowed
*
* @param mixed $data
* @return mixed
*/
protected function _filter_allow_keys ($data)
{
$clean_data = [];
$allowed_fields = $this->_allowed_fields;
$allowed_fields[] = $this->_primary_key;
if($this->_use_timestamps)
{
$allowed_fields[] = $this->_created_field;
$allowed_fields[] = $this->_updated_field;
}
foreach ($data as $key => $val)
{
if (!in_array($key, $allowed_fields))
{
continue;
}
$clean_data[$key] = $val;
}
return $clean_data;
}
/**
* If you need to modify payload before create, overload this function
*
* @param mixed $data
* @return mixed
*/
protected function _pre_create_processing($data)
{
return $data;
}
/**
* If you need to modify payload before edit, overload this function
*
* @param mixed $data
* @return mixed
*/
protected function _post_edit_processing($data)
{
return $data;
}
/**
* Allow user to add extra counting condition so user don't have to change main function
*
* @param mixed $parameters
* @return $db
*/
protected function _custom_counting_conditions(&$db)
{
return $this->db;
}
/**
* Escape data
*
* @param mixed $data
* @return mixed
*/
public function escape ($data)
{
return $this->db->escape($data);
}
/**
* escapeLikeString data
*
* @param mixed $data
* @return mixed
*/
public function escapeLikeString ($data)
{
return $this->db->escapeLikeString($data);
}
/**
* Get Last ID in table
*
* @return integer
*/
public function get_last_id()
{
$last = $this->db->order_by('id','desc')
->limit(1)
->get($this->_table)
->row();
if ($last)
{
return (int)$last->id;
}
return FALSE;
}
/**
* Get Database Table Schema
*
* @return mixed
*/
public function get_schema()
{
return $this->db->field_data($this->_table);
}
/**
* Get Type Mapping
*
* @param string $text
* @param string $database_expected_field
* @return boolean
*/
public function verify_field_type ($text, $database_expected_field)
{
$type_mapping = [
'string' => ['varchar', 'text', 'char', 'tinytext','mediumtext','longtext', 'binary', 'blob', 'enum'],
'integer' => ['int', 'tinyint', 'bigint', 'mediumint', 'bit', 'timestamp', 'year'],
'float' => ['float','decimal', 'double'],
'date' => ['date'],
'datetime' => ['datetime'],
'time' => ['time']
];
$field_allow = $type_mapping['string'];
if (in_array($database_expected_field, $type_mapping['string']))
{
return TRUE;
}
if (preg_match("/^[0-9]+$/i", $text))
{
// $this->dl('integer', $text);
$field_allow = $type_mapping['integer'];
}
elseif (is_numeric($text))
{
// $this->dl('float', $text);
$field_allow = $type_mapping['float'];
}
elseif ($this->validate_date($text, 'Y-m-d'))
{
// $this->dl('date', $text);
$field_allow = $type_mapping['date'];
}
elseif ($this->validate_date($text, 'Y-m-d H:i:s'))
{
// $this->dl('datetime', $text);
$field_allow = $type_mapping['datetime'];
}
elseif ($this->validate_date($text, 'H:i:s'))
{
// $this->dl('time', $text);
$field_allow = $type_mapping['time'];
}
// $this->dl('keys', implode(',', $field_allow));
if (in_array($database_expected_field,$field_allow))
{
return TRUE;
}
return FALSE;
}
/**
* Validate string matches date
*
* @param string $date
* @param string $format
* @return boolean
*/
protected function validate_date($date, $format = 'Y-m-d')
{
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) === $date;
}
protected function clean_alpha_num_field ($text)
{
return preg_replace("/[^0-9a-zA-Z\_%]/", "", $text );
}
protected function clean_alpha_field ($text)
{
return preg_replace("/[^a-zA-Z\_%]/", "", $text );
}
public function batch_update($params)
{
return $this->db->update_batch($this->_table, $params, 'id');
}
public function time_default_mapping ()
{
$results = [];
for ($i=0; $i < 24; $i++)
{
for ($j=0; $j < 60; $j++)
{
$hour = ($i < 10) ? '0' . $i : $i;
$min = ($j < 10) ? '0' . $j : $j;
$results[($i * 60) + $j] = "$hour:$min";
}
}
return $results;
}
public function get_auto_increment_id()
{
$sql = $this->db->query('SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "'. $this->db->database .'" AND TABLE_NAME = "'. $this->_table .'" ');
return $sql->row()->AUTO_INCREMENT;
}
public function log_activity($action, $now_data, $prev_data, $user_id)
{
$prev_data = json_decode(json_encode($prev_data), true);
$change_details = '';
if(count($prev_data) > 0)
{
$change_details = 'Data changed from '. json_encode($prev_data) . ' to ' .json_encode($now_data);
}
else
{
$change_details = json_encode($now_data);
}
$operation_data = [
'user_id' => $user_id,
'action' => $action,
'detail' => $change_details,
'created_at' => date('Y-m-j H:i:s'),
'updated_at' => date('Y-m-j H:i:s')
];
$this->db->insert($this->_table, $operation_data);
}
public function get_all_custom_where($custom_where = null,$where = array())
{
$this->db->from($this->_table);
foreach($where as $field => $value)
{
if (is_numeric($field) && strlen($value) > 0)
{
$this->db->where($value);
continue;
}
if ($field === NULL && $value === NULL)
{
continue;
}
if ($value !== NULL)
{
$this->db->where($this->clean_alpha_field($field), $value, TRUE);
}
}
if($custom_where !=null){
$this->db->where($custom_where);
}
return $this->db->get()->result();
}
}