Заполнить неупорядоченный список из списка файлов PHP - PullRequest
1 голос
/ 21 января 2012

Ситуация:

У меня есть страница проектов с областью содержимого и боковой панелью. Я хочу, чтобы боковая панель содержала динамический список проектов. В области содержимого есть div с идентификатором «post».

У меня есть подпапка, содержащая файлы .php, соответствующие проектам, которые содержат HTML-контент о каждом проекте.

Задача:

Я бы хотел, чтобы боковая панель генерировала неупорядоченный список на основе имен файлов php (или, если возможно, элемента h1 внутри каждого файла php).

При нажатии я бы хотел, чтобы каждый элемент этого неупорядоченного списка заполнял div id "post" в области содержимого содержимым php-файла, которому он соответствует.

Возможно ли это?

Я знаю, что было бы проще с CMS, такой как Wordpress, но я хочу знать, как сделать это без базы данных SQL, если это возможно. Имейте в виду, я почти ничего не знаю о PHP. Я до сих пор придерживался html / css.

Ответы [ 2 ]

1 голос
/ 21 января 2012

Решение:

function getfiles($dir){
    if(!is_dir($dir))
        return false;
    $dirhandle = opendir($dir);
    $files = array();
    while($entry = readdir($dirhandle)){
        if($entry!='.' && $entry!='..' && !is_dir($dir.'/'.$entry))
            $files[]=$entry;
    }
    return $files;
}

Возвращает массив файлов. В каталоге есть три специальные записи, которые не являются файлами. . относится к каталогу, в котором он находится. .. относится к родительскому каталогу. Наконец, есть и другие каталоги. Насколько я знаю, все остальное - файл.

А потом:

function createlist($dir){
    if(!$files=getfiles($dir))
        return false;
    ?>
    <script type="text/javascript" >
        function getcontent(xthis) {  
            var httpRequest;
            makeRequest(xthis.href);   
            function makeRequest(url) {  
                if (window.XMLHttpRequest) { // Mozilla, Safari, ...  
                    httpRequest = new XMLHttpRequest();  
                } else if (window.ActiveXObject) { // IE  
                    try {  
                        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");  
                    }   
                    catch (e) {  
                        try {  
                            httpRequest = new ActiveXObject("Microsoft.XMLHTTP");  
                        }   
                        catch (e) {}  
                    }  
                }  

                if (!httpRequest) {   
                    return false;  
                }  
                httpRequest.onreadystatechange = putContents;  
                httpRequest.open('GET', url);  
                httpRequest.send();  
            }  

            function putContents() {  
                if (httpRequest.readyState === 4) {  
                    if (httpRequest.status === 200) {  
                        document.getElementById("post").innerHTML=httpRequest.responseText;  
                    } else {  
                        return false; 
                    }  
                }  
            }  
        }
    </script>
    <?PHP
    echo "<ul>\n";
    foreach($files as $file){
        echo "\t<li><a onclick=\"getcontent(this);return false;\" href=".$dir."/$file>$file</a></li>\n";
    }
    echo "</ul>";
    return true;
}

Функции Ajax предоставлены https://developer.mozilla.org/en/AJAX/Getting_Started.

0 голосов
/ 21 января 2012

Список файлов

# 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, чтобы избежать потенциала для нежелательных побочных эффектов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...