Files
doitinpoland.com/wp-content/plugins/wpml-translation-management/classes/translation-jobs/class-wpml-tm-job-layout.php
2023-09-12 21:41:04 +02:00

151 lines
4.1 KiB
PHP

<?php
use \WPML\TM\Jobs\FieldId;
class WPML_TM_Job_Layout {
private $layout = array();
private $custom_fields = array();
private $grouped_custom_fields = array();
private $terms = array();
private $wp_api;
public $wpdb;
public function __construct( wpdb $wpdb, WPML_WP_API $wp_api ) {
$this->wpdb = $wpdb;
$this->wp_api = $wp_api;
}
public function get_wpdb() {
return $this->wpdb;
}
public function run( array $fields, $tm_instance = null ) {
foreach ( $fields as $field ) {
$this->layout[] = $field['field_type'];
}
$this->order_main_fields();
$this->extract_terms();
$this->extract_custom_fields( $tm_instance );
$this->append_terms();
$this->append_grouped_custom_fields();
$this->append_custom_fields();
return apply_filters( 'wpml_tm_job_layout', array_values( $this->layout ) );
}
private function order_main_fields() {
$ordered_elements = array();
foreach ( array( 'title', 'body', 'excerpt' ) as $type ) {
foreach ( $this->layout as $key => $element ) {
if ( $element === $type ) {
unset( $this->layout[ $key ] );
$ordered_elements[] = $type;
}
}
}
$this->layout = array_merge( $ordered_elements, $this->layout );
}
private function extract_custom_fields( $tm_instance ) {
foreach ( $this->layout as $key => $field ) {
if ( FieldId::is_a_custom_field( $field ) ) {
$group = $this->get_group_custom_field_belongs_to( $field, $tm_instance );
if ( $group ) {
if ( ! isset( $this->grouped_custom_fields[ $group ] ) ) {
$this->grouped_custom_fields[ $group ] = array();
}
$this->grouped_custom_fields[ $group ][] = $field;
} else {
$this->custom_fields[] = $field;
}
unset( $this->layout[ $key ] );
}
}
}
private function get_group_custom_field_belongs_to( $field, $tm_instance ) {
$group = '';
if ( $tm_instance ) {
$settings = new WPML_Custom_Field_Editor_Settings( new WPML_Custom_Field_Setting_Factory( $tm_instance ) );
$group = $settings->get_group( WPML_TM_Field_Type_Sanitizer::sanitize( $field ) );
}
return $group;
}
private function extract_terms() {
foreach ( $this->layout as $key => $field ) {
if ( FieldId::is_any_term_field( $field ) ) {
$this->terms[] = $field;
unset( $this->layout[ $key ] );
}
}
}
private function append_grouped_custom_fields() {
foreach ( $this->grouped_custom_fields as $group => $fields ) {
$data = array(
'field_type' => 'tm-section',
'title' => $group,
'fields' => $fields,
'empty' => false,
'empty_message' => '',
'sub_title' => '',
);
$this->layout[] = $data;
}
}
private function append_custom_fields() {
if ( count( $this->custom_fields ) ) {
$data = array(
'field_type' => 'tm-section',
'title' => __( 'Custom Fields', 'wpml-translation-management' ),
'fields' => $this->custom_fields,
'empty' => false,
'empty_message' => '',
'sub_title' => '',
);
$this->layout[] = $data;
}
}
private function append_terms() {
if ( count( $this->terms ) ) {
$taxonomy_fields = [];
foreach ( $this->terms as $term ) {
$term_id = FieldId::get_term_id( $term );
$query = $this->wpdb->prepare( "SELECT taxonomy FROM {$this->wpdb->term_taxonomy} WHERE term_taxonomy_id = %d", $term_id );
$taxonomy = $this->wpdb->get_var( $query );
if ( ! isset( $taxonomy_fields[ $taxonomy ] ) ) {
$taxonomy_fields[ $taxonomy ] = [];
}
$taxonomy_fields[ $taxonomy ][] = $term;
}
foreach ( $taxonomy_fields as $taxonomy => $fields ) {
$taxonomy = $this->wp_api->get_taxonomy( $taxonomy );
$data = array(
'field_type' => 'tm-section',
'title' => $taxonomy->labels->name,
'fields' => $fields,
'empty' => false,
'empty_message' => '',
'sub_title' => __( 'Changes in these translations will affect terms in general! (Not only for this post)', 'wpml-translation-management' ),
);
$this->layout[] = $data;
}
}
}
}