我有一个包含内容区域和侧边栏的“项目”页面。我希望侧边栏包含一个动态的项目列表。内容区域有一个id为“post”的div。
我有一个包含.php文件的子文件夹,这些文件对应于包含每个项目的html内容的项目。
我希望侧边栏根据php文件的文件名生成一个无序列表(或者如果可能的话,每个php文件中都有一个h1元素)。
单击时,我希望此无序列表中的每个项目在内容区域中填充div id“post”,其中包含与其对应的php文件的内容。
我知道使用像Wordpress这样的CMS会更容易,但如果可能的话,我想知道如何在没有SQL数据库的情况下这样做。请记住,我对PHP几乎一无所知。到目前为止,我一直坚持使用html / css。
答案 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}}值(通过单击侧栏中的某个链接来处理)。重要的是要注意几件事:
file
值(我们可以使用htmlentities()
检查这一点。)file
值可能与我们预期的值不同(在这种情况下,我们将使用$_GET
来确保我们处理的是文件名,而不是empty()
) file
值有效,它也可能引用实际上不是文件的路径,或者它指向Web服务器无法访问的文件(我们使用{{3}检查这些情况分别是}和basename()
。最后,一旦我们确定file
值指向有效文件,我们就会使用injected path将其内容发送到网络浏览器。
唯一要做的就是使用一些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
属性。