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

226 lines
6.7 KiB
PHP

<?php
/**
* Class WPML_TF_Feedback_Query
*
* @author OnTheGoSystems
*/
class WPML_TF_Feedback_Query {
/** @var WPML_TF_Data_Object_Storage $feedback_storage */
private $feedback_storage;
/** @var WPML_TF_Data_Object_Storage $message_storage */
private $message_storage;
/** @var WPML_TF_Collection_Filter_Factory $collection_filter_factory */
private $collection_filter_factory;
/** @var WPML_TF_Feedback_Collection $unfiltered_feedback_collection */
private $unfiltered_feedback_collection;
/** @var int $unfiltered_items_count */
private $unfiltered_items_count;
/** @var int $trashed_items_count */
private $trashed_items_count;
/** @var int $total_items_count */
private $total_items_count;
/** @var int $filtered_items_count */
private $filtered_items_count;
/** @var bool $is_in_trash */
private $is_in_trash = false;
/**
* WPML_TF_Feedback_Collection_Factory constructor.
*
* @param WPML_TF_Data_Object_Storage $feedback_storage
* @param WPML_TF_Data_Object_Storage $message_storage
* @param WPML_TF_Collection_Filter_Factory $collection_filter_factory
*/
public function __construct(
WPML_TF_Data_Object_Storage $feedback_storage,
WPML_TF_Data_Object_Storage $message_storage,
WPML_TF_Collection_Filter_Factory $collection_filter_factory
) {
$this->feedback_storage = $feedback_storage;
$this->message_storage = $message_storage;
$this->collection_filter_factory = $collection_filter_factory;
}
/**
* @return WPML_TF_Feedback_Collection
*/
public function get_unfiltered_collection() {
if ( ! $this->unfiltered_feedback_collection ) {
$storage_filters = array(
'exclude_rating_only' => true,
);
if ( ! current_user_can( 'manage_options' ) ) {
$storage_filters['reviewer_id'] = get_current_user_id();
}
$feedback_collection_filter = $this->collection_filter_factory->create( 'feedback', $storage_filters );
$this->unfiltered_feedback_collection = $this->feedback_storage->get_collection( $feedback_collection_filter );
$this->unfiltered_items_count = count( $this->unfiltered_feedback_collection );
}
return $this->unfiltered_feedback_collection;
}
/**
* @param array $args
*
* @return WPML_TF_Feedback_Collection
*/
public function get( array $args ) {
$feedback_collection = clone $this->get_unfiltered_collection();
$feedback_collection = $this->trash_filter_collection( $feedback_collection, $args );
$feedback_collection = $this->filter_collection( $feedback_collection, $args );
$feedback_collection = $this->sort_collection( $feedback_collection, $args );
$feedback_collection = $this->apply_pagination( $feedback_collection, $args );
$message_filter_args = array( 'feedback_ids' => $feedback_collection->get_ids() );
$message_collection_filter = $this->collection_filter_factory->create( 'message', $message_filter_args );
/** @var WPML_TF_Message_Collection $message_collection */
$message_collection = $this->message_storage->get_collection( $message_collection_filter );
$feedback_collection->link_messages_to_feedback( $message_collection );
return $feedback_collection;
}
/**
* @param WPML_TF_Feedback_Collection $feedback_collection
* @param array $args
*
* @return WPML_TF_Feedback_Collection
*/
public function trash_filter_collection( WPML_TF_Feedback_Collection $feedback_collection, array $args ) {
if ( isset( $args['status'] ) && 'trash' === $args['status'] ) {
$this->is_in_trash = true;
$feedback_collection->filter_by( 'status', 'trash' );
$this->trashed_items_count = count( $feedback_collection );
$this->total_items_count = $this->unfiltered_items_count - $this->trashed_items_count;
} else {
$feedback_collection->remove_trashed();
$this->total_items_count = count( $feedback_collection );
$this->trashed_items_count = $this->unfiltered_items_count - $this->total_items_count;
}
return $feedback_collection;
}
/**
* @param WPML_TF_Feedback_Collection $feedback_collection
* @param array $args
*
* @return WPML_TF_Feedback_Collection
*/
private function filter_collection( WPML_TF_Feedback_Collection $feedback_collection, array $args ) {
if ( isset( $args['status'] ) && 'trash' !== $args['status'] ) {
$feedback_collection->filter_by( 'status', $args['status'] );
} elseif ( isset( $args['language'] ) ) {
$feedback_collection->filter_by( 'language', $args['language'] );
} elseif ( isset( $args['post_id'] ) ) {
$feedback_collection->filter_by( 'post_id', $args['post_id'] );
}
$this->filtered_items_count = count( $feedback_collection );
return $feedback_collection;
}
/**
* @param WPML_TF_Feedback_Collection $feedback_collection
* @param array $args
*
* @return WPML_TF_Feedback_Collection
*/
private function sort_collection( WPML_TF_Feedback_Collection $feedback_collection, array $args ) {
$order_by = 'pending';
$order = 'desc';
if ( isset( $args['orderby'] ) ) {
$order_by = $args['orderby'];
}
if ( isset( $args['order'] ) ) {
$order = $args['order'];
}
$feedback_collection->sort_collection( $order_by, $order );
return $feedback_collection;
}
/**
* @param WPML_TF_Feedback_Collection $feedback_collection
* @param array $args
*
* @return WPML_TF_Feedback_Collection
*/
private function apply_pagination( WPML_TF_Feedback_Collection $feedback_collection, array $args ) {
if ( isset( $args['paged'], $args['items_per_page'] ) ) {
$offset = $args['items_per_page'] * max( 0, $args['paged'] - 1 );
$feedback_collection->reduce_collection( $offset, $args['items_per_page'] );
}
return $feedback_collection;
}
/**
* @return int
*/
public function get_total_items_count() {
return $this->total_items_count;
}
/** @return int */
public function get_total_trashed_items_count() {
return $this->trashed_items_count;
}
/** @return int */
public function get_filtered_items_count() {
return $this->filtered_items_count;
}
/** @return bool */
public function is_in_trash() {
return $this->is_in_trash;
}
/**
* @param int $feedback_id
* @param bool $with_messages
*
* @return null|\IWPML_TF_Data_Object
*/
public function get_one( $feedback_id, $with_messages = true ) {
$feedback = $this->feedback_storage->get( $feedback_id );
if ( $feedback && $with_messages ) {
$filter_args = array(
'feedback_id' => $feedback_id,
);
$filter = new WPML_TF_Message_Collection_Filter( $filter_args );
$messages = $this->message_storage->get_collection( $filter );
foreach ( $messages as $message ) {
$feedback->add_message( $message );
}
}
return $feedback;
}
}