Ir para conteúdo
Fórum Script Brasil
  • 0

Classe Php


paulo_aa

Pergunta

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. <sgj@dr.com>

*/

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á. :)

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 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!

Link para o comentário
Compartilhar em outros 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!

Link para o comentário
Compartilhar em outros 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:

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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!

Link para o comentário
Compartilhar em outros 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. :)

Link para o comentário
Compartilhar em outros 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!

Link para o comentário
Compartilhar em outros 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        pauloafonsowd@hotmail.com
    |
    |  @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.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...