Files
doitinpoland.com/wp-content/plugins/wpml-media-translation/classes/media-selector/class-wpml-media-selector.php
2023-09-12 21:41:04 +02:00

188 lines
5.7 KiB
PHP

<?php
class WPML_Media_Selector implements IWPML_Action {
/**
* @var SitePress
*/
private $sitepress;
/**
* @var WPML_Twig_Template_Loader
*/
private $template_loader;
/**
* @var WPML_Media_Post_With_Media_Files_Factory
*/
private $post_with_media_files_factory;
/**
* @var WPML_Media_Post_With_Media_Files_Factory
*/
private $translation_element_factory;
const USER_META_HIDE_POST_MEDIA_SELECTOR = '_wpml_media_hide_post_media_selector';
public function __construct(
SitePress $sitepress,
WPML_Twig_Template_Loader $template_loader,
WPML_Media_Post_With_Media_Files_Factory $post_with_media_files_factory,
WPML_Translation_Element_Factory $translation_element_factory
) {
$this->sitepress = $sitepress;
$this->template_loader = $template_loader;
$this->post_with_media_files_factory = $post_with_media_files_factory;
$this->translation_element_factory = $translation_element_factory;
}
public function add_hooks() {
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_res' ) );
add_action( 'wp_ajax_wpml_media_load_image_selector', array( $this, 'load_images_selector' ) );
add_action( 'wp_ajax_wpml_media_toogle_show_media_selector', array( $this, 'toggle_show_media_selector' ) );
add_filter( 'wpml_translation_dashboard_row_data', array( $this, 'add_media_data_to_dashboard_row' ), 10, 2 );
add_action( 'wpml_tm_after_translation_dashboard_documents', array( $this, 'add_media_selector_preloader' ) );
}
public function enqueue_res() {
$current_screen = get_current_screen();
if ( $current_screen->id === 'wpml_page_' . $this->sitepress->get_wp_api()->constant( 'WPML_TM_FOLDER' ) . '/menu/main' ) {
$wpml_media_url = $this->sitepress->get_wp_api()->constant( 'WPML_MEDIA_URL' );
wp_enqueue_script( 'wpml-media-selector', $wpml_media_url . '/res/js/media-selector.js', array( 'jquery' ), false, true );
wp_enqueue_style( 'wpml-media-selector', $wpml_media_url . '/res/css/media-selector.css', array() );
}
}
public function load_images_selector() {
$post_id = (int) $_POST['post_id'];
if ( isset( $_POST['languages'] ) && is_array( $_POST['languages'] ) ) {
$languages = array_map( 'sanitize_text_field', $_POST['languages'] );
} else {
$languages = array();
}
$media_files_list = $this->get_media_files_list( $post_id, $languages );
$media_files_count = count( $media_files_list );
$model = array(
'files' => $media_files_list,
'post_id' => $post_id,
);
$html = $this->template_loader->get_template()->show( $model, 'media-selector.twig' );
wp_send_json_success(
array(
'html' => $html,
'media_files_count' => $media_files_count,
)
);
}
/**
* @param int $post_id
* @param array $languages
*
* @return array
*/
private function get_media_files_list( $post_id, $languages ) {
$media_files_list = array();
$post_with_media = $this->post_with_media_files_factory->create( $post_id );
$media_ids = $post_with_media->get_media_ids();
foreach ( $media_ids as $attachment_id ) {
$media_files_list[ $attachment_id ] = array(
'thumbnail' => wp_get_attachment_thumb_url( $attachment_id ),
'name' => get_post_field( 'post_title', $attachment_id ),
'translated' => $this->media_file_is_translated( $attachment_id, $languages ),
);
}
return $media_files_list;
}
private function media_file_is_translated( $attachment_id, $languages ) {
$post_element = $this->translation_element_factory->create( $attachment_id, 'post' );
foreach ( $languages as $language ) {
$translation = $post_element->get_translation( $language );
if ( null === $translation || get_post_meta( $attachment_id, '_wp_attached_file', true )
=== get_post_meta( $translation->get_id(), '_wp_attached_file', true ) ) {
return false;
}
}
return true;
}
public function toggle_show_media_selector() {
$current_value = get_user_meta( get_current_user_id(), self::USER_META_HIDE_POST_MEDIA_SELECTOR, true );
update_user_meta( get_current_user_id(), self::USER_META_HIDE_POST_MEDIA_SELECTOR, ! $current_value );
wp_send_json_success();
}
/**
* @param array $row_data
* @param stdClass $doc_data
*
* @return array
*/
public function add_media_data_to_dashboard_row( $row_data, $doc_data ) {
if ( 0 !== strpos( $doc_data->translation_element_type, 'post_' ) ) {
return $row_data;
}
$row_data = $this->add_post_has_media_flag( $row_data, $doc_data->ID );
$row_data = $this->add_post_type_attribute_data( $row_data, $doc_data->ID );
return $row_data;
}
/**
* @param array $data
* @param int $post_id
*
* @return array
*/
private function add_post_has_media_flag( array $data, $post_id ) {
$data['has-media'] = get_post_meta( $post_id, WPML_Media_Set_Posts_Media_Flag::HAS_MEDIA_POST_FLAG, true );
return $data;
}
/**
* @param array $data
* @param int $post_id
*
* @return array
*/
private function add_post_type_attribute_data( $data, $post_id ) {
$post_type = get_post_type( $post_id );
$post_type_object = get_post_type_object( $post_type );
$data['post-type'] = strtolower( $post_type_object->labels->singular_name );
return $data;
}
public function add_media_selector_preloader() {
$model = array(
'strings' => array(
'has_posts' => sprintf(
__(
'Choose which media to translate with this %s',
'wpml-media'
),
'%POST_TYPE%'
),
'loading' => __( 'Loading...', 'wpml-media' ),
),
'hide_selector' => get_user_meta( get_current_user_id(), self::USER_META_HIDE_POST_MEDIA_SELECTOR, true ),
);
echo $this->template_loader->get_template()->show( $model, 'media-selector-preloader.twig' );
}
}