• 0
Sign in to follow this  
paulo_aa

Classe Php

Question

Na primeira função da classe abaixo eut enho uma variável que desejaria recuperá-la para montar links na segunda função, mas não consigo pois é um array multidimensional e eu não consigo trabalhar.

Tem explicado a variável e o que eu desejo no meio da classe.

----------------------------------------------------------------------------------------------------------------------------

if (PHP_OS == "WIN32") {

define("BARRA", "\\");

} else {

define("BARRA", "/");

}

class ArvoreDiretorios {

function executa($diretorio)

{

$array_dados = ArvoreDiretorios::lerDiretorio($diretorio);

ArvoreDiretorios::mostraArvore($array_dados, 0);

}

/**

* Esta função lê o diretório passado e pega o espaço total

* ocupado pelos arquivos e diretórios, retornando tudo em um

* array

*

* @author Silvano Girardi Jr. <[email protected]>

*/

function lerDiretorio($nome)

{

$retorno = array();

if ( isset($nome) ) {

$handle = @opendir($nome);

if (!$handle) {

return "Não foi possível abrir o diretório";

}

$tamanho = 0;

while($filename = readdir($handle)) {

if ( $filename != "." && $filename != ".." && is_dir($nome.BARRA.$filename) && $filename != "peqs" ) {

//Nessa altura aqui eu já tenho a variável $filename que eu queria mandá-la pra o array e recuparar na segunda função dessa classe

$temp = ArvoreDiretorios::lerDiretorio($nome.BARRA.$filename);

if ( is_array($temp) ) {

if ( !isset($retorno[$nome]) or !is_array($retorno[$nome]) ) {

$retorno[$nome] = array();

}

$retorno[$nome] = array_merge($retorno[$nome], $temp);

} else {

$tamanho += $temp;

}

}

}

closedir($handle);

if ( !isset($retorno[$nome]) or !is_array($retorno[$nome])) {

$retorno[$nome] = array();

}

array_push($retorno[$nome], number_format($tamanho, 2, ".", ","));

return $retorno;

} else {

return "Erro. Não foi possível varrer o(s) diretório(s).";

}

}

/**

* Esta função é uma modificação da versão apresentada nos comentários

* da função dir() no site php.net/dir por 'de\kibo\niels'

*/

function mostraArvore ($array_dados, $profundidade) {

//Eu queria recuperar a variável $filename aqui

foreach ($array_dados AS $nome => $tamanho) {

if (is_array($tamanho)) {

for ($i = 0; $i < $profundidade - 1; $i++) {

echo "<span class='espaco'> </span>";

}

De modo a trabalhar com ela e o $nome correspondende a ela aqui

echo "<span class='principal'><a href='" . $nome . "'>" . $filename . "</a></span><br />";

echo "\n";

$profundidade++;

ArvoreDiretorios::mostraArvore($tamanho, $profundidade);

$profundidade--;

}

}

}

}

----------------------------------------------------------------------------------------------------------------

Se alguém puder me ajudar eu ficaria muito grato.

Obrigado desde já. :)

Share this post


Link to post
Share on other sites

11 answers to this question

Recommended Posts

  • 0

Bom Paulo...

Eu acho que o seu problema está na declaração da variável..

Tipo, quando você 'cria' a variável $filename, você a cria dentro da função lerDiretorio();...

Pelo que eu andei vendo.. a maioria das variaveis são criadas como "local"...

Pra você poder usar a $filename, fora da função que você a criou, você deve definí-la como global!

Para saber mais sobre isso: Escopo de Variaveis - Manual do PHP

Espero que ajude...

Se não for isso.. alguém ai me corrija.. =P

Mas acho que deve ser isso...

Abraço!

Share this post


Link to post
Share on other sites
  • 0

antes de entrar numa função, mas DENTRO da classe, tpo

class x

{

...

coloke

var $filename;

para SALVAR o valor em $filename coloke assim

$this->filename = "Valor";

para ABRIR/RECUPERAR o valor

$x = $this->filename;

Flws!

Espero ter ajudado!

Share this post


Link to post
Share on other sites
  • 0

Valeu essa dica do DIRECTORY_SEPARATOR mas o pessoal não entendeu muito bem o que eu estou querendo.

Aquela variável $filename que eu quero está num LOOP então na verdade ela tem vários valores. O que eu queria era colocá-la no array(da mesma forma que $nome ) para poder recuperar seus valores na segunda função, para aí poder usar $filename com seu $nome correspondente.

Será que alguém consegue me ajudar. :unsure:

Share this post


Link to post
Share on other sites
  • 0

Uhnn... sakei agora

faz assim

dentro da classe

var $index;

var $filename;

var $name;

dentro da função

$this->index++;

$filename[$this->index] = "x";

$name[$this->index] = "y";

Acho que isso resolve

FLWS! Espero ajudar

Share this post


Link to post
Share on other sites
  • 0

Resolveu não cara.

Testei colocando no inicio de cada função pra ir testando ma snão pegou de nehum jeito.

EM qual função e em qual lugar você diz que é pra colocar esse código aí?

Share this post


Link to post
Share on other sites
  • 0

class ArvoreDiretorios
{
 var $index;
 var $filename;
 var $name;

