380 lines
9.7 KiB
PHP
380 lines
9.7 KiB
PHP
<?php
|
|
/* don't extend TD_Model
|
|
* instead extend TD_DB_Model
|
|
*/
|
|
abstract class TD_Model {
|
|
protected $plugin;
|
|
protected $hook_namespace;
|
|
protected $dev_mode;
|
|
protected $version;
|
|
protected $computed_schema;
|
|
|
|
public function get_primary_key() {
|
|
return $this->primary_key;
|
|
}
|
|
|
|
public function __construct( $plugin ) {
|
|
$this->plugin = $plugin;
|
|
}
|
|
|
|
public function get_version() {
|
|
if ( empty( $this->version ) ) {
|
|
$this->version = '0.0.0';
|
|
}
|
|
|
|
if ( !empty( $this->get_dev_mode() ) ) {
|
|
return $this->version . '.' . time();
|
|
}
|
|
|
|
return $this->version;
|
|
}
|
|
|
|
public function get_dev_mode() {
|
|
if ( defined( 'TD_DEV_MODE' ) && TD_DEV_MODE ) {
|
|
return true;
|
|
}
|
|
|
|
return $this->dev_mode;
|
|
}
|
|
|
|
public function namespace_wp_hook( $custom_hook_name ) {
|
|
$tag = '';
|
|
if ( !empty( $this->hook_namespace ) ) {
|
|
$tag .= $this->hook_namespace . '/';
|
|
}
|
|
|
|
$tag .= $this->slug . '/';
|
|
|
|
if ( !empty( $prefix ) ) {
|
|
$tag .= $prefix . '_';
|
|
}
|
|
|
|
$tag .= $custom_hook_name;
|
|
|
|
return $tag;
|
|
}
|
|
|
|
public function get_computed_schema() {
|
|
if ( !empty( $this->computed_schema ) || false === $this->computed_schema ) {
|
|
return $this->computed_schema;
|
|
}
|
|
}
|
|
|
|
public function add_computed_values_to_response( $item, $item_id, $recursive, $fetch = array() ) {
|
|
$computed_schema = $this->get_computed_schema();
|
|
if ( empty( $computed_schema ) ) {
|
|
return $item;
|
|
}
|
|
|
|
if ( is_array( $computed_schema ) ) {
|
|
if ( empty( $computed_schema['fields'] ) ) {
|
|
return $item;
|
|
}
|
|
|
|
foreach ($computed_schema['fields'] as $computed_field ) {
|
|
if ( $recursive <= 0 && empty( $fetch[$computed_field['name']] ) ) {
|
|
continue;
|
|
}
|
|
|
|
if ( !empty( $computed_field['get_input'] ) ) {
|
|
$input = $computed_field['get_input'];
|
|
} elseif ( !empty( $computed_field['get_input_path'] ) && isset( $item[$computed_field['get_input_path']] ) ) {
|
|
$input = $item[$computed_field['get_input_path']];
|
|
} else {
|
|
$input = null;
|
|
}
|
|
|
|
$computed_value = call_user_func( $computed_field['get_function'], $input );
|
|
$item[$computed_field['name']] = $computed_value;
|
|
}
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
|
|
public function get( $row_id, $recursive=0 ) {
|
|
$tag = $this->namespace_wp_hook( 'before_get' );
|
|
$row_id = apply_filters( $tag, $row_id, $recursive );
|
|
|
|
$item = $this->db_get( $row_id, $recursive );
|
|
|
|
$tag = $this->namespace_wp_hook( 'after_get' );
|
|
$item = apply_filters( $tag, $item, $row_id, $recursive );
|
|
|
|
return $item;
|
|
}
|
|
|
|
public function get_by( $field, $row_id, $recursive=0 ) {
|
|
return $this->db_get_by( $field, $row_id, $recursive );
|
|
}
|
|
|
|
public function get_field( $field, $row_id ) {
|
|
return $this->db_get_field( $field, $row_id );
|
|
}
|
|
|
|
public function get_field_by( $field, $field_where, $field_value ) {
|
|
return $this->db_get_field_by( $field, $field_where, $field_value );
|
|
}
|
|
|
|
public function query( $args=array() ) {
|
|
return $this->db_query( $args );
|
|
}
|
|
|
|
public function insert( $data, $type = '' ) {
|
|
$tag = $this->namespace_wp_hook( 'before_insert' );
|
|
$data = apply_filters( $tag, $data, $type );
|
|
|
|
if ( ! empty( $data['error'] ) ) {
|
|
if ( ! current_user_can( 'ssa_manage_site_settings' ) && ! empty( $data['error']['admin_message'] ) ) {
|
|
unset( $data['error']['admin_message'] );
|
|
}
|
|
|
|
return array(
|
|
// 'error' => array(
|
|
// 'code' => '',
|
|
// 'message' => '',
|
|
// 'admin_message' => ''
|
|
// 'data' => array(),
|
|
// ),
|
|
'error' => $data['error'],
|
|
);
|
|
}
|
|
|
|
$insert_id = $this->db_insert( $data, $type = '' );
|
|
|
|
if( isset( $data['meta_data'] ) ){
|
|
// insert corresponding records into meta table
|
|
$this->plugin->{$this->slug.'_meta_model'}->bulk_meta_update( $insert_id, $data['meta_data'] );
|
|
unset( $data['meta_data'] );
|
|
}
|
|
|
|
$tag = $this->namespace_wp_hook( 'after_insert' );
|
|
do_action( $tag, $insert_id, $data );
|
|
|
|
return $insert_id;
|
|
}
|
|
|
|
public function raw_insert( $data, $type = '' ) {
|
|
// $tag = $this->namespace_wp_hook( 'before_insert' );
|
|
// $data = apply_filters( $tag, $data, $type );
|
|
|
|
$insert_id = $this->db_raw_insert( $data, $type = '' );
|
|
|
|
// $tag = $this->namespace_wp_hook( 'after_insert' );
|
|
// do_action( $tag, $insert_id, $data );
|
|
|
|
return $insert_id;
|
|
}
|
|
|
|
public function update( $row_id, $data = array() ) {
|
|
$tag = $this->namespace_wp_hook( 'before_update' );
|
|
$data_before = $this->get( $row_id );
|
|
$data = apply_filters( $tag, $data, $data_before, $row_id, $data );
|
|
|
|
if ( ! empty( $data['error'] ) ) {
|
|
if ( ! current_user_can( 'ssa_manage_site_settings' ) && ! empty( $data['error']['admin_message'] ) ) {
|
|
unset( $data['error']['admin_message'] );
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
$response = $this->db_update( $row_id, $data );
|
|
|
|
if( isset( $data['meta_data'] ) ){
|
|
// update corresponding records in meta table
|
|
$this->plugin->{$this->slug.'_meta_model'}->bulk_meta_update( $row_id, $data['meta_data'] );
|
|
unset( $data['meta_data'] );
|
|
}
|
|
|
|
$tag = $this->namespace_wp_hook( 'after_update' );
|
|
do_action( $tag, $row_id, $data, $data_before, $response );
|
|
|
|
return $response;
|
|
}
|
|
|
|
public function raw_update( $row_id, $data = array() ) {
|
|
// $tag = $this->namespace_wp_hook( 'before_update' );
|
|
// $data_before = $this->get( $row_id );
|
|
// $data = apply_filters( $tag, $data, $data_before, $row_id, $data );
|
|
|
|
$response = $this->db_update( $row_id, $data );
|
|
|
|
// $tag = $this->namespace_wp_hook( 'after_update' );
|
|
// do_action( $tag, $row_id, $data, $data_before, $response );
|
|
|
|
return $response;
|
|
}
|
|
|
|
public function delete( $row_id = 0, $force_delete = false ) {
|
|
|
|
$tag = $this->namespace_wp_hook( 'before_delete' );
|
|
$row_id = apply_filters( $tag, $row_id, $force_delete );
|
|
|
|
if( empty( $row_id ) && $row_id !== 0 ){
|
|
return;
|
|
}
|
|
|
|
$response = $this->db_delete( $row_id, $force_delete );
|
|
|
|
// delete corresponding records in meta table
|
|
$this->plugin->{$this->slug.'_meta_model'}->bulk_meta_delete( $row_id );
|
|
|
|
$tag = $this->namespace_wp_hook( 'after_delete' );
|
|
do_action( $tag, $row_id, $force_delete, $response );
|
|
|
|
return $response;
|
|
}
|
|
|
|
public function prepare_belongs_to_relationship( $item, $recursive=0 ) {
|
|
if ( empty( $recursive ) ) {
|
|
return $item;
|
|
}
|
|
|
|
if ( empty( $this->belongs_to() ) ) {
|
|
return $item;
|
|
}
|
|
|
|
foreach ($this->belongs_to() as $relationship_key => $relationship ) {
|
|
$item[$relationship_key] = array();
|
|
switch ( $relationship['model'] ) {
|
|
case 'WP_Post_Model':
|
|
$item = $this->prepare_wp_post_model( $item, $relationship_key, $relationship, $recursive - 1 );
|
|
break;
|
|
|
|
case 'WP_User_Model':
|
|
$item = $this->prepare_wp_user_model( $item, $relationship_key, $relationship, $recursive - 1 );
|
|
break;
|
|
|
|
default:
|
|
if ( empty( $relationship['model'] ) ) {
|
|
break;
|
|
}
|
|
|
|
if ( !is_object( $relationship['model'] ) ) {
|
|
break;
|
|
}
|
|
|
|
if ( !method_exists( $relationship['model'], 'get' ) ) {
|
|
break;
|
|
}
|
|
|
|
if ( !method_exists( $relationship['model'], 'prepare_item_for_response' ) ) {
|
|
break;
|
|
}
|
|
|
|
$item[$relationship_key] = $relationship['model']->get( $item[$relationship['foreign_key']], $recursive - 1 );
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
|
|
public function prepare_has_many_relationship( $item, $recursive=0 ) {
|
|
if ( empty( $recursive ) ) {
|
|
return $item;
|
|
}
|
|
|
|
if ( empty( $this->has_many() ) ) {
|
|
return $item;
|
|
}
|
|
|
|
foreach ($this->has_many() as $relationship_key => $relationship ) {
|
|
$item[$relationship_key] = array();
|
|
switch ( $relationship['model'] ) {
|
|
case 'WP_Post_Model':
|
|
$this->prepare_wp_post_model( $item, $relationship_key, $relationship, $recursive - 1 );
|
|
break;
|
|
|
|
case 'WP_User_Model':
|
|
$this->prepare_wp_user_model( $item, $relationship_key, $relationship, $recursive - 1 );
|
|
break;
|
|
|
|
default:
|
|
if ( empty( $relationship['model'] ) ) {
|
|
break;
|
|
}
|
|
|
|
if ( !is_object( $relationship['model'] ) ) {
|
|
break;
|
|
}
|
|
|
|
if ( !method_exists( $relationship['model'], 'get' ) ) {
|
|
break;
|
|
}
|
|
|
|
if ( !method_exists( $relationship['model'], 'prepare_item_for_response' ) ) {
|
|
break;
|
|
}
|
|
|
|
$item[$relationship_key] = $relationship['model']->query( array(
|
|
$relationship['foreign_key'] => $item[$this->primary_key],
|
|
'recursive' => $recursive - 1,
|
|
) );
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
|
|
public function prepare_wp_post_model( $item, $relationship_key, $relationship, $recursive=0 ) {
|
|
$post = get_post( $item[$relationship['foreign_key']] );
|
|
$item[$relationship_key] = array(
|
|
'id' => $post->ID,
|
|
'post_type' => $post->post_type,
|
|
'title' => $post->post_title,
|
|
'slug' => $post->post_name,
|
|
'content' => $post->post_content,
|
|
'date_published' => $post->post_date_gmt,
|
|
'date_modified' => $post->post_modified_gmt,
|
|
);
|
|
if ( !empty( $relationship['fields'] ) ) {
|
|
foreach ($relationship['fields'] as $field_key => $field) {
|
|
if ( is_int( $field_key ) ) {
|
|
$field_key = $field;
|
|
}
|
|
|
|
$item[$relationship_key][$field_key] = $post->$field;
|
|
}
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
|
|
public function prepare_wp_user_model( $item, $relationship_key, $relationship, $recursive=0 ) {
|
|
$user = new WP_User( $item[$relationship['foreign_key']] );
|
|
|
|
if ( empty( $user->ID ) ) {
|
|
$item[$relationship_key] = array();
|
|
return $item;
|
|
}
|
|
|
|
$item[$relationship_key] = array(
|
|
'id' => $user->ID,
|
|
'login' => $user->data->user_login,
|
|
'email' => $user->data->user_email,
|
|
'date_created' => $user->data->user_registered,
|
|
'display_name' => $user->data->display_name,
|
|
'roles' => $user->roles,
|
|
);
|
|
if ( !empty( $relationship['fields'] ) ) {
|
|
foreach ($relationship['fields'] as $field_key => $field) {
|
|
if ( is_int( $field_key ) ) {
|
|
$field_key = $field;
|
|
}
|
|
|
|
$item[$relationship_key][$field_key] = $user->$field;
|
|
}
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
|
|
|
|
public function bulk_delete( $args=array() ) {
|
|
return $this->db_bulk_delete( $args );
|
|
}
|
|
} |