Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/classes/translation-feedback/views/wpml-tf-backend-feedback-list-view.php
2023-09-12 21:41:04 +02:00

223 lines
7.4 KiB
PHP

<?php
use WPML\API\Sanitize;
/**
* Class WPML_TF_Backend_Feedback_List_View
*
* @author OnTheGoSystems
*/
class WPML_TF_Backend_Feedback_List_View {
const TEMPLATE_FOLDER = '/templates/translation-feedback/backend/';
const TEMPLATE_NAME = 'feedback-list-page.twig';
const ITEMS_PER_PAGE = 20;
/** @var IWPML_Template_Service $template_service */
private $template_service;
/** @var WPML_TF_Feedback_Query $feedback_query */
private $feedback_query;
/** @var WPML_Admin_Pagination $pagination */
private $pagination;
/** @var WPML_Admin_Table_Sort $table_sort */
private $table_sort;
/** @var WPML_TF_Feedback_Page_Filter $page_filter */
private $page_filter;
/**
* WPML_TF_Backend_Feedback_List_View constructor.
*
* @param IWPML_Template_Service $template_service
* @param WPML_TF_Feedback_Query $feedback_query
* @param WPML_Admin_Pagination $pagination
* @param WPML_Admin_Table_Sort $table_sort
* @param WPML_TF_Feedback_Page_Filter $page_filter
*/
public function __construct(
IWPML_Template_Service $template_service,
WPML_TF_Feedback_Query $feedback_query,
WPML_Admin_Pagination $pagination,
WPML_Admin_Table_Sort $table_sort,
WPML_TF_Feedback_Page_Filter $page_filter
) {
$this->template_service = $template_service;
$this->feedback_query = $feedback_query;
$this->pagination = $pagination;
$this->table_sort = $table_sort;
$this->page_filter = $page_filter;
}
/** @return string */
public function render_page() {
$args = $this->parse_request_args();
$feedback_collection = $this->feedback_query->get( $args );
$model = array(
'strings' => $this->get_strings(),
'columns' => $this->get_columns(),
'pagination' => $this->get_pagination( $args ),
'page_filters' => $this->get_page_filters(),
'admin_page_hook' => WPML_TF_Backend_Hooks::PAGE_HOOK,
'current_query' => $this->get_current_query(),
'nonce' => wp_create_nonce( WPML_TF_Backend_Hooks::PAGE_HOOK ),
'ajax_action' => WPML_TF_Backend_AJAX_Feedback_Edit_Hooks_Factory::AJAX_ACTION,
'ajax_nonce' => wp_create_nonce( WPML_TF_Backend_AJAX_Feedback_Edit_Hooks_Factory::AJAX_ACTION ),
'has_admin_capabilities' => current_user_can( 'manage_options' ),
'is_in_trash' => $this->feedback_query->is_in_trash(),
'feedback_collection' => $feedback_collection,
);
return $this->template_service->show( $model, self::TEMPLATE_NAME );
}
/** @return array */
private function parse_request_args() {
$args = array(
'paged' => 1,
'items_per_page' => self::ITEMS_PER_PAGE,
);
if ( isset( $_GET['paged'] ) ) {
$args['paged'] = filter_var( $_GET['paged'], FILTER_SANITIZE_NUMBER_INT );
}
if ( isset( $_GET['order'], $_GET['orderby'] ) ) {
$args['order'] = Sanitize::stringProp( 'order', $_GET );
$args['orderby'] = Sanitize::stringProp( 'orderby', $_GET );
}
if ( isset( $_GET['status'] ) ) {
$args['status'] = Sanitize::stringProp( 'status', $_GET );
} elseif ( isset( $_GET['language'] ) ) {
$args['language'] = Sanitize::stringProp( 'language', $_GET );
}
if ( isset( $_GET['post_id'] ) ) {
$args['post_id'] = filter_var( $_GET['post_id'], FILTER_SANITIZE_NUMBER_INT );
}
return $args;
}
/** @return array */
private function get_strings() {
$strings = array(
'page_title' => __( 'Translation Feedback', 'sitepress' ),
'page_subtitle' => __( 'Issues with translations', 'sitepress' ),
'table_header' => WPML_TF_Backend_Feedback_Row_View::get_columns_strings(),
'screen_reader' => array(
'select_all' => __( 'Select All', 'sitepress' ),
),
'pagination' => array(
'list_navigation' => __( 'Feedback list navigation', 'sitepress' ),
'first_page' => __( 'First page', 'sitepress' ),
'previous_page' => __( 'Previous page', 'sitepress' ),
'next_page' => __( 'Next page', 'sitepress' ),
'last_page' => __( 'Last page', 'sitepress' ),
'current_page' => __( 'Current page', 'sitepress' ),
'of' => __( 'of', 'sitepress' ),
),
'bulk_actions' => array(
'select' => __( 'Select bulk action', 'sitepress' ),
'apply_button' => __( 'Apply', 'sitepress' ),
'options' => array(
'-1' => __( 'Bulk Actions', 'sitepress' ),
'fixed' => __( 'Mark as fixed', 'sitepress' ),
'pending' => __( 'Mark as new', 'sitepress' ),
'trash' => __( 'Move to trash', 'sitepress' ),
),
),
'row_summary' => WPML_TF_Backend_Feedback_Row_View::get_summary_strings(),
'row_details' => WPML_TF_Backend_Feedback_Row_View::get_details_strings(),
'no_feedback' => __( 'No feedback found.', 'sitepress' ),
);
if ( $this->feedback_query->is_in_trash() ) {
$strings['bulk_actions']['options'] = array(
'-1' => __( 'Bulk Actions', 'sitepress' ),
'untrash' => __( 'Restore', 'sitepress' ),
'delete' => __( 'Delete permanently', 'sitepress' ),
);
}
return $strings;
}
/** @return array */
private function get_columns() {
$this->table_sort->set_primary_column( 'feedback' );
return array(
'feedback' => array(
'url' => $this->table_sort->get_column_url( 'feedback' ),
'classes' => $this->table_sort->get_column_classes( 'feedback' ),
),
'rating' => array(
'url' => $this->table_sort->get_column_url( 'rating' ),
'classes' => $this->table_sort->get_column_classes( 'rating' ),
),
'status' => array(
'url' => $this->table_sort->get_column_url( 'status' ),
'classes' => $this->table_sort->get_column_classes( 'status' ),
),
'document_url' => array(
'url' => $this->table_sort->get_column_url( 'document_title' ),
'classes' => $this->table_sort->get_column_classes( 'document_title' ),
),
'date' => array(
'url' => $this->table_sort->get_column_url( 'date' ),
'classes' => $this->table_sort->get_column_classes( 'date' ),
),
);
}
/**
* @param array $args
*
* @return array
*/
private function get_pagination( array $args ) {
$this->pagination->set_total_items( $this->feedback_query->get_filtered_items_count() );
$this->pagination->set_items_per_page( $args['items_per_page'] );
$this->pagination->set_current_page( $args['paged'] );
return array(
'first_page' => $this->pagination->get_first_page_url(),
'previous_page' => $this->pagination->get_previous_page_url(),
'next_page' => $this->pagination->get_next_page_url(),
'last_page' => $this->pagination->get_last_page_url(),
'current_page' => $this->pagination->get_current_page(),
'total_pages' => $this->pagination->get_total_pages(),
'total_items' => sprintf(
_n( '%s item', '%s items', $this->pagination->get_total_items() ),
$this->pagination->get_total_items()
),
);
}
/** @return array */
private function get_page_filters() {
$this->page_filter->populate_counters_and_labels();
return array(
'all_and_trash' => $this->page_filter->get_all_and_trash_data(),
'statuses' => $this->page_filter->get_statuses_data(),
'languages' => $this->page_filter->get_languages_data(),
);
}
/** @return array */
private function get_current_query() {
return array(
'filters' => $this->page_filter->get_current_filters(),
'sorters' => $this->table_sort->get_current_sorters(),
);
}
}