Читаемая карта сайта PHP: игнорировать некоторые каталоги, работающие некорректно - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь интегрировать скрипт PHP на веб-сайт, который создает карту сайта и отображает ее в виде читаемого HTML на соответствующей странице. Я не ищу карту сайта XML для поисковых систем, но для удобочитаемого иерархического обзора всех страниц и всего веб-сайта.

Поэтому я использовал этот готовый к использованию скрипт http://www.apptools.com/phptools/dynamicsitemap.php и изменил его так, чтобы его можно было использовать в PHP 7. Внесенные мной изменения касались в основном замены устаревших функций, как рекомендовано в руководстве по PHP , Поскольку я не буду использовать встроенную функцию JavaScript, я не интегрировал и эту часть скрипта.

Теперь скрипт работает нормально, как я и предполагал. Но одна проблема сводит меня с ума уже несколько дней. Скрипт отображает каталоги и (под) страницы в алфавитном порядке. Когда я исключаю подкаталог, например, ABC, из основного каталога, который является последним в алфавитно упорядоченной карте сайта, подкаталог исчезает в карте сайта - как и предполагалось - но также и основной каталог.

Пример: Главный каталог = XYZ, Подкаталог = ABC. Азбука должна быть исключена из карты сайта, чтобы она не отображалась. Когда я добавляю «ABC» в массив $ ignore (см. Код ниже), он исчезает из карты сайта, но также и основной каталог «XYZ». Это происходит только для последнего каталога в списке файлов сайта.

Я не могу объяснить, откуда возникла эта проблема. Для всех остальных каталогов код работает нормально, и, насколько я могу судить, он должен работать и для последнего каталога в списке.

Может ли кто-нибудь здесь помочь с этой проблемой? Заранее большое спасибо!

<?php
$startin="";

$imgpath="";

$types=array(
".php",
);

$htmltypes=array(
".php",
);

$ignore=array(
"ABC",
);

$id=0;
echo "<div id=\"sitemap\"><ul id=\"list$id\">\n";
$id++;
$divs="";
if(substr($startin,strlen($startin)-1,1)=="/")
$startin=trim($startin,"/");
foreach($types as $type){
if (file_exists($_SERVER['DOCUMENT_ROOT']."$startin/index$type")){
    $index=$_SERVER['DOCUMENT_ROOT']."$startin"."/index$type";
    break;
}
}
$types=join($types,"|");
$types="($types)";
if(!is_array($htmltypes))
$htmltypes=array();
if(count($htmltypes)==0)
$htmltypes=$types;
if(!$imgpath)
$imgpath=".";
echo "<li><strong><a href=\"$startin/\">".getTitle($index)."</a></strong>\n";
showlist($_SERVER['DOCUMENT_ROOT']."$startin");
echo "</li></ul></div>\n";
if (is_array($divs)){
$divs="'".join($divs,"','")."'";
echo "<script type=\"text/javascript\">\n";
echo "//<![CDATA[\n";
echo "d=Array($divs);\n";
echo "for (i=0;i<d.length;i++){\n";
echo "\ttoggle('list'+d[i],'img'+d[i]);\n";
echo "}\n";
echo "//]]>\n";
echo "</script>\n";
}

function showlist($path){
global $ignore, $id, $divs, $imgpath, $types, $startin;
$dirs=array();
$divs=array();
$files=array();
if(is_dir($path)){
    if ($dir = @opendir($path)) {
        while (($file = readdir($dir)) !== false) {
            if ($file!="." && $file!=".." && !in_array($file,$ignore)){
                if (is_dir("$path/$file")){
                    if (file_exists("$path/$file/index.php"))
                        $dirs[$file]=getTitle("$path/$file/index.php");
                    elseif (file_exists("$path/$file/index.html"))
                        $dirs[$file]=getTitle("$path/$file/index.html");
                    elseif (file_exists("$path/$file/index.htm"))
                        $dirs[$file]=getTitle("$path/$file/index.htm");
                    else
                        $dirs[$file]=$file;
                } else {
                    if (preg_match("$types", $file)){
                        $files[$file]=getTitle("$path/$file");
                        if (strlen($files[$file])==0)
                            $files[$file]=$file;
                    }
                }
            }
      }  
      closedir($dir);
    }
    natcasesort($dirs);
    $url=str_replace($_SERVER['DOCUMENT_ROOT'],"",$path);
    $n=substr_count("$url/$","/");
    $base=substr_count($startin,"/")+1;
    $indent=str_pad("",$n-1,"\t");
    echo "$indent<ul id=\"list$id\">\n";
    if ($n>$base)
        $divs[]="$id";
    foreach($dirs as $d=>$t){
        $id++;
        echo "$indent\t<li><a href=\"javascript:toggle('list$id','img$id')\"></a>";
        echo " <strong><a href=\"$url/$d/\">$t</a></strong>\n";
        showlist("$path/$d");
        echo "$indent\t</li>\n";
    }
    natcasesort($files);
    $id++;
    foreach($files as $f=>$t){
        echo "$indent\t<li> <a href=\"$url/$f\">$t</a></li>\n";
    }
    echo "$indent</ul>\n";
}
}

function getTitle($file){
global $htmltypes;
$title="";
$p=pathinfo($file);
if(!in_array(strtolower($p['extension']),$htmltypes)){
    $f=file_get_contents($file);
    if(preg_match("'<title>(.+)</title>'i", $f, $matches)){
        $title=$matches[1];
    }
}
$title=$title?$title:basename($file);
return htmlentities(trim(strip_tags($title)));
}
?>
...