riainvoice/application/core/MY_Model.php
gandhimathi Bharathirajan c940cb1a2c all files
2017-09-11 14:38:03 +05:30

417 lines
11 KiB
PHP

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter CRUD Model 2
* A base model providing CRUD, pagination and validation.
*
* Install this file as application/core/MY_Model.php
*
* @package CodeIgniter
* @author Jesse Terry
* @copyright Copyright (c) 2012-2013, Jesse Terry
* @link http://developer13.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
class MY_Model extends CI_Model
{
public $table;
public $primary_key;
public $default_limit = 15;
public $page_links;
public $query;
public $form_values = array();
public $validation_errors;
public $total_rows;
public $date_created_field;
public $date_modified_field;
public $native_methods = array(
'select', 'select_max', 'select_min', 'select_avg', 'select_sum', 'join',
'where', 'or_where', 'where_in', 'or_where_in', 'where_not_in', 'or_where_not_in',
'like', 'or_like', 'not_like', 'or_not_like', 'group_by', 'distinct', 'having',
'or_having', 'order_by', 'limit'
);
public $total_pages = 0;
public $current_page;
public $next_page;
public $previous_page;
public $offset;
public $next_offset;
public $previous_offset;
public $last_offset;
public $id;
public $filter = array();
protected $default_validation_rules = 'validation_rules';
protected $validation_rules;
public function __call($name, $arguments)
{
if (substr($name, 0, 7) == 'filter_') {
$this->filter[] = array(substr($name, 7), $arguments);
} else {
call_user_func_array(array($this->db, $name), $arguments);
}
return $this;
}
/**
* Sets CI query object and automatically creates active record query
* based on methods in child model.
* $this->model_name->get()
*/
public function get($include_defaults = true)
{
if ($include_defaults) {
$this->set_defaults();
}
$this->run_filters();
$this->query = $this->db->get($this->table);
$this->filter = array();
return $this;
}
/**
* Query builder which listens to methods in child model
*
* @param array $exclude
*/
private function set_defaults($exclude = array())
{
$native_methods = $this->native_methods;
foreach ($exclude as $unset_method) {
unset($native_methods[array_search($unset_method, $native_methods)]);
}
foreach ($native_methods as $native_method) {
$native_method = 'default_' . $native_method;
if (method_exists($this, $native_method)) {
$this->$native_method();
}
}
}
private function run_filters()
{
foreach ($this->filter as $filter) {
call_user_func_array(array($this->db, $filter[0]), $filter[1]);
}
/**
* Clear the filter array since this should only be run once per model
* execution
*/
$this->filter = array();
}
/**
* Call when paginating results
* $this->model_name->paginate()
*
* @param $base_url
* @param int $offset
* @param int $uri_segment
*/
public function paginate($base_url, $offset = 0, $uri_segment = 3)
{
$this->load->helper('url');
$this->load->library('pagination');
$this->offset = $offset;
$default_list_limit = $this->mdl_settings->setting('default_list_limit');
$per_page = (empty($default_list_limit) ? $this->default_limit : $default_list_limit);
$this->set_defaults();
$this->run_filters();
$this->db->limit($per_page, $this->offset);
$this->query = $this->db->get($this->table);
$this->total_rows = $this->db->query('SELECT FOUND_ROWS() AS num_rows')->row()->num_rows;
$this->total_pages = ceil($this->total_rows / $per_page);
$this->previous_offset = $this->offset - $per_page;
$this->next_offset = $this->offset + $per_page;
$config = array(
'base_url' => $base_url,
'total_rows' => $this->total_rows,
'per_page' => $per_page
);
$this->last_offset = ($this->total_pages * $per_page) - $per_page;
if ($this->config->item('pagination_style')) {
$config = array_merge($config, $this->config->item('pagination_style'));
}
$this->pagination->initialize($config);
$this->page_links = $this->pagination->create_links();
}
/**
* Function to save an entry to the database
*
* @param null $id
* @param null $db_array
* @return null
*/
public function save($id = null, $db_array = null)
{
if (!$db_array) {
$db_array = $this->db_array();
}
$datetime = date('Y-m-d H:i:s');
if (!$id) {
if ($this->date_created_field) {
if (is_array($db_array)) {
$db_array[$this->date_created_field] = $datetime;
if ($this->date_modified_field) {
$db_array[$this->date_modified_field] = $datetime;
}
} else {
$db_array->{$this->date_created_field} = $datetime;
if ($this->date_modified_field) {
$db_array->{$this->date_modified_field} = $datetime;
}
}
} elseif ($this->date_modified_field) {
if (is_array($db_array)) {
$db_array[$this->date_modified_field] = $datetime;
} else {
$db_array->{$this->date_modified_field} = $datetime;
}
}
$this->db->insert($this->table, $db_array);
return $this->db->insert_id();
} else {
if ($this->date_modified_field) {
if (is_array($db_array)) {
$db_array[$this->date_modified_field] = $datetime;
} else {
$db_array->{$this->date_modified_field} = $datetime;
}
}
$this->db->where($this->primary_key, $id);
$this->db->update($this->table, $db_array);
return $id;
}
}
/**
* Returns an array based on $_POST input matching the ruleset used to
* validate the form submission.
*
* @return array
*/
public function db_array()
{
$db_array = array();
$validation_rules = $this->{$this->validation_rules}();
foreach ($this->input->post() as $key => $value) {
if (array_key_exists($key, $validation_rules)) {
$db_array[$key] = $value;
}
}
return $db_array;
}
/**
* Deletes a record based on primary key value
* $this->model_name->delete(5);
*
* @param $id
*/
public function delete($id)
{
$this->db->where($this->primary_key, $id);
$this->db->delete($this->table);
}
/**
* Returns the CI query result object
* $this->model_name->get()->result();
*
* @return mixed
*/
public function result()
{
return $this->query->result();
}
/**
* Returns the CI query row object
* $this->model_name->get()->row();
*
* @return mixed
*/
public function row()
{
return $this->query->row();
}
/**
* Returns CI query result array
* $this->model_name->get()->result_array();
*
* @return mixed
*/
public function result_array()
{
return $this->query->result_array();
}
/**
* Returns CI query row array
* $this->model_name->get()->row_array();
*
* @return mixed
*/
public function row_array()
{
return $this->query->row_array();
}
/**
* Returns CI query num_rows()
* $this->model_name->get()->num_rows();
*
* @return mixed
*/
public function num_rows()
{
return $this->query->num_rows();
}
/**
* Used to retrieve record by ID and populate $this->form_values
*
* @param int $id
* @return boolean|null
*/
public function prep_form($id = null)
{
if (!$_POST and ($id)) {
$row = $this->get_by_id($id);
if ($row) {
foreach ($row as $key => $value) {
$this->form_values[$key] = $value;
}
return true;
}
return false;
} elseif (!$id) {
return true;
}
}
/**
* Retrieves a single record based on primary key value
*
* @param $id
* @return mixed
*/
public function get_by_id($id)
{
return $this->where($this->primary_key, $id)->get()->row();
}
/**
* Performs validation on submitted form. By default, looks for method in
* child model called validation_rules, but can be forced to run validation
* on any method in child model which returns array of validation rules.
*
* @param null|string $validation_rules
* @return mixed
*/
public function run_validation($validation_rules = null)
{
if (!$validation_rules) {
$validation_rules = $this->default_validation_rules;
}
foreach (array_keys($_POST) as $key) {
$this->form_values[$key] = $this->input->post($key);
}
if (method_exists($this, $validation_rules)) {
$this->validation_rules = $validation_rules;
$this->load->library('form_validation');
$this->form_validation->set_rules($this->$validation_rules());
$run = $this->form_validation->run();
$this->validation_errors = validation_errors();
return $run;
}
}
/**
* Returns the assigned form value to a form input element
*
* @param string $key
* @param bool $escape
* @return mixed|string
*/
public function form_value($key, $escape = false)
{
$value = isset($this->form_values[$key]) ? $this->form_values[$key] : '';
return $escape ? htmlspecialchars($value) : $value;
}
/**
* @param string $key
* @param $value
*/
public function set_form_value($key, $value)
{
$this->form_values[$key] = $value;
}
/**
* @param $id
*/
public function set_id($id)
{
$this->id = $id;
}
}