* @version 1.1.0 (January 01, 2006) * @package AutoIndex */ class DirectoryListDetailed extends DirectoryList { /** * @var string The HTML text that makes up the path navigation links */ protected $path_nav; /** * @var int Total number of files in this directory */ protected $total_files; /** * @var int Total number of folders in this directory */ protected $total_folders; /** * @var int Total number of folders in this directory (including parent) */ protected $raw_total_folders; /** * @var int Total number of downloads of files in this directory */ protected $total_downloads; /** * @var Size Total size of this directory (recursive) */ protected $total_size; /** * @return string The HTML text that makes up the path navigation */ private function set_path_nav() { global $config, $subdir, $request; $exploded = explode('/', $subdir); $c = count($exploded) - 1; $temp = '' . Url::html_output(substr(str_replace('/', ' / ', $config->__get('base_dir')), 0, -2)) . '/ '; for ($i = 0; $i < $c; $i++) { $temp .= '' . Url::html_output($exploded[$i]) . ' / '; } return $temp; } /** * Returns -1 if $a < $b or 1 if $a > $b * * @param Item $a * @param Item $b * @return int */ private static function callback_sort(Item $a, Item $b) { if ($a->__get('is_parent_dir')) { return -1; } if ($b->__get('is_parent_dir')) { return 1; } $sort = strtolower($_SESSION['sort']); if ($sort === 'size') { $val = (($a->__get('size')->__get('bytes') < $b->__get('size')->__get('bytes')) ? -1 : 1); } else { if (!$a->is_set($sort)) { $_SESSION['sort'] = 'filename'; //so the "continue" link will work throw new ExceptionDisplay('Invalid sort mode.'); } if (is_string($a->__get($sort))) { $val = strnatcasecmp($a->__get($sort), $b->__get($sort)); } else { $val = (($a->__get($sort) < $b->__get($sort)) ? -1 : 1); } } return ((strtolower($_SESSION['sort_mode']) === 'd') ? -$val : $val); } /** * @return int The total number of files and folders (including the parent folder) */ public function total_items() { return $this->raw_total_folders + $this->total_files; } /** * @param string $path The directory to read the files from * @param int $page The number of files to skip (used for pagination) */ public function __construct($path, $page = 1) { $path = Item::make_sure_slash($path); parent::__construct($path); $subtract_parent = false; $this->total_downloads = $total_size = 0; $dirs = $files = array(); foreach ($this as $t) { if (@is_dir($path . $t)) { $temp = new DirItem($path, $t); if ($temp->__get('is_parent_dir')) { $dirs[] = $temp; $subtract_parent = true; } else if ($temp->__get('filename') !== false) { $dirs[] = $temp; if ($temp->__get('size')->__get('bytes') !== false) { $total_size += $temp->__get('size')->__get('bytes'); } } } else if (@is_file($path . $t)) { $temp = new FileItem($path, $t); if ($temp->__get('filename') !== false) { $files[] = $temp; $this->total_downloads += $temp->__get('downloads'); $total_size += $temp->__get('size')->__get('bytes'); } } } $version_compare = explode(".", phpversion(), 3); if ($version_compare[0] == '' || $version_compare[1] == '') { $phpversion = '5.4'; } else { $phpversion = $version_compare[0] . '.' . $version_compare[1]; } if (version_compare($phpversion, "5.5", ">")) { //die("you're on ".$phpversion." or bellow".phpversion().' &'.print_R($version_compare, true)); usort($dirs, array($this, 'callback_sort')); usort($files, array($this, 'callback_sort')); } else { //die("you're on ".$phpversion." or above: ".phpversion().' &'.print_R($version_compare, true)); usort($dirs, array($this, 'callback_sort')); usort($files, array($this, 'callback_sort')); } $this->contents = array_merge($dirs, $files); $this->total_size = new Size($total_size); $this->total_files = count($files); $this->raw_total_folders = $this->total_folders = count($dirs); if ($subtract_parent) { $this->total_folders--; } $this->path_nav = $this->set_path_nav(); //Paginate the files if (ENTRIES_PER_PAGE) { if ($page < 1) { throw new ExceptionDisplay('Invalid page number.'); } global $config; $num_per_page = $config->__get('entries_per_page'); if (($page - 1) * $num_per_page >= $this->total_items()) { throw new ExceptionDisplay('Invalid page number.'); } $this->contents = array_slice($this->contents, ($page - 1) * $num_per_page, $num_per_page); } } /** * @return string The HTML text of the directory list, using the template system */ public function __toString() { $head = new TemplateInfo(TABLE_HEADER, $this); $main = new TemplateFiles(EACH_FILE, $this); $foot = new TemplateInfo(TABLE_FOOTER, $this); return $head->__toString() . $main->__toString() . $foot->__toString(); } } ?>