[英]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
(單擊側邊欄中的鏈接之一即可完成)。 請注意以下幾點很重要:
file
值可能會丟失(我們可以使用empty()
)。 file
值可能與我們期望的值不同(在這種情況下,我們將使用basename()
來確保我們正在處理文件名而不是注入的路徑 )。 file
值有效,它也可能引用的路徑實際上不是文件,或者指向Web服務器無法訪問的文件(我們分別通過使用is_file()
和is_readable()
檢查這些情況)。 最后,一旦確定file
值指向有效文件,便使用passthru()
將其內容發送到Web瀏覽器。
剩下要做的唯一一件事就是使用一些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.