簡體   English   中英

從PHP文件列表填充無序列表

[英]Populate an unordered list from a list of PHP files

情況:

我有一個帶有內容區域和側邊欄的“項目”頁面。 我希望邊欄包含項目的動態列表。 內容區域具有一個ID為“ post”的div。

我有一個子文件夾,其中包含.php文件,這些文件與包含有關每個項目的html內容的項目相對應。

挑戰:

我希望邊欄根據php文件的文件名(或如果可能,在每個php文件中包含一個h1元素)生成一個無序列表。

單擊后,我希望此無序列表中的每個項目都用與之對應的php文件的內容填充內容區域中的div id“ post”。

這可能嗎?

我知道使用像Wordpress這樣的CMS會更容易,但是我想知道如何在沒有SQL數據庫的情況下做到這一點。 請記住,我對PHP幾乎一無所知。 到目前為止,我一直堅持使用html / css。

解決方案:

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提供

列出文件

# 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/path/to/directory )和文件名模式( *.php ),以查找指定目錄中的所有“ .php”文件。

glob()返回一個數組,因此我們需要使用foreach遍歷結果。

由於我們提供了文件所在目錄的絕對路徑,因此glob()將返回一個絕對路徑數組,因此我們將需要使用basename()剝離目錄信息並僅獲取文件名。

盡管不常見,但文件名中可能包含不安全的字符,因此我們需要使用urlencode() URL字符串(anchor標簽的href )和htmlentities() ,以避免其他值urlencode() anchor標簽的文本)的值。

讀取文件

無序列表中的鏈接引用了Web服務器文檔根目錄下的名為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 (單擊側邊欄中的鏈接之一即可完成)。 請注意以下幾點很重要:

  • Web瀏覽器能夠請求任何URL,因此我們不能假定用戶通過單擊側邊欄鏈接來到達post.php,因此我們必須檢查以下幾件事:
    • file值可能會丟失(我們可以使用empty() )。
    • file值可能與我們期望的值不同(在這種情況下,我們將使用basename()來確保我們正在處理文件名而不是注入的路徑 )。
  • 即使file值有效,它也可能引用的路徑實際上不是文件,或者指向Web服務器無法訪問的文件(我們分別通過使用is_file()is_readable()檢查這些情況)。

最后,一旦確定file值指向有效文件,便使用passthru()將其內容發送到Web瀏覽器。

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調用設置為僅在用戶單擊側邊欄中的鏈接之一時觸發,並通過在單擊的鏈接上調用.attr()來提取其href屬性,從而確定要訪問的URL 。

請注意,我們使用事件的preventDefault方法,而不是返回false以避免潛在的不良副作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM