Оформление листинга файлов на php в стиле MacOS: функция glob

Полезные скрипты
Ответить
Аватара пользователя
mihas
Администратор
Сообщения: 1360
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

Оформление листинга файлов на php в стиле MacOS: функция glob

Сообщение mihas »

Для более продвинутого оформления листинга файлов, чем использование директивы Options +Indexes в .htaccess, можно использовать удобную функцию php - glob. Захотелось сделать как на маке чередование подсветки строк листинга, вот как это реализовано на примере.
Создадим стиль css для листинга, масштабируемый естественно, с резиновой таблицей, чтобы и на iPhone хорошо смотрелось, примерно такой:

Код: Выделить всё

<style>
BODY {FONT-FAMILY: Verdana, Arial, Helvetica, Geneva, Sans-Serif; FONT-SIZE: 10pt; -webkit-text-size-adjust: 100%; }
#table_listing {display: table; border:0px; border-spacing:0px; max-width:99%; width:95%; padding:0px; font-size:9pt; color: #002500; }
#table_listing a {color: #002500 !important;}
.row {display: table-row; border:0; border-spacing:0; padding:0; }
.cell_70L { display: table-cell; width:70%; text-align:left; vertical-align:middle; padding:2px; height:16px; word-break:break-all; }
.cell_24L { display: table-cell; width:24%; text-align:left; vertical-align:middle; padding:2px; height:16px; }
.cell_5L { display: table-cell; width:5%; text-align:right; vertical-align:middle; padding:2px; height:16px; }
.cell_1L { display: table-cell; width:1%; text-align:center; vertical-align:middle; padding:2px; height:16px; }
.cell_chet0 {background-color: rgba(204,204,204,0);}
.cell_chet1 {background-color: rgba(64,64,64,0.06);}
@media (max-device-width: 736px), (max-width: 752px) {
#table_listing {width:100%; max-width:100%;}
}
</style>
И собственно сам скрипт листинга поместим в нужное нам место индексного файла внутри тегов <body>:

Код: Выделить всё

