<?php
/**
* Suppress "error - 0 - No summary was found for this file" on phpdoc generation
*
* @package WPDataProjects\Simple_Form
*/
namespace WPDataProjects\Simple_Form {
use WPDataAccess\Connection\WPDADB;
use WPDataAccess\Simple_Form\WPDA_Simple_Form;
use WPDataAccess\Simple_Form\WPDA_Simple_Form_Item_Autocomplete;
use WPDataAccess\Simple_Form\WPDA_Simple_Form_Item_Enum;
use WPDataAccess\Simple_Form\WPDA_Simple_Form_Item_Image;
use WPDataAccess\Simple_Form\WPDA_Simple_Form_Item_Media;
use WPDataAccess\Plugin_Table_Models\WPDP_Project_Design_Table_Model;
use WPDataAccess\WPDA;
/**
* Class WPDP_Simple_Form extends WPDA_Simple_Form
*
* Uses table options to hide items and add lookups to data entry form
*
* @see WPDA_Simple_Form
*
* @author Peter Schulz
* @since 2.0.0
*/
class WPDP_Simple_Form extends WPDA_Simple_Form {
/**
* Options set name
*
* @var string
*/
protected $setname = 'default';
/**
* WPDP_Simple_Form constructor.
*
* @param $schema_name
* @param $table_name
* @param $wpda_list_columns
* @param array $args
*/
public function __construct( $schema_name, $table_name, &$wpda_list_columns, $args = array() ) {
if ( isset( $args['title'] ) ) {
$this->title = $args['title'];
}
parent::__construct( $schema_name, $table_name, $wpda_list_columns, $args );
$this->setname = $this->wpda_list_columns->get_setname();
}
/**
* Overwrites method prepare_items
*
* Uses table options to hide items and add lookups to data entry form
*
* @param bool $set_back_form_values
*/
protected function prepare_items( $set_back_form_values = false ) {
parent::prepare_items( $set_back_form_values );
foreach ( $this->wpda_list_columns->get_table_columns() as $columns ) {
// Hide columns which have show attribute disabled.
if ( isset( $columns['show'] ) && ! $columns['show'] ) {
$item_index = $this->get_item_index( $columns['column_name'] );
if ( isset( $this->form_items[ $item_index ] ) ) {
$this->form_items[ $item_index ]->set_hide_item( true );
}
}
// Set default value if available
if ( isset( $columns['default'] ) && '' !== $columns['default'] ) {
$item_default_value = WPDA::convert_default_value( $columns['default'] );
$item_index = $this->get_item_index( $columns['column_name'] );
if ( isset( $this->form_items[ $item_index ] ) ) {
$this->form_items[ $item_index ]->set_item_default_value( $item_default_value );
}
}
}
// Check if there are any lookup items defined for this table.
$lookup_column_name = array();
$tableform = WPDP_Project_Design_Table_Model::get_column_options( $this->table_name, 'tableform', $this->setname, $this->schema_name );
$i = 0;
if ( null !== $tableform ) {
foreach ( $tableform as $tableform_item ) {
// Process lookup items
if ( isset( $tableform_item->lookup ) && false !== $tableform_item->lookup ) {
$lookup_column_name[ $tableform_item->column_name ] = $tableform_item->lookup;
}
if (
'edit' === $this->action ||
(
'new' === $this->action &&
isset( $this->form_items[ $i ] ) &&
'NO' !== $this->form_items[ $i ]->is_nullable()
)
) {
// Check readonly items
if ( isset( $tableform_item->readonly ) && 'on' === $tableform_item->readonly ) {
$this->form_items[ $i ]->set_readonly( true );
}
}
if ( is_admin() ) {
if ( isset( $tableform_item->item_type, $this->form_items[ $i ] ) ) {
// Process images
if ( 'image' === $tableform_item->item_type ) {
$class_path = explode( '\\', get_class( $this->form_items[ $i ] ) );//phpcs:ignore - 8.1 proof
$class_name = array_pop( $class_path );//phpcs:ignore - 8.1 proof
if ( 'WPDA_Simple_Form_Item_Image' !== $class_name ) {
$this->form_items[ $i ] = new WPDA_Simple_Form_Item_Image( $this->form_items[ $i ] );
}
}
// Process attachments
if ( 'attachment' === $tableform_item->item_type ) {
$class_path = explode( '\\', get_class( $this->form_items[ $i ] ) );//phpcs:ignore - 8.1 proof
$class_name = array_pop( $class_path );//phpcs:ignore - 8.1 proof
if ( 'WPDA_Simple_Form_Item_Media' !== $class_name ) {
$this->form_items[ $i ] = new WPDA_Simple_Form_Item_Media( $this->form_items[ $i ] );
}
}
}
}
$i ++;
}
}
if ( count( $lookup_column_name ) > 0 ) {//phpcs:ignore - 8.1 proof
// Process lookup items and create listboxes.
$lookups = array();
$autocompletes = array();
$relationships = WPDP_Project_Design_Table_Model::get_column_options( $this->table_name, 'relationships', $this->setname, $this->schema_name );
if ( null !== $relationships ) {
if ( isset( $relationships['relationships'] ) ) {
foreach ( $relationships['relationships'] as $relationship ) {
if ( isset( $relationship->relation_type ) ) {
if ( 'lookup' === $relationship->relation_type ) {
array_push( $lookups, $relationship );
} elseif ( 'autocomplete' === $relationship->relation_type ) {
array_push( $autocompletes, $relationship );//phpcs:ignore - 8.1 proof
}
}
}
}
}
$i = 0;
foreach ( $this->form_items as $item ) {
if ( isset( $lookup_column_name[ $item->get_item_name() ] ) ) {
foreach ( $autocompletes as $autocomplete ) {
$source_column_name = $autocomplete->source_column_name[0];
if ( $source_column_name === $item->get_item_name() ) {
$this->form_items[ $i ] = new WPDA_Simple_Form_Item_Autocomplete( $item );
$this->form_items[ $i ]->set_autocomplete( $autocomplete, $tableform );
$this->form_items[ $i ]->set_item_class( 'hide_item' );
}
}
foreach ( $lookups as $lookup ) {
// Lookups are always based on a single column. Use first element of array.
$source_column_name = $lookup->source_column_name[0];
if ( $source_column_name === $item->get_item_name() ) {
// Add lookup listbox
$target_column_name = str_replace( '`', '', $lookup->target_column_name[0] );
$target_table_name = str_replace( '`', '', $lookup->target_table_name );
if ( isset( $lookup->target_schema_name ) ) {
$target_schema_name = $lookup->target_schema_name;
} else {
$target_schema_name = $this->schema_name;
}
if ( isset( $lookup_column_name[ $source_column_name ] ) ) {
$wpdadb = WPDADB::get_db_connection( $target_schema_name );
if ( null !== $wpdadb ) {
$where = '';
for ( $j = 1; $j < count( $lookup->source_column_name ); $j++ ) {//phpcs:ignore - 8.1 proof
$item_index = $this->get_item_index( $lookup->source_column_name[ $j ] );
if ( false !== $item_index ) {
$item_value = $this->parent['parent_key_value'][ $this->parent['parent_key'][ $j - 1 ] ];
if ( 'number' == WPDA::get_type( $this->form_items[ $item_index ]->get_data_type() ) ) {
$where .= $wpdadb->prepare(
( '' === $where ? 'where' : 'and' ) . " {$lookup->target_column_name[ $j ]} = %d ",
array( $item_value )
);
} else {
$where .= $wpdadb->prepare(
( '' === $where ? 'where' : 'and' ) . " {$lookup->target_column_name[ $j ]} = %s ",
array( $item_value )
);
}
}
}
if ( '' === $target_schema_name ) {
$lookup_sql_table_name = "`$target_table_name`";
} else {
$lookup_sql_table_name = "`{$wpdadb->dbname}`.`$target_table_name`";
}
$lookup_sql =
'select `' . str_replace( '`', '', $lookup_column_name[ $source_column_name ] ) . "`, `$target_column_name` " .
"from $lookup_sql_table_name " .
$where .
'order by `' . str_replace( '`', '', $lookup_column_name[ $source_column_name ] ) . "`, `$target_column_name`";
$rows = $wpdadb->get_results( $lookup_sql, 'ARRAY_A' );
$lov_values = array();
$lov_options = array();
if ( isset( $relationships['table'] ) ) {
foreach ( $relationships['table'] as $table_column ) {
if ( isset( $table_column->column_name ) && isset( $table_column->mandatory ) ) {
if ( $table_column->column_name === $source_column_name && 'No' === $table_column->mandatory ) {
array_push( $lov_values, '' );//phpcs:ignore - 8.1 proof
array_push( $lov_options, '' );//phpcs:ignore - 8.1 proof
}
}
}
}
foreach ( $rows as $row ) {
$hide_id = false;
foreach ( $tableform as $tableformitem ) {
if ( isset( $tableformitem->column_name ) ) {
if ( $tableformitem->column_name === $source_column_name ) {
$hide_id = isset( $tableformitem->hide_lookup_key ) ?
'on' === $tableformitem->hide_lookup_key : false;
break;
}
}
}
if ( $hide_id ) {
$lov_value = $row[ $lookup_column_name[ $source_column_name ] ];
} else {
$lov_value = $row[ $lookup_column_name[ $source_column_name ] ] . ' (' . $row[ $target_column_name ] . ')';
}
array_push( $lov_values, $lov_value );//phpcs:ignore - 8.1 proof
array_push( $lov_options, $row[ $target_column_name ] );//phpcs:ignore - 8.1 proof
}
$item->set_enum( $lov_values );
$item->set_enum_options( $lov_options );
$this->form_items[ $i ] = new WPDA_Simple_Form_Item_Enum( $item );
}
}
}
}
}
$i ++;
}
}
}
}
}