 function executa($diretorio)
 {
  $array_dados = ArvoreDiretorios::lerDiretorio($diretorio);
  ArvoreDiretorios::mostraArvore($array_dados, 0);
 }

 function lerDiretorio($nome)
 {
  $retorno = array();
  $this->index++;

  if(isset($nome))
  {
   $handle = @opendir($nome);
   if(!$handle)
   {
    return "Não foi possível abrir o diretório";
   }

   $tamanho = 0;
   while($this->filename[$this->index] = readdir($handle))
   {
    if($this->filename[$this->index] != "." && $this->filename[$this->index] != ".." && is_dir($this->name[$this->index].BARRA.$this->filename[$this->index]) && $this->filename[$this->index] != "peqs")
    {
     $temp = ArvoreDiretorios::lerDiretorio($this->name[$this->index].BARRA.$this->filename[$this->index]);
     if(is_array($temp))
     {
      if(!isset($retorno[$this->name[$this->index]]) or !is_array($retorno[$this->name[$this->index]]))
      {
       $retorno[$this->name[$this->index]] = array();
      }
      $retorno[$this->name[$this->index]] = array_merge($retorno[$this->name[$this->index]], $temp);
     }
     else
     {
      $tamanho += $temp;
     }
    }
   }
   closedir($handle);

   if(!isset($retorno[$this->name[$this->index]]) or !is_array($retorno[$this->name[$this->index]]))
   {
    $retorno[$this->name[$this->index]] = array();
   }
   array_push($retorno[$this->name[$this->index]], number_format($tamanho, 2, ".", ","));
   return $retorno;
  }
  else
  {
   return "Erro. Não foi possível varrer o(s) diretório(s).";
  }
 }

 function mostraArvore($array_dados, $profundidade)
 {
  foreach($array_dados AS $this->name[$this->index] => $tamanho)
  {
   if(is_array($tamanho))
   {
    for($i = 0; $i < $profundidade - 1; $i++)
    {
     echo "<span class='espaco'> </span>";
    }
    echo "<span class='principal'><a href='" . $this->name[$this->index] . "'>" . $this->filename[$this->index] . "</a></span><br />\n";
    $profundidade++;
    ArvoreDiretorios::mostraArvore($tamanho, $profundidade);
    $profundidade--;
   }
  }
 }
}

tente copíar todo este código e colar lá.

FLWS! Espero ajudar

Ahh... c n der certo, tente explicar como vai funcionar esta função, talvez eu possa Refazer ela de forma funcional.

FLWS!

Share this post


Link to post
Share on other sites
  • 0

valeu cara mas não funcionou não. :unsure:

Eu começei uma função do zero (esse outra aí de cima é adaptada da classe de outro cara) mas o problema é que aminha só lê os diretórios dentro do diretório especificado ma snão lê os diretórios dentro desses diretórios e todos os filhos dos diretórios filhos e etc...

Eu quero uma árvore de todos os diretórios que existem dentro de um diretório a ser especificado e aí ele retorna todos os diretórios com o seu nome, o seu caminho(em relação ao diretório especificado para leitura) e sua profundidade(também relativa ao diretório especificado para leitura).

Eu não estou em casa agora, mas quando eu chegar eu posto a função que comecei aqui pra ver se me ajudas a colocar ela pra funcionar como eu quero. B)

Cara valeu pela ajuda. :)

Share this post


Link to post
Share on other sites
  • 0

Uhn... essa função é muuuuuuito difícil de fazer, porque você usa Arrays Polidimensionais (Não sei c é o nome correto) Tpo.

$file[0]['name'] = "./"

$file[0]['type'] = "folder";

$file[0]['size'] = 0;

$file[1]['name'] = "./imagens/"

$file[1]['type'] = "folder";

$file[1]['size'] = 0;

$file[2]['name'] = "./index.php"

$file[2]['type'] = "file";

$file[2]['size'] = 5412;

Dai ele detecta as pastas dos que são type=folder

$file[1][0]['name'] = "./imagens/"

$file[1][0]['type'] = "folder";

$file[1][0]['size'] = 0;

$file[1][1]['name'] = "./imagens/background.gif"

$file[1][1]['type'] = "file";

$file[1][1]['size'] = 744;

Sako? Essa seria a lógica, mas é bastante complicada de fazer, porque se ele varrer o mesmo diretório, isso pode travar o Apache até que xege ao max_execution_time e de erro no Script.

Mas cara... eu vo tenta fazer isso pra você, c eu consegui te retorno o código.

FLWS!

Share this post


Link to post
Share on other sites
  • 0

Fala cara. Consegui!!!!!!!!!!!!!!! :D

Fiz uma classe do jeito que eu queria, com todas as funções inclusive nivel do diretório. :P

Eu fiz com base na função que eu disse que tinha começado.

Achei que ficou ótima a classe, só 3 funções, inclusive tem construtor pra com apenas 1 linha de código já rodar a classe.

E o mais importante pra mim: foi do meu esforço, não desisti, fui atrás, consegui. :rolleyes:

