从PHP文件列表中填充无序列表

时间:2012-01-21 04:26:16

标签: php list dynamic

情况:

我有一个包含内容区域和侧边栏的“项目”页面。我希望侧边栏包含一个动态的项目列表。内容区域有一个id为“post”的div。

我有一个包含.php文件的子文件夹,这些文件对应于包含每个项目的html内容的项目。

挑战:

我希望侧边栏根据php文件的文件名生成一个无序列表(或者如果可能的话,每个php文件中都有一个h1元素)。

单击时,我希望此无序列表中的每个项目在内容区域中填充div id“post”,其中包含与其对应的php文件的内容。

这可能吗?

我知道使用像Wordpress这样的CMS会更容易,但如果可能的话,我想知道如何在没有SQL数据库的情况下这样做。请记住,我对PHP几乎一无所知。到目前为止,我一直坚持使用html / css。

2 个答案:

答案 0 :(得分:1)

解决方案:

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

答案 1 :(得分:0)

列出文件

# 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)和{{3}转义值否则(锚标记的文本)。

阅读文件

无序列表中的链接引用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预计会提供一个名为file的{​​{3}}值(通过单击侧栏中的某个链接来处理)。重要的是要注意几件事:

  • Web浏览器能够请求任何URL,因此我们不能假设用户通过单击侧边栏链接到达post.php,因此我们必须检查以下几点:
    • 可能缺少file值(我们可以使用htmlentities()检查这一点。)
    • file值可能与我们预期的值不同(在这种情况下,我们将使用$_GET来确保我们处理的是文件名,而不是empty()
  • 即使file值有效,它也可能引用实际上不是文件的路径,或者它指向Web服务器无法访问的文件(我们使用{{3}检查这些情况分别是}和basename()

最后,一旦我们确定file值指向有效文件,我们就会使用injected path将其内容发送到网络浏览器。

Javascript

唯一要做的就是使用一些Javascript,以便点击其中一个侧边栏链接显示#post div中的内容。为简洁起见,我将在此处使用is_file()

# index.php

(function($){
  $(function(){
    var post = $('#post');
    $('#sidebar a.file-link').click(function( e ){
      post.load($(this).attr('href'));
      e.preventDefault();
    });
  });
})(jQuery);

此代码利用is_readable()方法,该方法执行ajax调用并使用该请求中的内容替换所选元素。

我们使用passthru()将ajax调用设置为仅在用户点击侧边栏中的某个链接时触发,我们通过在点击的链接上调用jQuery来确定要转到的网址提取其href属性。

请注意,我们使用事件的.load()方法,而不是返回false以避免.click()