File: /home/nciq25gegoxa/public_html/wp-content/plugins/filebird/includes/Classes/Tree.php
<?php
namespace FileBird\Classes;
defined( 'ABSPATH' ) || exit;
use FileBird\Model\Folder as FolderModel;
use FileBird\Model\UserSettingModel;
class Tree {
private $order = null;
private $order_by = null;
private $search = null;
private $userSettingModel;
public function __construct( $orderby, $order, $search ) {
$this->userSettingModel = UserSettingModel::getInstance();
$orderSetting = $this->userSettingModel->get( 'DEFAULT_SORT_FOLDERS' );
$this->search = $search;
if ( 'reset' === $order ) {
$this->userSettingModel->setSettings(
array(
'DEFAULT_SORT_FOLDERS' => null,
)
);
} elseif ( $order && $orderby ) {
$this->order = $order;
$this->order_by = $orderby;
$this->userSettingModel->setSettings(
array(
'DEFAULT_SORT_FOLDERS' => array(
'orderby' => $orderby,
'order' => $order,
),
)
);
} elseif ( is_array( $orderSetting ) ) {
$this->order = $orderSetting['order'];
$this->order_by = $orderSetting['orderby'];
}
}
public function get( $flat = false ) {
$folders_from_db = FolderModel::allFolders( '*', null, $this->order_by, $this->order, $this->search );
$folder_colors = get_option( 'fbv_folder_colors', array() );
$tree = array();
$folders_from_db = self::prepareTreeData( $folders_from_db, $folder_colors );
$groups = self::groupByParent( $folders_from_db );
if ( ! empty( $this->search ) ) {
return $folders_from_db;
}
if ( $flat === true ) {
$tree = self::getFlatTreeByGroups( $groups, 0 );
} else {
$tree = self::getTreeByGroups( $groups, 0 );
}
return $tree;
}
public static function getCount( $folder_id, $lang = null ) {
global $wpdb;
$select = "SELECT COUNT(*) FROM {$wpdb->posts} as posts WHERE ";
$where = array( "post_type = 'attachment'" );
// With $folder_id == -1. We get all
$where[] = "(posts.post_status = 'inherit' OR posts.post_status = 'private')";
// with specific folder
if ( $folder_id > 0 && ! apply_filters( 'fbv_speedup_get_count_query', false ) ) {
$post__in = $wpdb->get_col( "SELECT `attachment_id` FROM {$wpdb->prefix}fbv_attachment_folder WHERE `folder_id` = " . (int) $folder_id );
if ( count( $post__in ) == 0 ) {
$post__in = array( 0 );
}
$where[] = '(ID IN (' . implode( ', ', $post__in ) . '))';
} elseif ( $folder_id == 0 ) {
return 0;//return 0 if this is uncategorized folder
}
$where = apply_filters( 'fbv_get_count_where_query', $where );
$query = apply_filters( 'fbv_get_count_query', $select . implode( ' AND ', $where ), $folder_id, $lang );
// phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
return (int) $wpdb->get_var( $query );
}
public static function getAllFoldersAndCount( $lang = null ) {
global $wpdb;
$check_author = apply_filters( 'fbv_will_check_author', true );
if( $check_author ) {
$query = $wpdb->prepare(
"SELECT fbva.folder_id, count(fbva.attachment_id) as count FROM {$wpdb->prefix}fbv_attachment_folder as fbva
INNER JOIN {$wpdb->prefix}fbv as fbv ON fbv.id = fbva.folder_id
INNER JOIN {$wpdb->posts} as posts ON fbva.attachment_id = posts.ID
WHERE (posts.post_status = 'inherit' OR posts.post_status = 'private')
AND (posts.post_type = 'attachment')
AND fbv.created_by = %d
GROUP BY fbva.folder_id",
apply_filters( 'fbv_folder_created_by', '0' )
);
} else {
$query = "SELECT fbva.folder_id, count(fbva.attachment_id) as count FROM {$wpdb->prefix}fbv_attachment_folder as fbva
INNER JOIN {$wpdb->prefix}fbv as fbv ON fbv.id = fbva.folder_id
INNER JOIN {$wpdb->posts} as posts ON fbva.attachment_id = posts.ID
WHERE (posts.post_status = 'inherit' OR posts.post_status = 'private')
AND (posts.post_type = 'attachment')
GROUP BY fbva.folder_id";
}
$query = apply_filters( 'fbv_all_folders_and_count', $query, $lang );
$results = $wpdb->get_results( $query );
$return = array();
if ( is_array( $results ) ) {
foreach ( $results as $k => $v ) {
$return[ $v->folder_id ] = $v->count;
}
}
return $return;
}
public static function getFolders( $order_by = null, $order = null, $flat = false ) {
$settings = UserSettingModel::getInstance()->get( 'THEME' );
$folders_from_db = FolderModel::allFolders( '*', null, $order_by, $order );
$folder_colors = get_option( 'fbv_folder_colors', array() );
$folder_default_color = $settings['colors'];
$tree = array();
$folders_from_db = self::prepareTreeData( $folders_from_db, $folder_colors, $folder_default_color );
$groups = self::groupByParent( $folders_from_db );
if ( $flat === true ) {
$tree = self::getFlatTreeByGroups( $groups, 0 );
} else {
$tree = self::getTreeByGroups( $groups, 0 );
}
return $tree;
}
public static function getFolder( $folder_id, $order_by = null, $order = null ) {
$tree = self::getFolders( $order_by, $order );
return Helpers::findFolder( $folder_id, $tree );
}
private static function groupByParent( $data ) {
$group = array();
if ( is_array( $data ) ) {
foreach ( $data as $v ) {
if ( ! isset( $group[ $v['parent'] ] ) ) {
$group[ $v['parent'] ] = array();
}
$group[ $v['parent'] ][] = $v;
}
}
return $group;
}
private static function getTreeByGroups( $groups, $parent = 0 ) {
$tree = array();
if ( isset( $groups[ $parent ] ) && is_array( $groups[ $parent ] ) ) {
foreach ( $groups[ $parent ] as $node ) {
$node['children'] = isset( $groups[ $node['id'] ] ) ? self::getTreeByGroups( $groups, $node['id'] ) : array();
$tree[] = $node;
}
}
return $tree;
}
private static function getFlatTreeByGroups( $groups, $parent = 0, $level = 0 ) {
$tree = array();
if ( isset( $groups[ $parent ] ) && is_array( $groups[ $parent ] ) ) {
foreach ( $groups[ $parent ] as $node ) {
$node['text'] = str_repeat( '-', $level ) . $node['text'];
$tree[] = $node;
if ( isset( $groups[ $node['id'] ] ) ) {
$tree = array_merge( $tree, self::getFlatTreeByGroups( $groups, $node['id'], $level + 1 ) );
}
}
}
return $tree;
}
private static function prepareTreeData( $data, $folder_colors = array() ) {
if ( ! is_array( $data ) ) {
return array();
}
foreach ( $data as $k => $v ) {
$data[ $k ] = array(
'key' => (int) $v->id,
'id' => (int) $v->id,
'children' => array(),
'text' => $v->name,
'title' => $v->name,
'color' => ( isset( $folder_colors[ $v->id ] ) ? sanitize_hex_color( $folder_colors[ $v->id ] ) : '' ),
'data-id' => (int) $v->id,
'parent' => (int) $v->parent,
'data-count' => 0,
'ord' => $v->ord,
);
}
return $data;
}
}