Lá vai ela:

<?php

/*
    +------------------------------------------+
    |  Sistema que monta árvore de diretórios  |
    +--                                      --+
    |  Sistema desenvolvido em: PHP            |
    +------------------------------------------+
    |  @access        restrict
    |
    |  @author        Paulo Afonso Alcântara
    |
    |  @contact        [email protected]
    |
    |  @package        WIMAJAX!
    |
    |  @version        0.1.0.0
    |
    |  @released    02.08.2006
    |
    +------------------------------------------+
    |
    | -> Esta classe é de uso livre, mas deve-se manter os créditos do autor(estão logo acima)
    | e deixar versões baseadas/derivadas desta para uso livre.
    |
    | -> Ainda não testada em PHP 5x. Se você é um usuário autorizado e quizer testar no PHP 5x,
    | por favor me informe como este sistema se sai nesta nova versão do PHP.
    |
    | -> Se você leu até aqui, obrigado.  :)
    |
    +------------------------------------------+
*/

/*
    +-- Este arquivo: --+
    |
    | @name        ArvorePastas_class3.inc.class.php
    |
    | -> Este arquivo contém uma classe que cria uma árvore de diretórios.
    |
    +-------------------+
*/

$grupo_de_diretorios = "galerias";

if ( isset($_GET['gru']) and $_GET['gru'] != "" ) {

    $grupo_de_diretorios = $_GET['gru'];

}

// ********** COMEÇO DA CLASSE "ArvorePastas" **********
class ArvorePastas{

    function ArvorePastas($diretorio="",$nivel=-1) {
        $this->diretorio = $diretorio;
        $this->nivel = $nivel;
        $this->barra = DIRECTORY_SEPARATOR;
        if ( !empty($this->diretorio) ) {
            $this->LerPasta($diretorio,$nivel);
        } else {
            return false;
        }
    }

    function LerPasta($nome_dir,$nivel) {

        if ( isset($nome_dir) ) {
            // O Diretorio especificado é aberto com extensão DIR do php
            $grupo = dir($nome_dir) or die("Erro: Diretório solicitado inexistente!");

            // Inicia um contador/iterador em zero(que é o número padrão inicial em arrays no php)
            $i_g = 1;
        
            $lista_grupo = Array();
            while (false !== ($grupo_file = $grupo->read())) {
                if( $grupo_file != "." and $grupo_file != ".." and is_dir($nome_dir . $this->barra . $grupo_file) ) {
                    $lista_grupo['abs'][$i_g] = $nome_dir . $this->barra . $grupo_file;
                    $lista_grupo['rel'][$i_g] = $grupo_file;
                    $lista_grupo['niv'][$i_g] = $nivel + 1;
                    $i_g++;
                }
            }
            $grupo->close();
        
            if ( isset($lista_grupo['rel']) and isset($lista_grupo['abs']) and is_array($lista_grupo['abs']) and count($lista_grupo['abs']) >= 1 ) {
                $this->ExibePasta($lista_grupo['abs'],$lista_grupo['rel'],$lista_grupo['niv']);
                return $lista_grupo;
            } else {
                return "Erro na leitura dos dados.";
            }
        
        } else {
            return "Erro na leitura dos dados.";
        }

    }

    function ExibePasta($caminho_dir=0, $nome_dir=0, $nivel_dir=0) {

        if ( is_array($caminho_dir) and is_array($nome_dir) and is_array($nivel_dir) and count($caminho_dir) >= 1 ) {
            $i_gb = 1;
            while ($i_gb <= count($caminho_dir)) {
                echo "Nível do diretório: " . $nivel_dir[$i_gb] . " ";
                for ($i=$nivel_dir[$i_gb]; $i > 0; $i--) {
                    echo "_";
                }
                echo '<a href="' . $caminho_dir[$i_gb] . '" title="' . $caminho_dir[$i_gb] . '">' . $nome_dir[$i_gb] . '</a>';
                echo "<br />";
                $this->LerPasta($caminho_dir[$i_gb],$nivel_dir[$i_gb]);
                $i_gb++;
            }
            unset($i_gb);
            return "Sucesso na realização.";
        } else {
            return "Erro na leitura dos dados.";
        }

    }

}
// ********** TÉMINO DA CLASSE "ArvorePastas" **********

echo "<strong>Grupo de diretórios(diretório pai): " . $grupo_de_diretorios . "</strong><br />";

$arvoreteste = new ArvorePastas($grupo_de_diretorios);

?>

É só salvar o código numa página com algum nome e extensão *.php e rodar.

Ah, passem o nome do diretório a ser lido via get. O nome da variável é "gru"(sem aspas).

Valeu a todo o pessoal, e principalmente ao David. Valeu.

:D

- Edit -----------------------------------------------------------------------------------------------

Modificação na função EXIBEPASTA: a linha onde havia echo $caminho_dir[$i_gb]; foi substituída por

echo '<a href="' . $caminho_dir[$i_gb] . '" title="' . $caminho_dir[$i_gb] . '">' . $nome_dir[$i_gb] . '</a>';

Valeu.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this