wpml-update-translation-data-action.class.php
4.21 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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
use WPML\FP\Obj;
use WPML\TM\API\Job\Map;
abstract class WPML_TM_Update_Translation_Data_Action extends WPML_Translation_Job_Helper_With_API {
function get_prev_job_data( $rid ) {
global $wpdb;
// if we have a previous job_id for this rid mark it as the top (last) revision
return $wpdb->get_row(
$wpdb->prepare(
"SELECT job_id, translated
FROM {$wpdb->prefix}icl_translate_job
WHERE rid=%d
AND revision IS NULL
LIMIT 1",
$rid
),
ARRAY_N
);
}
/**
* Adds a translation job record in icl_translate_job
*
* @param mixed $rid
* @param mixed $translator_id
* @param $translation_package
* @param array $batch_options
*
* @return bool|int
*/
function add_translation_job( $rid, $translator_id, array $translation_package, array $batch_options ) {
global $wpdb, $current_user;
$previousStatus = \WPML_TM_ICL_Translation_Status::makeByRid( $rid )->previous();
if (
$previousStatus->map( Obj::prop( 'status' ) )->getOrElse( null ) === (string) ICL_TM_ATE_CANCELLED
) {
$job_id = Map::fromRid( $rid );
} else {
$translation_status = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}icl_translation_status WHERE rid=%d", $rid ) );
$prev_translation = $this->get_translated_field_values( $rid, $translation_package );
if ( ! $current_user->ID ) {
$manager_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT manager_id FROM {$wpdb->prefix}icl_translate_job WHERE rid=%d ORDER BY job_id DESC LIMIT 1",
$rid
)
);
} else {
$manager_id = $current_user->ID;
}
$translate_job_insert_data = array(
'rid' => $rid,
'translator_id' => $translator_id,
'translated' => 0,
'manager_id' => (int) $manager_id,
);
if ( isset( $batch_options['deadline_date'] ) ) {
$translate_job_insert_data['deadline_date'] = $batch_options['deadline_date'];
}
if ( isset( $translation_package['title'] ) ) {
$translate_job_insert_data['title'] = WPML\FP\Str::truncate_bytes( $translation_package['title'], 160 );
}
$wpdb->insert( $wpdb->prefix . 'icl_translate_job', $translate_job_insert_data );
$job_id = $wpdb->insert_id;
$this->package_helper->save_package_to_job( $translation_package, $job_id, $prev_translation );
if ( (int) $translation_status->status !== ICL_TM_DUPLICATE ) {
$this->fire_notification_actions( $job_id, $translation_status, $translator_id );
}
}
return $job_id;
}
/**
* @param int $prev_id
* @param array $package
*
* @return mixed
*/
abstract protected function populate_prev_translation( $prev_id, array $package );
/**
* @param int $rid
* @param array $package
*
* @return mixed
*/
protected function get_translated_field_values( $rid, array $package ) {
global $wpdb;
$prev_translations = $this->populate_prev_translation( $rid, $package );
if ( ! $prev_translations ) {
return array();
}
// if we have a previous job_id for this rid mark it as the top (last) revision
list( $prev_job_id, $prev_job_translated ) = $this->get_prev_job_data( $rid );
if ( ! is_null( $prev_job_id ) ) {
$last_rev_prepare = $wpdb->prepare(
"
SELECT MAX(revision)
FROM {$wpdb->prefix}icl_translate_job
WHERE rid=%d
AND ( revision IS NOT NULL OR translated = 1 )
",
$rid
);
$last_rev = $wpdb->get_var( $last_rev_prepare );
$wpdb->update( $wpdb->prefix . 'icl_translate_job', array( 'revision' => $last_rev + 1 ), array( 'job_id' => $prev_job_id ) );
}
return $prev_translations;
}
protected function fire_notification_actions( $job_id, $translation_status, $translator_id ) {
$job = wpml_tm_load_job_factory()->get_translation_job( $job_id, false, 0, true );
if ( $job && $translation_status->translation_service === 'local' ) {
if ( $this->get_tm_setting( array( 'notification', 'new-job' ) ) == ICL_TM_NOTIFICATION_IMMEDIATELY ) {
if ( $job_id ) {
if ( empty( $translator_id ) ) {
do_action( 'wpml_tm_new_job_notification', $job );
} else {
do_action( 'wpml_tm_assign_job_notification', $job, $translator_id );
}
}
}
do_action( 'wpml_added_local_translation_job', $job_id );
}
}
}