LinuxForum.Fans
Тема

Подскажите реализацию файлового менеджера PHP

Автор: itrex111 9 сообщений 2274 просмотров
#305564

Добрый день!

Я уже писал, но меня заблокировали.

Если кто может, подскажите реализацию файлового менеджера под php,
или кусок кода без jquery.

Смысл такой:
что бы в DIV-e можно было получить вот такой вид папок
|
|---dir1
|
+-dir2
+-dir3
+-dir4
-- dir5
|-file1.img
|-file2.img
|-file3.img

Папки раскрывались по клику плюсика, javascript использовался по минимуму.
Код HTML приблизительно

text

  <span style="float:left;display:inline-block"><?php echo $plus_minus ; ?></span><span style="display:inline-block"><?php echo $dir; ?></span> 
  <span style="display:inline-block">|</span>

Спасибо.

ps Если не в тот раздел я извиняюсь

#305580
Kettler написал:
А если как то так?
http://encode-explorer.siineiolekala.net/

Там jquery (((

Короче я сварганил код

text

<?php include("conf.inc"); $dir = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR;

if (defined("dir")){ $dir .= dir . DIRECTORY_SEPARATOR; $head_dir = dir;

} function read_dir($dir,$glob_dir,$short_dir){ $pattern = '/(.jpg|.bmp|.png|.tiff|.gif)$/'; $i = 0; $name_path = $glob_dir; $s_dir = $short_dir; if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if ($file != '.'){ $path = $dir.$file ; if ( $file != '..' ){ if (filetype($path) == 'dir'){ $path = $path.DIRECTORY_SEPARATOR; @$name_path .= '/'.$file; @$s_dir .= '/'.$file; @$p[$i] .= '<div style="clear:both"></div><li name="'.$file.'" class="closed" ><span class="folder" value="'.$name_path.'" id="'.$name_path.'" onClick=select_focuse(this)>'.$file.'</span> <ul id="folder">'.read_dir($path,$name_path,$s_dir).'</ul></li>';

} if (filetype($path) == 'file'){ if (preg_match($pattern,$file)){ $style_file = 'file_img'; } else { $style_file = 'file'; } @$name_path .= '/'.$file; @$s_dir .= '/'.$file; @$p[$i] .= '<div style="clear:both"></div><li name="'.$file.'" value="'.$name_path.'"><span class="'.$style_file.'"><a href="http://'.$_SERVER['SERVER_NAME'].'/'.$s_dir.'">'.$file.'</a></span></li>'; } $name_path = $glob_dir; $s_dir = $short_dir; }

} $i++; } closedir($dh); } $cnt = '0'; asort($p); //reset($p); $directoria = ''; foreach ($p as $v){ $directoria .= $v; } } return $directoria; } ?>

А теперь просто бы скрыть и раскрыть без наворотов

#305599

Расскажу свое видинье проблемы, если понравится попробуете воплотить. С памятью плохо поэтому пишу на словах.

text
<?php
    $dir = $_GET['адрес'];
    открыть директорию
    
    листаем директорию
    $path = $dir."имя"

если (дирректория) echo "<div onclick='openDir(this)' name=$path id=$path > + имя директории </div>"; другое echo "<div onclick='openFil(this) ' name=$path id=$path > имя файла </div>"

конец листания ?>

----js---- function openDir ( OurDiv) { var dr = OurDiv.name(); $.get("path_to_php?адрес="+dr, function(data) { $('#'+dr).append(data); }); } -----/js---

Удачи вам :)
Докушал и понял что возникнет проблема со сворачиванием блока.

#305649

Мне сказали тупо с CSS поиграться
типа visible и hidden и повесить обработчик событий на символы + и - но я что то никак не могу понять эту стратегию хоть бы небольшой пример

#305904

Получилось как то так

inc.php

text

<?php
  header("Content-type: text/html; charset=utf-8");
  $dir = $_GET['adr'];
  if ($dh = opendir($dir)) {
    while (($file = readdir($dh)) !== false) {
      $path = $dir.'/'.$file;
      if (is_dir($path)) {
    echo "<div class='patDiv' name=".$path.">";
    echo "<div style='color: red'  onclick=\"openDir("."'".$path."'".",'".$file."'".")\" name="."'".$path.'1'."'"."id="."'".$path."'"."> +  $file</div>";
    echo "<div class='incap' name=".'inc'.$path.">";
    echo "</div>";
    echo "</div>";
      }
     else {
    echo "<div class='filDiv'>";
    echo "<div style='color: blue' onclick=\"alert('bxcfg')\" name=$path id=$path> - $file </div>";
    echo "</div>";
    }
   }
  }
  else
    echo "Нельзя открыть директорию";
?>

index.html

text

<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <script src="/js/jquery-1.3.2.min.js" type="text/javascript"></script>
  <script src="/test/my.js" type="text/javascript"></script>
  <link href="st.css" rel="stylesheet" type="text/css" />
  </head>

<body> <div id='cot' name='cot'> </div> </body> </html>

my.js

text

$(document).ready(function(){
  $.get("http://IPtest/inc.php?adr=/home", function(data) {       //  замените путь к файлу inc.php и стартовую директорию
    $('#cot').append(data);
  });
});

function openDir (path, file) { if (document.getElementById(path).style.color == 'red') { document.getElementById(path).style.color = "green"; $.get("http://IP/test/inc.php?adr="+path, function(data) { // замените путь к файлу inc.php $('*[name='+path+'1'+']').html('- '+file); $('*[name=inc'+path+']').html(data); }); } else { document.getElementById(path).style.color = "red"; $('*[name='+path+'1'+']').html('+ '+file); $('*[name=inc'+path+']').html(''); } }

st.css

text

div.incap {margin-left: 30px;}

Также скачайте и подключите jquery в index.html.
Код написан на скорую руку, так что там есть над чем поработать :)

#305974

Использовать jquery здесь конечно удобно. Но не соответствует изначальной задаче. Потому весь упор на css. Если устраивает вариант, что подпункты разворачиваются только при наведении курсора (а если его убрать сворачиваются) то можно вообще без js. Иначе js все же нужен - чтобы проставлять и отменять нужные стили.

Самый простой случай если можно оставлять открытыми все пункты на которые щелкнули. Иначе придется убирать стиль у предыдущего пункта того же уровня.

Т.е. создаем html

text

<ul>
  <li>
     <a href="#" onclick = "javascript:itemOnOf(this);">Dir1</a>
     <ul>
        <li><a href="#">File1</a></li>
        <li><a href="#">File2</a></li>
     </ul>
  </li>
  <li><a href="#">File</a></li>
</ul>

Далее css

text

  ul ul{
   diaplsy:none;
   margin-left:30px;
 }
 ul.active{
   display:block;
 }

Далее скрипт:

text

// ф-ия опередяющаяя наличие класса
function hasClass(obj, className) {
   return obj.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'))
}

// ф-ия переключающаяя класс. Добаляет если не было , убирает если было) function itemOnOf(obj) { var ul_obj = this.parentNode.getElementsByTagName('ul')[0]; if (hasClass(ul_obj,'active')) { ul_obj.className=ul_obj.className.replace(new RegExp(' active'), ""); } else { ul_obj.className+=" active"; } return false; }

не тестил, не проверял..... если что не так, скажете проверю

Естественно вы должны понимать. Что этот вариант рассчитан что вся структура будет сразу в html. Иначе вам нужно больше js (как показали выше)

#305981

Да. к моему коду.... Можно обойтись и без классов. Т.е. что то типа

text

 ul_obj.style.display =  (ul_obj.style.display!='block') ? 'block' : 'none';

С классами это "на будущее" вдруг еще чего на это можно будет "повесить".

#306133

Мне с jquery не подходит, поэтому попробую предпоследний вариант

Войдите или зарегистрируйтесь, чтобы ответить.