class-wpml-tm-translation-batch-factory.php
2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
use WPML\API\Sanitize;
class WPML_TM_Translation_Batch_Factory {
/** @var WPML_Translation_Basket $basket */
private $basket;
/**
* @param WPML_Translation_Basket $basket
*/
public function __construct( WPML_Translation_Basket $basket ) {
$this->basket = $basket;
}
/**
* @param array $batch_data
*
* @return WPML_TM_Translation_Batch
*/
public function create( array $batch_data ) {
$translators = isset( $batch_data['translators'] ) ? $batch_data['translators'] : array();
$basket_name = Sanitize::stringProp( 'basket_name', $batch_data );
$elements = apply_filters(
'wpml_tm_batch_factory_elements',
$this->get_elements( $batch_data, array_keys( $translators ) ),
$basket_name
);
$deadline_date = null;
if ( isset( $batch_data['deadline_date'] ) && $this->validate_deadline( $batch_data['deadline_date'] ) ) {
$deadline_date = new DateTime( $batch_data['deadline_date'] );
}
return new WPML_TM_Translation_Batch(
$elements,
$basket_name ?: '',
$translators,
$deadline_date
);
}
private function get_elements( array $batch_data, array $translators_target_languages ) {
if ( ! isset( $batch_data['batch'] ) || empty( $batch_data['batch'] ) ) {
return array();
}
$basket = $this->basket->get_basket();
if ( ! isset( $basket['post'] ) ) {
$basket['post'] = array();
}
if ( ! isset( $basket['string'] ) ) {
$basket['string'] = array();
}
$basket_items_types = array_keys( $this->basket->get_item_types() );
$result = array();
foreach ( $batch_data['batch'] as $item ) {
$element_id = $item['post_id'];
$element_type = isset( $item['type'] ) && is_string( $item['type'] )
? $item['type']
: '';
if ( ! in_array( $element_type, $basket_items_types, true ) ) {
continue;
}
if ( ! isset( $basket[ $element_type ][ $element_id ] ) ) {
continue;
}
$basket_item = $basket[ $element_type ][ $element_id ];
$target_languages = array_intersect_key(
$basket_item['to_langs'],
array_combine( $translators_target_languages, $translators_target_languages )
);
if ( empty( $target_languages ) ) {
throw new InvalidArgumentException( 'Element\'s target languages do not match to batch list' );
}
$media_to_translations = isset( $basket_item['media-translation'] ) ? $basket_item['media-translation'] : array();
$result[] = new WPML_TM_Translation_Batch_Element(
$element_id,
$element_type,
$basket[ $element_type ][ $element_id ]['from_lang'],
$target_languages,
$media_to_translations
);
}
return $result;
}
/**
* The expected format is "2017-09-28"
*
* @param string $date
*
* @return bool
*/
private function validate_deadline( $date ) {
$date_parts = explode( '-', $date );
return is_array( $date_parts ) &&
count( $date_parts ) === 3 &&
checkdate( (int) $date_parts[1], (int) $date_parts[2], (int) $date_parts[0] );
}
}