Список файлов
# index.php
<?php
if( $files = glob('/path/to/directory/*.php') )
{
?>
<ul id="sidebar">
<?php
foreach( $files as $path_raw )
{
$file_raw = basename($path_raw);
$file_safe = htmlentities($file_raw);
$file_urlsafe = urlencode($file_raw);
?>
<li><a class="file-link" href="/post.php?file=<?php echo $file_urlsafe; ?>"><?php echo $file_safe; ?></a></li>
</ul>
<?php
}
Чтобы найти файлы, мы хотим использовать glob()
. В этом случае передайте путь к каталогу (/path/to/directory
) и шаблон имени файла (*.php
), чтобы найти все файлы .php в указанном каталоге.
glob()
возвращает массив, поэтому нам нужно будет перебрать результат, используя foreach
.
Поскольку мы указываем абсолютный путь к каталогу, в котором находятся файлы, glob()
вернет массив абсолютных путей, поэтому нам нужно будет использовать basename()
для удаления каталога информация и просто получить имя файла.
Хотя это и необычно, в именах файлов могут быть небезопасные символы, поэтому нам нужно экранировать значения, используя urlencode()
для строк URL (href
для тега привязки) и htmlentities()
в противном случае (текст тега привязки).
Чтение файлов
Ссылка в неупорядоченном списке ссылается на файл с именем post.php
в корневом каталоге документов веб-сервера.
# post.php
<?php
$basedir = '/path/to/directory';
if( empty($_GET['file']) )
{
// Handle error condition: no filename provided.
}
$file_raw = $_GET['file'];
$file_safe = basename($file_raw);
if( ! is_file($file_safe) )
{
// Handle error condition: file does not exist or is not a file.
}
elseif( ! is_readable($file_safe) )
{
// Handle error condition: file exists, but is not readable (probably permissions issue).
}
passthru($file_safe);
post.php Ожидает, что будет предоставлено значение $_GET
с именем file
(позаботьтесь об этом, нажав одну из ссылок на боковой панели). Важно отметить пару вещей:
- Веб-браузеры могут запрашивать любой URL, поэтому мы не можем предполагать, что пользователь пришел на post.php, щелкнув ссылку на боковой панели, поэтому мы должны проверить несколько вещей:
- Возможно, значение
file
отсутствует (мы можем проверить это с помощью empty()
).
- Значение
file
может иметь значение, отличное от ожидаемого (в этом случае мы будем использовать basename()
, чтобы убедиться, что мы имеем дело с именем файла, а не с введенным путь ).
- Даже если значение
file
является действительным, оно может ссылаться на путь, который на самом деле не является файлом, или указывает на файл, к которому веб-сервер не может получить доступ (мы проверяем эти случаи с помощью is_file()
и is_readable()
соответственно).
Наконец, когда мы уверены, что значение file
указывает на допустимый файл, мы отправляем его содержимое в веб-браузер, используя passthru()
.
Javascript
Осталось только использовать Javascript, чтобы при щелчке по одной из ссылок на боковой панели отображалось содержимое в #post
div. Я буду использовать jQuery здесь для краткости:
# index.php
(function($){
$(function(){
var post = $('#post');
$('#sidebar a.file-link').click(function( e ){
post.load($(this).attr('href'));
e.preventDefault();
});
});
})(jQuery);
Этот код использует метод .load()
, который выполняет вызов ajax и заменяет выбранный элемент содержимым из этого запроса.
Мы используем .click()
, чтобы настроить вызов ajax на срабатывание только тогда, когда пользователь нажимает на одну из ссылок на боковой панели, и мы определяем, по какому URL перейти, вызывая * 1096. * по нажатой ссылке для извлечения атрибута href
.
Обратите внимание, что мы используем метод события preventDefault
вместо возврата false
, чтобы избежать потенциала для нежелательных побочных эффектов .