<?php
echo '<div id="table_listing">';
$chet = 0;
foreach (glob("*.*") as $filename) {
	$filesr = filesize($filename)/1024;
	$kbmb = "Kb"; $prec = 1;
	if ($filesr >= 1024) {$filesr = $filesr/1024; $kbmb = "Mb";}
	if ($filesr >= 10) {$prec = 0;}
	if ($filename != "index.php" && $filename != "HEADER.html" && $filename != "README.php") {
		if($chet==0) {$chet=1;} else {$chet=0;}
		$ico = substr($filename, -3, 3);
    echo '<div class="row"><span class="cell_1L cell_chet' . $chet . '"><a href="' . $filename . '"><img src="ico/' . mb_strtolower($ico) . '.png" /></a></span><span class="cell_70L cell_chet' . $chet . '"><a href="' . $filename . '">' . $filename . '</a></span><span class="cell_24L cell_chet' . $chet . '">' . date ("Y-m-d H:i", filemtime($filename)) . '</span><span class="cell_5L cell_chet' . $chet . '">' . round($filesr, $prec) . $kbmb . '</span></div>';
	}
}
echo '</div>';
?>
Условие if ($filename... позволяет не выводить в листинг служебные файлы, указанные в нем, типа самого файла index.php. Для красоты понадобятся маленькие иконки или значки типов файлов, я надергал на маке и на пц что показалось покрасивее, иконки в аттаче. Папку ico надо положить соответственно в каталог, для которого делаем листинг.
увеличенные preview для значков типов файлов
увеличенные preview для значков типов файлов
• 13.67 КБ • 10154 просмотра
В моем варианте ищется не строго расширение типа файла, которое может быть не только трехзначным, но и четырех-, типа xlsx. Этот скрипт находит три последних символа, для примера xlsx находит lsx. Значки названы соответственно. mb_strtolower приводит все расширения к нижнему регистру, чтобы не плодить одни и те же иконки дважды.
Переменная $chet управляет чересстрочным чередованием подсветки фона строчек листинга, чтобы выглядело, как список файлов на маке.
Аватара пользователя
mihas
Администратор
Сообщения: 1360
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

Оформление листинга файлов на php в стиле MacOS: функция glob

Сообщение mihas »

Если добавить по коду из прошлого поста после png его геометрический размер на странице - width="16" height="16" - то можно взять иконки поновее, 4-кратного увеличения, под все современные мониторы.

Код: Выделить всё

Найти:
<img src="ico/' . mb_strtolower($ico) . '.png" /></a>

Заменить:
<img src="ico/' . mb_strtolower($ico) . '.png" width="16" height="16" /></a>
Вложения
Превью новых иконок 2022 года
Превью новых иконок 2022 года
• 80.46 КБ • 3363 просмотра
Скриншот листинга с новыми иконками на мониторе 4K (200% масштабирование в системе, 32х32 пикселя на иконку)
Скриншот листинга с новыми иконками на мониторе 4K (200% масштабирование в системе, 32х32 пикселя на иконку)
• 313.59 КБ • 3363 просмотра
Скриншот листинга с новыми иконками на Айфоне с увеличением
Скриншот листинга с новыми иконками на Айфоне с увеличением
• 258.51 КБ • 3363 просмотра
Аватара пользователя
mihas
Администратор
Сообщения: 1360
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

Оформление листинга файлов на php в стиле MacOS: функция glob

Сообщение mihas »

Сортировка по расширению
Сортировка по расширению
• 328.78 КБ • 1528 просмотров
Покажу еще одну не сложную фишку: как сделать различные сортировки листинга на php, с использованием функции glob и некоторых других.

Делаем сортировку по имени без учета регистра, по расширению имени файла, по дате модификации файла и по размеру файла. В прямом и обратном порядке.

Помимо собственно основной функции glob, отвечающей за создание массива файлов в каталоге на сервере, я в обновленной части сценария с различными сортировками использовал несколько интересных функций php:

$_GET - для чтения переменных в адресной строке;

$info = new SplFileInfo($files[$i]); $ext[$i] = mb_strtolower($info->getExtension()); - для выделения расширений имен;

asort, array_multisort, usort - для различных вариантов сортировки.

Я дам весь скрипт частями с пометками где и чего мы считаем.

Код: Выделить всё

$NameO = "A";
$ModO = "A";
$SizeO = "A";
$ExtO = "A";
		
$C = $_GET['C'];
$O = $_GET['O'];
if ($C == "" && $O == ""){
	$C = "Nn"; $O = "Aa";
	$NameO = "A";}
		
if ($C == "N" && $O == "A"){
	$NameO = "D";}
if ($C == "N" && $O == "D"){
	$NameO = "A";}
	
if ($C == "M" && $O == "A"){
	$ModO = "D";}
if ($C == "M" && $O == "D"){
	$ModO = "A";}
		
if ($C == "S" && $O == "A"){
	$SizeO = "D";}
if ($C == "S" && $O == "D"){
	$SizeO = "A";}
		
if ($C == "D" && $O == "A"){
	$ExtO = "D";}
if ($C == "D" && $O == "D"){
	$ExtO = "A";}
Тут мы создали условия сортировки в зависимости от содержания запроса GET в нашей адресной строке или при отсутствии по умолчанию запроса GET.

Код: Выделить всё

echo '<div class="row"><span class="cell_1L cell_chet1"></span><span class="cell_70L cell_chet1"><a href="?C=N&O=' . $NameO . '"> Name</a>&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<a href="?C=D&O=' . $ExtO . '"> Description</a></span><span class="cell_24L cell_chet1"><a href="?C=M&O=' . $ModO . '">Last modified</a></span><span class="cell_5L cell_chet1"><a href="?C=S&O=' . $SizeO . '">Size</a></span></div>';
Здесь мы выводим строку с 4 ссылками разной сортировки.

Код: Выделить всё

$chet = 0;
$files = glob("*.*");
	for($i = 0; $i < count ($files); $i++){
    	$array[] = [
        'name' => $files[$i],
        'time' => filemtime($files[$i]),
	'size' => filesize($files[$i]),
    ];
		$info = new SplFileInfo($files[$i]);
		$ext[$i] = mb_strtolower($info->getExtension());
		$array_lowercase[$i] = mb_strtolower($files[$i]);
 }
В этой части сценария мы готовим массивы с данными по 4 вариантам сортировки.

Код: Выделить всё

if ($C == "Nn" && $O == "Aa"){
asort($array);
//arsort($array); //reverse
}
		
if ($C == "N" && $O == "A"){
array_multisort($array_lowercase, $array);
}
if ($C == "N" && $O == "D"){
array_multisort($array_lowercase, SORT_DESC, $array);
}		

if ($C == "D" && $O == "A"){
array_multisort($ext, $array);
}
if ($C == "D" && $O == "D"){
array_multisort($ext, SORT_DESC, $array);
}
	
if ($C == "M" && $O == "A"){
usort($array, function($a, $b){ return $a['time'] - $b['time']; });
}
if ($C == "M" && $O == "D"){
usort($array, function($a, $b){ return $b['time'] - $a['time']; });
}
		
if ($C == "S" && $O == "A"){
usort($array, function($a, $b){ return $a['size'] - $b['size']; });
}
if ($C == "S" && $O == "D"){
usort($array, function($a, $b){ return $b['size'] - $a['size']; });
}

$filename = array_column($array, 'name');
Здесь мы собственно сортируем массивы в соответствии с условием, которое пришло по ссылке GET.

Код: Выделить всё

foreach ($filename as $filename) {	
	$filesr = filesize($filename)/1024;
	$kbmb = "Kb"; $prec = 1;
	if ($filesr < 0.9765625) {$filesr = $filesr*1024; $kbmb = "";}
	if ($filesr >= 1024) {$filesr = $filesr/1024; $kbmb = "Mb";}
	if ($filesr >= 10) {$prec = 0;}
	if ($filename != "index.php") {
		if($chet==0) {$chet=1;} else {$chet=0;}
		$ico = substr($filename, -3, 3);
    echo '<div class="row"><span class="cell_1L cell_chet' . $chet . '"><a href="' . $filename . '"><img src="ico/' . mb_strtolower($ico) . '.png" width="16" height="16" /></a></span><span class="cell_70L cell_chet' . $chet . '"><a href="' . $filename . '">' . $filename . '</a></span><span class="cell_24L cell_chet' . $chet . '">' . date ("Y-m-d H:i", filemtime($filename)) . '</span><span class="cell_5L cell_chet' . $chet . '">' . round($filesr, $prec) . $kbmb . '</span></div>';
	}
}
Здесь мы выводим отсортированный массив в листинг, при этом и подменяем где надо байты на килобайты и мегабайты, и ставим условие, чтобы не выводить в листинг сам файл index.php, в котором мы весь код и прописали.

CSS для оформления такого листинга я постами выше публиковал. Можете проверить, как это все работает на живом сайте тут и тут.
Ответить

Вернуться в «PHP»