<?php
/**
* Suppress "error - 0 - No summary was found for this file" on phpdoc generation
*
* @package WPDataProjects\Project
*/
namespace WPDataProjects\Project {
use WPDataAccess\WPDA;
use WPDataAccess\Data_Dictionary\WPDA_List_Columns_Cache;
use WPDataAccess\Plugin_Table_Models\WPDP_Project_Design_Table_Model;
/**
* Class WPDP_Project
*
* @author Peter Schulz
* @since 2.0.0
*/
class WPDP_Project {
/**
* Project structure
*
* @var array|null
*/
protected $project = null;
/**
* Project ID
*
* @var string|null
*/
protected $project_id = null;
/**
* Page ID
*
* @var string|null
*/
protected $page_id = null;
/**
* WPDP_Project constructor
*
* Set project and page ID. Sets the structure for the Data Projects tool main page if no project ID is
* provided. Sets the structure for the Data Projects tool table options page if project ID is
* 'wpda_sys_tables'.
*
* @param string $project_id Project ID
* @param string $page_id Page ID
*/
public function __construct( $project_id = null, $page_id = null ) {
$this->project_id = $project_id;
$this->page_id = $page_id;
if ( null === $this->project_id ) {
$this->init_self();
} elseif ( 'wpda_sys_tables' === $this->project_id ) {
$this->init_self_tables();
} else {
$this->init_project_page( $this->project_id, $this->page_id );
}
}
/**
* Sets the structure for the Data Projects tool main page
*/
protected function init_self() {
global $wpdb;
$this->project =
array(
'mode' => 'edit',
'setname' => '',
'title' => '',
'subtitle' => '',
'parent' =>
array(
'key' => array( 'project_id' ),
'data_type' => array( 'number' ),
),
'children' =>
array(
array(
'table_name' => $wpdb->prefix . 'wpda_project_page',
'setname' => '',
'tab_label' => 'Pages',
'default_where' => '',
'default_orderby' => '',
'relation_1n' =>
array(
'parent_key' => array( 'project_id' ),
'child_key' => array( 'project_id' ),
'data_type' => array( 'number' ),
),
),
),
);
}
/**
* Sets the structure for the Data Projects tool table options page
*/
protected function init_self_tables() {
$this->project =
array(
'mode' => 'edit',
'setname' => '',
'title' => '',
'subtitle' => '',
'parent' =>
array(
'key' => array( 'wpda_table_name' ),
'data_type' => array( 'varchar' ),
),
'children.' =>
array(),
);
}
/**
* Creates the structure for the given project page
*
* @param string $project_id Project ID
* @param string $page_id Page ID
*/
protected function init_project_page( $project_id, $page_id ) {
global $wpdb;
$query = $wpdb->prepare(
"
select * from {$wpdb->prefix}wpda_project_page
where project_id = %d
and page_id = %d
",
array(
$project_id,
$page_id,
)
);
$project_page = $wpdb->get_results( $query, 'ARRAY_A' ); // phpcs:ignore WordPress.DB.PreparedSQL
if ( 0 === $wpdb->num_rows ) {
return;
}
$schema_name = $project_page[0]['page_schema_name'];
$table_name = $project_page[0]['page_table_name'];
$page_setname = $project_page[0]['page_setname'];
$relationships = WPDP_Project_Design_Table_Model::get_column_options( $table_name, 'relationships', $page_setname, $schema_name );
if ( ! isset( $relationships['relationships'] ) || null === $relationships['relationships'] ) {
$this->project =
array(
'mode' => $project_page[0]['page_mode'],
'setname' => $page_setname,
'title' => $project_page[0]['page_title'],
'subtitle' => $project_page[0]['page_subtitle'],
'parent' => array(),
'children' => array(),
'page_allow_full_export' => $project_page[0]['page_allow_full_export'],
);
return;
}
// Add parent column and data type
$wpda_list_columns = WPDA_List_Columns_Cache::get_list_columns( $schema_name, $table_name );
$parent_primary_key = $wpda_list_columns->get_table_primary_key();
$parent_primary_key_data_type = array();
foreach ( $parent_primary_key as $pk ) {
if ( isset( $relationships['table'] ) && null !== $relationships['table'] ) {
foreach ( $relationships['table'] as $column ) {
if ( $column->column_name === $pk ) {
array_push( $parent_primary_key_data_type, WPDA::get_type( $column->data_type ) );//phpcs:ignore - 8.1 proof
break;
}
}
}
}
// Add children
$children = array();
foreach ( $relationships['relationships'] as $relationship ) {
$child_key_data_type = array();
if ( '1n' === $relationship->relation_type ) {
$n_relationship = WPDP_Project_Design_Table_Model::get_column_options( $relationship->target_table_name, 'tableinfo', $page_setname, $schema_name );
if ( isset( $n_relationship->tab_label ) ) {
$tab_label = $n_relationship->tab_label;
} else {
$tab_label = '';
}
foreach ( $relationship->source_column_name as $source_column_name ) {
if ( ! in_array( $source_column_name, $parent_primary_key ) ) {
array_push( $parent_primary_key, $source_column_name );//phpcs:ignore - 8.1 proof
foreach ( $relationships['table'] as $column ) {
if ( $column->column_name === $source_column_name ) {
array_push( $parent_primary_key_data_type, WPDA::get_type( $column->data_type ) );//phpcs:ignore - 8.1 proof
break;
}
}
}
}
foreach ( $relationship->target_column_name as $target_column_name ) {
foreach ( $relationships['table'] as $column ) {
if ( $column->column_name === $target_column_name ) {
array_push( $child_key_data_type, WPDA::get_type( $column->data_type ) );//phpcs:ignore - 8.1 proof
break;
}
}
}
$child = array(
'table_name' => $relationship->target_table_name,
'tab_label' => $tab_label === '' ? $relationship->target_table_name : $tab_label,
'default_where' => isset( $n_relationship->default_where ) ? $n_relationship->default_where : '',
'default_orderby' => isset( $n_relationship->default_orderby ) ? $n_relationship->default_orderby : '',
'relation_' . $relationship->relation_type => array(
'parent_key' => $relationship->source_column_name,
'child_key' => $relationship->target_column_name,
'data_type' => $child_key_data_type,
),
);
array_push( $children, $child );//phpcs:ignore - 8.1 proof
} elseif ( 'nm' === $relationship->relation_type ) {
$nm_relationships = WPDP_Project_Design_Table_Model::get_column_options( $relationship->relation_table_name, 'relationships', $page_setname, $schema_name );
if ( isset( $nm_relationships['tableinfo'] ) && isset( $nm_relationships['tableinfo']->tab_label ) ) {
$tab_label = $nm_relationships['tableinfo']->tab_label;
} else {
$tab_label = '';
}
if ( isset( $nm_relationships['relationships'] ) && null !== $nm_relationships['relationships'] ) {
$nm_relationship_found = null;
foreach ( $nm_relationships['relationships'] as $nm_relationship ) {
if ( $nm_relationship->target_table_name === $relationship->target_table_name ) {
$nm_relationship_found = $nm_relationship;
break;
}
}
if ( null !== $nm_relationship_found ) {
foreach ( $nm_relationship_found->source_column_name as $source_column_name ) {
foreach ( $nm_relationships['table'] as $column ) {
if ( $column->column_name === $source_column_name ) {
array_push( $child_key_data_type, WPDA::get_type( $column->data_type ) );//phpcs:ignore - 8.1 proof
if ( ! in_array( $source_column_name, $parent_primary_key ) ) {//phpcs:ignore - 8.1 proof
array_push( $parent_primary_key, $source_column_name );//phpcs:ignore - 8.1 proof
array_push( $parent_primary_key_data_type, WPDA::get_type( $column->data_type ) );//phpcs:ignore - 8.1 proof
}
break;
}
}
}
$child = array(
'table_name' => $relationship->relation_table_name,
'tab_label' => $tab_label === '' ? $relationship->relation_table_name : $tab_label,
'default_where' => isset( $nm_relationships['tableinfo']->default_where ) ? $nm_relationships['tableinfo']->default_where : '',
'default_orderby' => isset( $nm_relationships['tableinfo']->default_orderby ) ? $nm_relationships['tableinfo']->default_orderby : '',
'relation_nm' => array(
'child_table' => $relationship->target_table_name,
'parent_key' => $nm_relationship->source_column_name,
'child_table_select' => $nm_relationship->target_column_name,
'child_table_where' => $relationship->target_column_name,
'data_type' => $child_key_data_type,
),
);
array_push( $children, $child );//phpcs:ignore - 8.1 proof
}
}
}
}
// Prepare parent key
$parent = array(
'key' => $parent_primary_key,
'data_type' => $parent_primary_key_data_type,
);
$this->project =
array(
'mode' => $project_page[0]['page_mode'],
'setname' => $page_setname,
'title' => $project_page[0]['page_title'],
'subtitle' => $project_page[0]['page_subtitle'],
'parent' => $parent,
'children' => $children,
'page_allow_full_export' => $project_page[0]['page_allow_full_export'],
);
}
/**
* Returns the project structure
*
* @return array
*/
public function get_project() {
return $this->project;
}
/**
* Returns the project mode or null if not available
*
* @return string|null
*/
public function get_mode() {
if ( isset( $this->project['mode'] ) ) {
return $this->project['mode'];
} else {
return null;
}
}
/**
* Returns the project setname or null if not available
*
* @return string|null
*/
public function get_setname() {
if ( isset( $this->project['setname'] ) ) {
return $this->project['setname'];
} else {
return null;
}
}
/**
* Returns the project title or null if not available
*
* @return string|null
*/
public function get_title() {
if ( isset( $this->project['title'] ) ) {
return $this->project['title'];
} else {
return null;
}
}
/**
* Returns the project sub title or null if not available
*
* @return string|null
*/
public function get_subtitle() {
if ( isset( $this->project['subtitle'] ) ) {
return $this->project['subtitle'];
} else {
return null;
}
}
/**
* Returns the project parent info or null if not available
*
* @return array|null
*/
public function get_parent() {
if ( isset( $this->project['parent'] ) ) {
return $this->project['parent'];
} else {
return null;
}
}
/**
* Returns the project children or null if not available
*
* @return array|null
*/
public function get_children() {
if ( isset( $this->project['children'] ) ) {
return $this->project['children'];
} else {
return null;
}
}
/**
* Is the user allowed to start a full export to CSV or JSON
*
* @return string yes or no
*/
public function get_page_allow_full_export() {
if ( isset( $this->project['page_allow_full_export'] ) ) {
return $this->project['page_allow_full_export'];
} else {
return 'no';
}
}
}
}