job_id = $job_id; $batch_id = $batch_id ? $batch_id : $this->get_batch_id(); $this->batch_id = $batch_id ? $batch_id : TranslationProxy_Batch::update_translation_batch(); $this->blog_translators = $blog_translators ? $blog_translators : wpml_tm_load_blog_translators(); } public abstract function cancel(); public abstract function get_original_element_id(); public abstract function to_array(); /** * @return string */ abstract function get_title(); public function get_status() { if ( $this->status == - 1 ) { $this->status = $this->load_status(); } return $this->status; } public function get_status_value() { $this->maybe_load_basic_data(); return $this->basic_data->status; } public function get_id() { return $this->job_id; } public function get_resultant_element_id( $force = false ) { if ( $this->element_id == - 1 || $force === true ) { $this->element_id = $this->load_resultant_element_id(); } return $this->element_id; } /** * Checks whether the input user is allowed to edit this job * * @param stdClass|WP_User $user * * @return bool */ public function user_can_translate( $user ) { $translator_id = $this->get_translator_id(); $user_can_take_this_job = 0 === $translator_id || $this->is_current_user_allowed_to_translate( $user, $translator_id ); $translator_has_job_language_pairs = $this->blog_translators->is_translator( $user->ID, array( 'lang_from' => $this->get_source_language_code(), 'lang_to' => $this->get_language_code(), ) ); return ( $user_can_take_this_job && $translator_has_job_language_pairs ) || ( method_exists( $user, 'has_cap' ) && $user->has_cap( 'manage_options' ) ) || ( ! method_exists( $user, 'has_cap' ) && user_can( $user->ID, 'manage_options' ) ); } /** * @param WP_User $user * @param int $translator_id * * @return bool */ private function is_current_user_allowed_to_translate( WP_User $user, $translator_id ) { $allowed_translators = apply_filters( 'wpml_tm_allowed_translators_for_job', array(), $this ); $allowed_translators[] = $translator_id; return in_array( (int) $user->ID, $allowed_translators, true ); } public function get_batch_id() { if ( ! isset( $this->batch_id ) ) { $this->load_batch_id(); } return $this->batch_id; } /** * @param bool|false $as_name if true will return the language's display name if applicable * * @return bool|string */ public function get_language_code( $as_name = false ) { $this->maybe_load_basic_data(); $code = isset( $this->basic_data->language_code ) ? $this->basic_data->language_code : false; return $code && $as_name ? $this->lang_code_to_name( $code ) : $code; } /** * @param bool|false $as_name if true will return the language's display name if applicable * * @return bool|string */ function get_source_language_code( $as_name = false ) { $this->maybe_load_basic_data(); $code = isset( $this->basic_data->source_language_code ) ? $this->basic_data->source_language_code : false; return $code && $as_name ? $this->lang_code_to_name( $code ) : $code; } /** * @return string|false */ public function get_translator_name() { $this->maybe_load_basic_data(); if ( $this->basic_data->translation_service == TranslationProxy::get_current_service_id() ) { $this->basic_data->translator_name = TranslationProxy_Translator::get_translator_name( $this->basic_data->translator_id ); } else { $this->basic_data->translator_name = false; } return $this->basic_data->translator_name; } /** * Returns the id of the assigned translator or 0 if no translator is assigned to the job * * @return int */ public function get_translator_id() { $this->maybe_load_basic_data(); $this->basic_data->translator_id = ! empty( $this->basic_data->translator_id ) ? $this->basic_data->translator_id : 0; return (int) $this->basic_data->translator_id; } public function get_basic_data() { $this->maybe_load_basic_data(); return $this->basic_data; } /** * @param int $translator_id * @param string $service * * @return bool true on success false on failure */ public function assign_to( $translator_id, $service = 'local' ) { $this->maybe_load_basic_data(); $prev_translator_id = $this->get_translator_id(); $prev_service = $this->get_translation_service(); if ( $translator_id == $prev_translator_id && $service = $this->get_translation_service() ) { return true; } $this->basic_data->translator_id = $translator_id; $this->basic_data->translation_service = $service; if ( $this->save_updated_assignment() === false ) { $this->basic_data->translator_id = $prev_translator_id; $this->basic_data->translation_service = $prev_service; return false; } $job_id = $this->get_id(); if ( $this->get_tm_setting( array( 'notification', 'resigned' ) ) == ICL_TM_NOTIFICATION_IMMEDIATELY && ! empty( $prev_translator_id ) && $prev_translator_id != $translator_id && $job_id ) { do_action( 'wpml_tm_remove_job_notification', $prev_translator_id, $this ); } if ( $this->get_tm_setting( array( 'notification', 'new-job' ) ) == ICL_TM_NOTIFICATION_IMMEDIATELY ) { if ( empty( $translator_id ) ) { do_action( 'wpml_tm_new_job_notification', $this ); } else { do_action( 'wpml_tm_assign_job_notification', $this, $translator_id ); } } return true; } /** * Returns either the translation service id for the job or 'local' for local jobs * * @return int|string */ public function get_translation_service() { $this->maybe_load_basic_data(); $this->basic_data->translation_service = ! empty( $this->basic_data->translation_service ) ? $this->basic_data->translation_service : 'local'; return $this->basic_data->translation_service; } protected abstract function save_updated_assignment(); protected abstract function load_resultant_element_id(); protected abstract function load_status(); protected abstract function load_job_data( $id ); abstract function get_type(); protected function basic_data_to_array( $job_data ) { $this->maybe_load_basic_data(); $data_array = (array) $job_data; if ( isset( $data_array['post_title'] ) ) { $data_array['post_title'] = esc_html( $data_array['post_title'] ); } $data_array['translator_name'] = $this->get_translator_name(); $data_array['batch_id'] = $job_data->batch_id; $data_array['source_language_code'] = $this->basic_data->source_language_code; $data_array['language_code'] = $this->basic_data->language_code; $data_array['translator_html'] = $this->get_translator_html( $this->basic_data ); $data_array['type'] = $this->get_type(); $data_array['lang_text'] = $this->generate_lang_text(); return $data_array; } protected function maybe_load_basic_data() { if ( ! $this->basic_data ) { $this->basic_data = $this->load_job_data( $this->job_id ); $this->basic_data = $this->basic_data ? $this->basic_data : new stdClass(); } } private function get_inactive_translation_service( $translation_service_id ) { $cache_key = $translation_service_id; $cache_group = 'get_inactive_translation_service'; $cache_found = false; $service = wp_cache_get( $cache_key, $cache_group, false, $cache_found ); if ( ! $cache_found ) { try { $service = TranslationProxy_Service::get_service( $translation_service_id ); } catch ( WPMLTranslationProxyApiException $ex ) { $service = false; } if ( ! $service ) { $service = new stdClass(); $service->name = __( '(inactive and unknown service)', 'wpml-translation-management' ); } wp_cache_set( $cache_key, $service, $cache_group ); } return $service; } protected function get_translator_html( $job ) { $job = (object) $job; $current_service_name = TranslationProxy::get_current_service_name(); $translation_services = array( 'local', TranslationProxy::get_current_service_id() ); if ( isset( $job->translation_service ) && ! in_array( $job->translation_service, $translation_services ) ) { $inactive_service = $this->get_inactive_translation_service( $job->translation_service ); $current_service_name = $inactive_service->name; } $translator = ''; if ( $job->translation_service && $job->translation_service !== 'local' ) { try { $project = TranslationProxy::get_current_project(); if ( $project ) { $translator .= $current_service_name; } else { $translator .= esc_html( $job->translator_name ); } } catch ( Exception $e ) { // Just doesn't create the output } } elseif ( $job->status == ICL_TM_COMPLETE ) { $translator_data = get_userdata( $job->translator_id ); $translator_name = $translator_data ? $translator_data->display_name : ""; $translator = '' . $translator_name . ''; } else { $translator .= ''; $selected_translator = isset( $job->translator_id ) ? $job->translator_id : false; $disabled = false; if ( $job->translation_service && $job->translation_service !== 'local' && is_numeric( $job->translation_service ) ) { $selected_translator = TranslationProxy_Service::get_wpml_translator_id( $job->translation_service, $job->translator_id ); $disabled = true; } $job_id = isset( $job->job_id ) ? $job->job_id : $job->id; $local_only = isset( $job->local_only ) ? $job->local_only : true; $args = array( 'id' => 'icl_tj_translator_for_' . $job_id, 'name' => 'icl_tj_translator_for_' . ( $job_id ), 'from' => $job->source_language_code, 'to' => $job->language_code, 'selected' => $selected_translator, 'services' => $translation_services, 'disabled' => $disabled, 'echo' => false, 'local_only' => $local_only ); $translators_dropdown = new WPML_TM_Translators_Dropdown( $this->blog_translators ); $translator .= $translators_dropdown->render( $args ); $translator .= ''; $translator .= ''; $translator .= ''; $translator .= ' '; $translator .= ''; $translator .= ''; } return $translator; } protected function load_batch_id() { global $wpdb; list( $table, $col ) = $this->get_batch_id_table_col(); $this->batch_id = $wpdb->get_var( $wpdb->prepare( " SELECT batch_id FROM {$table} WHERE {$col} = %d LIMIT 1", $this->job_id ) ); } protected abstract function get_batch_id_table_col(); /** * @return string */ protected function generate_lang_text() { $this->maybe_load_basic_data(); return $this->lang_code_to_name( $this->get_source_language_code() ) . html_entity_decode( ' » ' ) . $this->lang_code_to_name( $this->get_language_code() ); } /** * @param string $code * * @return string */ private function lang_code_to_name( $code ) { global $sitepress; $lang_details = $sitepress->get_language_details( $code ); return isset( $lang_details['display_name'] ) ? $lang_details['display_name'] : $code; } /** * @param string $name * * @return mixed */ protected function get_basic_data_property( $name ) { $value = null; $this->maybe_load_basic_data(); if ( isset( $this->basic_data->{$name} ) ) { $value = $this->basic_data->{$name}; } return $value; } }